Saya sedang membuat login php, dan saya mencoba memutuskan apakah akan menggunakan SHA1 atau Md5, atau SHA256 yang saya baca di artikel stackoverflow lain. Apakah ada di antara mereka yang lebih aman daripada yang lain? Untuk SHA1 / 256, apakah saya masih menggunakan garam?
Juga, apakah ini cara aman untuk menyimpan kata sandi sebagai hash di mysql?
function createSalt()
{
$string = md5(uniqid(rand(), true));
return substr($string, 0, 3);
}
$salt = createSalt();
$hash = sha1($salt . $hash);
Jawaban:
Tidak juga. Anda harus menggunakan
bcrypt
. Hash yang Anda sebutkan semuanya dioptimalkan agar cepat dan mudah pada perangkat keras, sehingga meretasnya memiliki kualitas yang sama. Jika Anda tidak punya pilihan lain, setidaknya pastikan untuk menggunakan garam panjang dan hash berulang kali.Menggunakan bcrypt di PHP 5.5+
PHP 5.5 menawarkan fungsi-fungsi baru untuk hashing kata sandi . Ini adalah pendekatan yang disarankan untuk penyimpanan kata sandi dalam aplikasi web modern.
Jika Anda menggunakan versi PHP yang lebih lama, Anda benar-benar harus meningkatkan , tetapi sampai Anda melakukannya, Anda dapat menggunakan kata sandi_compat untuk mengekspos API ini.
Juga, tolong biarkan
password_hash()
menghasilkan garam untuk Anda. Ini menggunakan CSPRNG .Dua peringatan bcrypt
NUL
karakter apa pun .( Bukti Konsep untuk kedua peringatan di sini.)
Anda mungkin tergoda untuk menyelesaikan peringatan pertama dengan pra-hashing kata sandi Anda sebelum menjalankannya melalui bcrypt , tetapi hal itu dapat menyebabkan aplikasi Anda menjalankan headfirst ke yang kedua.
Alih-alih menulis skema Anda sendiri, gunakan perpustakaan yang ada yang ditulis dan / atau dievaluasi oleh pakar keamanan.
Zend\Crypt
(bagian dari Zend Framework) menawarkanBcryptSha
PasswordLock
mirip denganBcryptSha
tetapi juga mengenkripsi hash bcrypt dengan perpustakaan enkripsi yang diautentikasi .TL; DR - Gunakan bcrypt .
sumber
bcrypt
dirancang untuk lambat demi lambat untuk di-crack.Saya pikir menggunakan md5 atau sha256 atau hash yang dioptimalkan untuk kecepatan baik-baik saja dan saya sangat ingin mendengar bantahan yang mungkin dimiliki pengguna lain. Inilah alasan saya
Jika Anda mengizinkan pengguna untuk menggunakan kata sandi yang lemah seperti Tuhan, cinta, perang, kedamaian maka tidak masalah enkripsi Anda masih akan memungkinkan pengguna untuk mengetikkan kata sandi bukan hash dan kata sandi ini sering digunakan terlebih dahulu, jadi ini TIDAK akan terjadi ada hubungannya dengan enkripsi.
Jika Anda tidak menggunakan SSL atau tidak memiliki sertifikat maka penyerang yang mendengarkan lalu lintas akan dapat menarik kata sandi dan segala upaya mengenkripsi dengan javascript atau sejenisnya adalah sisi klien dan mudah retak dan diatasi. Sekali lagi ini TIDAK akan ada hubungannya dengan enkripsi data di sisi server.
Serangan brute force akan mengambil keuntungan dari kata sandi yang lemah dan sekali lagi karena Anda mengizinkan pengguna untuk memasukkan data jika Anda tidak memiliki batasan login 3 atau bahkan lebih dari itu masalahnya lagi TIDAK akan ada hubungannya dengan enkripsi data.
Jika database Anda dikompromikan maka kemungkinan besar semuanya telah dikompromikan termasuk teknik hashing Anda tidak peduli seberapa samar Anda telah membuatnya. Sekali lagi ini bisa berupa serangan XSS karyawan yang tidak puas atau injeksi sql atau serangan lain yang tidak ada hubungannya dengan enkripsi kata sandi Anda.
Saya percaya Anda harus tetap mengenkripsi, tetapi satu-satunya hal yang dapat saya lihat enkripsi lakukan adalah mencegah orang yang sudah atau entah bagaimana memperoleh akses ke database dari hanya membacakan kata sandi dengan keras. Jika itu adalah seseorang yang tidak sah pada database maka Anda memiliki masalah yang lebih besar untuk dikhawatirkan karena itulah Sony mengambilnya karena mereka pikir kata sandi yang dienkripsi melindungi semuanya termasuk nomor kartu kredit yang dilakukannya hanyalah melindungi satu bidang itu saja.
Satu-satunya manfaat murni yang dapat saya lihat untuk enkripsi kata sandi yang kompleks dalam sebuah database adalah untuk menunda karyawan atau orang lain yang memiliki akses ke database hanya dengan membacakan kata sandi. Jadi jika itu adalah proyek kecil atau sesuatu yang saya tidak akan terlalu khawatir tentang keamanan di sisi server, bukannya saya akan lebih khawatir tentang mengamankan apa pun yang mungkin dikirim oleh klien ke server seperti injeksi sql, serangan XSS atau kebanyakan cara lain yang Anda gunakan. dapat dikompromikan. Jika seseorang tidak setuju saya berharap untuk membaca cara bahwa kata sandi super terenkripsi adalah suatu keharusan dari sisi klien.
Alasan saya ingin mencoba dan memperjelas ini adalah karena terlalu sering orang mempercayai kata sandi terenkripsi berarti mereka tidak perlu khawatir akan dikompromikan dan mereka berhenti khawatir tentang pengamanan situs web.
sumber
Seperti yang ditunjukkan oleh Johannes Gorset, posting oleh Thomas Ptacek dari Matasano Security menjelaskan mengapa fungsi hashing sederhana dan bertujuan umum seperti MD5, SHA1, SHA256 dan SHA512 adalah pilihan hashing password yang buruk .
Mengapa? Mereka terlalu cepat - Anda dapat menghitung setidaknya 1.000.000 MD5 hash per detik per inti dengan komputer modern, sehingga brute force layak terhadap sebagian besar kata sandi yang digunakan orang. Dan itu jauh lebih sedikit daripada cluster server cracking berbasis GPU!
Pengasinan tanpa peregangan kunci hanya berarti Anda tidak dapat melakukan precompute pada tabel pelangi, Anda harus membuatnya ad hoc untuk garam spesifik tersebut. Tetapi itu tidak akan benar-benar membuat segalanya menjadi lebih sulit.
User @Will akan mengatakan:
Mereka tidak perlu melakukannya. Rupanya, dalam kasus LinkedIn mereka menggunakan common kerentanan injeksi SQL untuk mendapatkan tabel DB login dan memecahkan jutaan kata sandi secara offline.
Kemudian dia kembali ke skenario serangan offline:
Tidak, SHA512 tidak 10.000 kali lebih lambat dari MD5 - hanya dibutuhkan sekitar dua kali lipat. Crypt / SHA512 , di sisi lain, adalah binatang yang sangat berbeda yang, seperti rekan BCrypt, melakukan peregangan kunci , menghasilkan hash yang sangat berbeda dengan built-in garam acak dan akan memakan waktu antara 500 dan 999999 kali lebih banyak untuk dihitung (Peregangan merdu).
Jadi pilihan untuk PHP adalah Crypt / Blowfish (BCrypt), Crypt / SHA256 atau Crypt / SHA512. Atau setidaknya Crypt / MD5 (PHK). Lihat www.php.net/manual/en/function.crypt.php
sumber
password_hash()
menunjukkan biaya dalam hash itu sendiri.Gunakan
SHA256
. Ini tidak sempurna, seperti yangSHA512
ideal untuk hash cepat, tetapi di luar opsi, itu pilihan yang pasti. Sesuai teknologi hashing apa pun, pastikan untuk memberi garam hash untuk keamanan tambahan.Sebagai catatan tambahan, FRKT, tolong tunjukkan di mana seseorang dapat dengan mudah memecahkan hash SHA256 asin? Saya benar-benar sangat tertarik melihat ini.
Edit Penting:
Bergerak maju, silakan gunakan
bcrypt
sebagai hash yang dikeraskan. Informasi lebih lanjut dapat ditemukan di sini .Edit pada Penggaraman:
Gunakan angka acak, atau aliran byte acak, dll. Anda dapat menggunakan bidang unik catatan di basis data Anda sebagai garam juga, dengan cara ini garam berbeda untuk setiap pengguna.
sumber
Apa yang tampaknya hilang adalah bahwa jika peretas memiliki akses ke basis data, ia mungkin juga memiliki akses ke file php yang hash kata sandinya dan kemungkinan besar hanya bisa memodifikasi itu untuk mengirimnya semua kombo kata sandi nama pengguna yang berhasil. Jika dia tidak memiliki akses ke direktori web, dia selalu bisa memilih kata sandi hash, dan menuliskannya ke dalam basis data. Dengan kata lain algoritma hash tidak terlalu penting seperti keamanan sistem, dan membatasi upaya login juga jika Anda tidak menggunakan SSL maka penyerang hanya dapat mendengarkan pada koneksi untuk mendapatkan informasi. Kecuali Anda membutuhkan algoritma untuk mengambil waktu lama untuk menghitung (untuk keperluan Anda sendiri) maka SHA-256 atau SHA-512 dengan garam khusus pengguna harus cukup.
Sebagai langkah keamanan tambahan, buat skrip (bash, batch, python, dll) atau program dan berikan nama yang tidak jelas dan periksalah dan lihat apakah login.php telah berubah (periksa tanggal / cap waktu) dan kirimi Anda email jika sudah. Mungkin juga harus mencatat semua upaya saat masuk dengan hak admin dan mencatat semua upaya yang gagal untuk masuk ke database dan membuat log diemail kepada Anda.
sumber
Semua orang membicarakan ini seperti mereka dapat diretas melalui internet. Seperti yang telah dinyatakan, upaya membatasi tidak memungkinkan untuk memecahkan kata sandi melalui Internet dan tidak ada hubungannya dengan hash.
Garam adalah suatu keharusan, tetapi kompleksitas atau banyak garam bahkan tidak masalah. Garam apa saja menghentikan penyerang dari menggunakan meja pelangi premade. Garam unik per pengguna menghentikan penyerang dari membuat tabel pelangi baru untuk digunakan terhadap seluruh basis pengguna Anda.
Keamanan benar-benar berperan ketika seluruh basis data dikompromikan dan seorang peretas kemudian dapat melakukan 100 juta upaya kata sandi per detik terhadap hash md5. SHA512 sekitar 10.000 kali lebih lambat. Kata sandi yang kompleks dengan kekuatan saat ini masih bisa memakan waktu 100 tahun untuk bruteforce dengan md5 dan akan memakan waktu 10.000 kali lebih lama dengan SHA512. Garam tidak menghentikan bruteforce sama sekali karena mereka selalu harus diketahui, yang jika penyerang mengunduh database Anda, ia mungkin ada di sistem Anda.
sumber
MD5 buruk karena masalah tabrakan - dua kata sandi yang berbeda mungkin menghasilkan md-5 yang sama.
Sha-1 akan jauh lebih aman untuk ini. Alasan Anda menyimpan versi kata sandi sha-1 asin ini adalah agar Anda yang swerver tidak menyimpan kata sandi pengguna pada file, yang mungkin mereka gunakan dengan server orang lain. Kalau tidak, apa bedanya?
Jika peretas mencuri seluruh basis data Anda yang tidak dienkripsi, satu-satunya hal yang dilakukan oleh kata sandi asin hash adalah mencegahnya menyamar sebagai pengguna untuk masa depan - peretas sudah memiliki data.
Apa gunanya penyerang memiliki nilai hash, jika apa yang dimasukkan pengguna adalah kata sandi biasa?
Dan bahkan jika peretas dengan teknologi masa depan dapat menghasilkan sejuta sha-1 kunci per detik untuk serangan brute force, akankah server Anda menangani sejuta log masuk per detik bagi peretas untuk menguji kuncinya? Itu jika Anda membiarkan peretas mencoba masuk dengan sha-1 asin alih-alih kata sandi seperti masuk biasa.
Taruhan terbaik adalah untuk membatasi upaya masuk yang buruk ke beberapa nomor yang masuk akal - 25 misalnya, dan kemudian waktu pengguna keluar selama satu atau dua menit. Dan jika upaya bady logon kumulatif mencapai 250 dalam 24 jam, tutup akses akun dan kirim email ke pemiliknya.
sumber
Berikut ini adalah perbandingan antara MD5 dan SHA1. Anda bisa mendapatkan ide yang jelas tentang mana yang lebih baik.
sumber
Gunakan argon2i . The argon2 fungsi password hashing telah memenangkan Password Hashing Kompetisi.
Pilihan wajar lainnya, jika menggunakan argon2 tidak tersedia, adalah scrypt , bcrypt dan PBKDF2 . Wikipedia memiliki halaman untuk fungsi-fungsi ini:
MD5, SHA1 dan SHA256 adalah intisari pesan, bukan fungsi kata sandi. Mereka tidak cocok untuk tujuan ini.
Beralih dari MD5 ke SHA1 atau SHA512 tidak akan banyak meningkatkan keamanan konstruksi. Menghitung hash SHA256 atau SHA512 sangat cepat. Penyerang dengan perangkat keras biasa masih bisa mencoba puluhan juta (dengan satu CPU) atau bahkan milyaran (dengan GPU tunggal) hash per detik.Fungsi hashing kata sandi yang baik termasuk faktor kerja untuk memperlambat serangan kamus.
Berikut ini adalah saran untuk pemrogram PHP: baca FAQ PHP lalu gunakan password_hash () .
sumber
Mari kita asumsikan poin berikutnya: para peretas mencuri basis data kami termasuk para pengguna dan kata sandi (terenkripsi). Dan para peretas membuat akun palsu dengan kata sandi yang mereka tahu.
MD5 lemah karena pendek dan populer dan hampir setiap generasi hash tanpa kata sandi lemah dari serangan kamus. Tapi..
Jadi, katakanlah kita masih menggunakan MD5 dengan SALT. Peretas tidak tahu SALT tetapi mereka tahu kata sandi pengguna tertentu. Sehingga mereka dapat menguji: ????? 12345 di mana 12345 adalah kata sandi yang diketahui dan ????? adalah garam. Peretas cepat atau lambat bisa menebak SALT.
Namun, jika kami menggunakan MD5 + SALT dan kami menerapkan MD5, maka tidak ada cara untuk memulihkan informasi. Namun, saya ulangi, MD5 masih pendek.
Sebagai contoh, katakanlah kata sandi saya adalah: 12345. SALT adalah BILLCLINTON
md5: 827ccb0eea8a706c4c34a16891f84e7b
md5 dengan hash: 56adb0f19ac0fb50194c312d49b15378
mD5 dengan hash di atas md5: 28a03c0bc950decdd9ee362907d1798a Saya mencoba menggunakan layanan online itu dan saya tidak menemukan satu pun yang dapat memecahkannya. Dan itu hanya MD5! (mungkin seperti hari ini akan menjadi crackeable karena saya membuat md5 online)
Jika Anda ingin berlebihan maka SHA256 lebih dari cukup jika diterapkan dengan garam dan dua kali.
tldr MD5 (HASH + MD5 (kata sandi)) = ok tapi pendek, SHA256 lebih dari cukup.
sumber
Enkripsi md5 adalah salah satu yang terburuk, karena Anda harus mengubah kodenya dan sudah mendekripsi. Saya akan merekomendasikan Anda SHA256. Saya pemrograman sedikit lebih lama dan memiliki pengalaman yang baik. Di bawah ini juga akan menjadi enkripsi.
sumber