Seberapa jauh ini lebih aman daripada MD5 biasa ? Saya baru saja mulai mencari keamanan kata sandi. Saya cukup baru di PHP.
$salt = 'csdnfgksdgojnmfnb';
$password = md5($salt.$_POST['password']);
$result = mysql_query("SELECT id FROM users
WHERE username = '".mysql_real_escape_string($_POST['username'])."'
AND password = '$password'");
if (mysql_num_rows($result) < 1) {
/* Access denied */
echo "The username or password you entered is incorrect.";
}
else {
$_SESSION['id'] = mysql_result($result, 0, 'id');
#header("Location: ./");
echo "Hello $_SESSION[id]!";
}
Jawaban:
Cara termudah untuk mengamankan skema penyimpanan kata sandi Anda adalah dengan menggunakan perpustakaan standar .
Karena keamanan cenderung menjadi jauh lebih rumit dan dengan lebih banyak kemungkinan yang tidak terlihat yang dapat dihadapi oleh sebagian besar programmer sendiri, menggunakan perpustakaan standar hampir selalu termudah dan paling aman (jika bukan satu-satunya) pilihan yang tersedia.
API kata sandi PHP baru (5.5.0+)
Jika Anda menggunakan PHP versi 5.5.0 atau lebih baru, Anda dapat menggunakan API hashing kata sandi baru yang disederhanakan
Contoh kode menggunakan API kata sandi PHP:
(Jika Anda masih menggunakan legacy 5.3.7 atau yang lebih baru, Anda dapat menginstal ircmaxell / password_compat untuk memiliki akses ke fungsi-fungsi bawaan )
Memperbaiki hash asin: tambahkan lada
Jika Anda menginginkan keamanan tambahan, petugas keamanan sekarang (2017) merekomendasikan menambahkan ' lada ' ke hash kata sandi asin (otomatis).
Ada penurunan sederhana di kelas yang mengimplementasikan pola ini dengan aman, saya sarankan: Netsilik / PepperedPasswords ( github ).
Muncul dengan Lisensi MIT, sehingga Anda dapat menggunakannya sesuka Anda, bahkan dalam proyek berpemilik.
Contoh kode menggunakan
Netsilik/PepperedPasswords
:Perpustakaan standar LAMA
Lihatlah: Kerangka kerja hashing kata sandi PHP portabel : phpass dan pastikan Anda menggunakan
CRYPT_BLOWFISH
algoritma jika memungkinkan.Contoh kode menggunakan phpass (v0.2):
PHPass telah diimplementasikan dalam beberapa proyek yang cukup terkenal:
Hal yang baik adalah Anda tidak perlu khawatir tentang perinciannya, perincian itu telah diprogram oleh orang-orang yang berpengalaman dan ditinjau oleh banyak orang di internet.
Untuk informasi lebih lanjut tentang skema penyimpanan kata sandi, baca posting blog Jeff : Anda Mungkin Menyimpan Kata Sandi Secara Tidak Benar
Apa pun yang Anda lakukan jika Anda menggunakan pendekatan ' Saya akan melakukannya sendiri, terima kasih ', jangan gunakan
MD5
atauSHA1
lagi . Mereka adalah algoritma hashing yang bagus, tetapi dianggap rusak untuk tujuan keamanan .Saat ini, menggunakan crypt , dengan CRYPT_BLOWFISH adalah praktik terbaik.
CRYPT_BLOWFISH dalam PHP adalah implementasi hash Bcrypt. Bcrypt didasarkan pada cipher blok Blowfish, menggunakan setup kunci yang mahal untuk memperlambat algoritma.
sumber
Pengguna Anda akan jauh lebih aman jika Anda menggunakan kueri yang diparameterisasi daripada menggabungkan pernyataan SQL. Dan garam harus unik untuk setiap pengguna dan harus disimpan bersama dengan hash kata sandi.
sumber
Cara yang lebih baik bagi setiap pengguna untuk memiliki garam yang unik.
Manfaat memiliki garam adalah membuat penyerang kesulitan membuat tanda tangan MD5 dari setiap kata kamus. Tetapi jika seorang penyerang mengetahui bahwa Anda memiliki garam yang tetap, mereka kemudian dapat membuat sebelumnya tanda tangan MD5 dari setiap kata kamus yang diawali oleh garam tetap Anda.
Cara yang lebih baik adalah setiap kali pengguna mengubah kata sandi mereka, sistem Anda menghasilkan garam acak dan menyimpan garam itu bersama dengan catatan pengguna. Itu membuat sedikit lebih mahal untuk memeriksa kata sandi (karena Anda perlu mencari garam sebelum Anda dapat menghasilkan tanda tangan MD5) tetapi itu membuat jauh lebih sulit bagi penyerang untuk membuat pra-menghasilkan MD5.
sumber
crypt()
fungsi). Dan karena Anda harus mengambil hash kata sandi, menggunakan garam khusus pengguna tidak akan membuat prosedur lebih mahal. (Atau maksud Anda menghasilkan garam acak baru itu mahal? Saya tidak berpikir begitu.) Kalau tidak +1.Dengan PHP 5.5 (apa yang saya jelaskan tersedia untuk versi yang bahkan lebih awal, lihat di bawah) di sudut saya ingin menyarankan untuk menggunakan solusi bawaan yang baru:
password_hash()
andpassword_verify()
. Ini memberikan beberapa opsi untuk mencapai tingkat keamanan kata sandi yang Anda butuhkan (misalnya dengan menentukan parameter "biaya" melalui$options
array)akan kembali
Seperti yang mungkin Anda lihat, string berisi garam serta biaya yang ditentukan dalam opsi. Ini juga berisi algoritma yang digunakan.
Karena itu, ketika memeriksa kata sandi (misalnya saat pengguna masuk), saat menggunakan pelengkap
password_verify()
fungsi itu akan mengekstrak parameter kripto yang diperlukan dari hash kata sandi itu sendiri.Ketika tidak menentukan garam, hash kata sandi yang dihasilkan akan berbeda pada setiap panggilan
password_hash()
karena garam dihasilkan secara acak. Karenanya, membandingkan hash sebelumnya dengan hash yang baru dibuat akan gagal, bahkan untuk kata sandi yang benar.Memverifikasi karya seperti ini:
Saya berharap bahwa menyediakan fungsi-fungsi bawaan ini akan segera memberikan keamanan kata sandi yang lebih baik jika terjadi pencurian data, karena ini mengurangi jumlah pemikiran yang harus diprogram oleh programmer.
Ada perpustakaan kecil (satu file PHP) yang akan memberi Anda PHP 5.5
password_hash
di PHP 5.3.7+: https://github.com/ircmaxell/password_compatsumber
password_hash()
danpassword_verify
tidak peduli apa kata sandi (benar atau tidak) saya menggunakan saya berakhir dengan kata sandi yang benarTidak masalah dengan saya. Mr Atwood menulis tentang kekuatan MD5 terhadap tabel pelangi , dan pada dasarnya dengan garam panjang seperti itu Anda duduk cantik (meskipun beberapa tanda baca / angka acak, itu bisa memperbaikinya).
Anda juga dapat melihat SHA-1, yang tampaknya semakin populer akhir-akhir ini.
sumber
Saya ingin menambahkan:
Untuk kompatibilitas dengan sistem lama sering menetapkan batas untuk panjang maksimum kata sandi. Ini adalah kebijakan keamanan yang buruk: jika Anda menetapkan batasan, atur hanya untuk panjang minimum kata sandi.
Untuk memulihkan kata sandi yang terlupakan Anda harus mengirim alamat yang dengannya pengguna dapat mengubah kata sandi.
Kata sandi hash mungkin ketinggalan zaman (parameter algoritma dapat diperbarui). Dengan menggunakan fungsi ini
password_needs_rehash()
Anda dapat memeriksanya.sumber