Pertanyaan SHA1 vs md5 vs SHA256: mana yang digunakan untuk login PHP?


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 yang lebih aman dari 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);

128
2018-02-10 07:41


asal


Jawaban:


Bukan keduanya. Kamu harus menggunakan bcrypt. Semua hash yang Anda sebutkan semuanya dioptimalkan agar cepat dan mudah di perangkat keras, sehingga memecahkannya memiliki kualitas yang sama. Jika Anda tidak punya pilihan lain, setidaknya pastikan untuk menggunakan garam panjang dan re-hash beberapa kali.

Menggunakan bcrypt di PHP 5.5+

PHP 5.5 menawarkan fungsi baru untuk hashing kata sandi. Ini adalah pendekatan rekomendasi untuk penyimpanan kata sandi dalam aplikasi web modern.

// Creating a hash
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// If you omit the ['cost' => 12] part, it will default to 10

// Verifying the password against the stored hash  
if (password_verify($password, $hash)) {
    // Success! Log the user in here.
}

Jika Anda menggunakan versi PHP yang lebih lama Anda benar-benar harus meningkatkan, tetapi sampai Anda bisa menggunakannya password_compat untuk mengekspos API ini.

Juga, tolong biarkan password_hash() menghasilkan garam untukmu. Ia menggunakan [CSPRNG] (http: //

Dua peringatan bcrypt

  1. Bcrypt akan secara diam-diam memotong kata sandi lebih panjang dari 72 karakter.
  2. Bcrypt akan terpotong setelahnya NUL karakter.

(Bukti dari konsep untuk kedua peringatan di sini.)

Anda mungkin tergoda untuk menyelesaikan peringatan pertama pra-hashing password Anda sebelum menjalankannya melalui bcrypt, tetapi hal ini dapat menyebabkan aplikasi Anda untuk masuk lebih dulu ke yang kedua.

Alih-alih menulis skema Anda sendiri, gunakan perpustakaan yang sudah ada yang ditulis dan / atau dievaluasi oleh pakar keamanan.

TL; DR - Gunakan bcrypt.


103
2018-02-10 07:48



Saya pikir menggunakan md5 atau sha256 atau hash yang dioptimalkan untuk kecepatan sangat baik dan saya sangat penasaran untuk mendengar rebuttle yang mungkin dimiliki pengguna lain. Inilah alasan saya

  1. Jika Anda mengizinkan pengguna untuk menggunakan kata sandi yang lemah seperti Tuhan, cinta, perang, perdamaian maka tidak masalah enkripsi Anda masih akan memungkinkan pengguna untuk mengetikkan kata sandi bukan hash dan kata sandi ini sering digunakan terlebih dahulu, sehingga ini adalah TIDAK akan ada hubungannya dengan enkripsi.

  2. Jika Anda tidak menggunakan SSL atau tidak memiliki sertifikat, maka penyerang yang mendengarkan lalu lintas akan dapat menarik kata sandi dan upaya apa pun untuk mengenkripsi dengan javascript atau sejenisnya adalah sisi klien dan mudah dipecahkan dan diatasi. Sekali lagi ini TIDAK akan ada hubungannya dengan enkripsi data di sisi server.

  3. Serangan brute force akan memanfaatkan password yang lemah dan sekali lagi karena Anda mengizinkan pengguna untuk memasukkan data jika Anda tidak memiliki batasan login 3 atau bahkan sedikit lebih banyak maka masalah akan kembali TIDAK ada hubungannya dengan enkripsi data.

  4. Jika database Anda menjadi terganggu maka kemungkinan besar semuanya telah dikompromikan termasuk teknik hashing Anda tidak peduli seberapa samar Anda telah membuatnya. Sekali lagi ini bisa menjadi serangan XSS karyawan yang tidak puas atau injeksi sql atau beberapa serangan lain yang tidak ada hubungannya dengan enkripsi kata sandi Anda.

Saya yakin Anda harus tetap mengenkripsi, tetapi satu-satunya hal yang dapat saya lihat adalah enkripsi yang mencegah orang-orang yang sudah memiliki atau entah bagaimana memperoleh akses ke database dari hanya membacakan kata sandi. Jika seseorang yang tidak sah di database maka Anda memiliki masalah yang lebih besar untuk khawatir tentang itu mengapa Sony mengambil karena mereka pikir password terenkripsi dilindungi semuanya termasuk nomor kartu kredit semua yang dilakukannya adalah melindungi satu bidang itu.

Satu-satunya manfaat murni yang dapat saya lihat pada enkripsi kata sandi yang rumit dalam database adalah dengan 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 khawatir tentang keamanan di sisi server, saya justru khawatir tentang mengamankan apa pun yang mungkin dikirimkan klien ke server seperti injeksi sql, serangan XSS, atau berbagai cara lain yang Anda lakukan. bisa dikompromikan. Jika seseorang tidak setuju saya berharap untuk membaca cara password 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 mengkhawatirkan tentang mengamankan situs web.


23
2017-09-24 14:55



Seperti yang ditunjukkan oleh Johannes Gorset, pos oleh Thomas Ptacek dari Matasano Security menjelaskan mengapa sederhana, fungsi hashing umum seperti MD5, SHA1, SHA256 dan SHA512 adalah pilihan hashing sandi yang buruk.

Mengapa? Mereka terlalu cepat - Anda dapat menghitung setidaknya 1.000.000 MD5 pencatatan detik per inti dengan komputer modern, jadi kekuatan brute adalah layak terhadap sebagian besar kata sandi yang digunakan orang. Dan itu jauh lebih sedikit daripada server server crack berbasis GPU!

Pengasinan tanpa peregangan kunci hanya berarti bahwa Anda tidak dapat mengolah meja pelangi, Anda perlu membuatnya ad hoc untuk garam khusus itu. Tapi itu tidak akan benar-benar membuat semuanya menjadi lebih sulit.

Pengguna @Will mengatakan:

Semua orang membicarakan hal ini seperti mereka dapat diretas   Internet. Seperti telah dinyatakan, upaya membatasi membuat mustahil untuk melakukannya   crack password di Internet dan tidak ada hubungannya dengan   hash.

Mereka tidak perlu melakukannya. Ternyata, di kasus LinkedIn mereka menggunakan yang umum Kerentanan injeksi SQL untuk mendapatkan tabel login DB dan memecahkan jutaan kata sandi offline.

Lalu dia kembali ke skenario serangan offline:

Keamanan benar-benar berperan ketika seluruh basis data berada   dikompromikan dan seorang hacker kemudian dapat melakukan 100 juta kata sandi   upaya per detik terhadap hash md5. SHA512 sekitar 10.000 kali   lebih lambat.

Tidak, SHA512 tidak 10000 kali lebih lambat daripada MD5 - hanya membutuhkan waktu sekitar dua kali lipat. Crypt / SHA512, di sisi lain, adalah binatang yang sangat berbeda yang, seperti rekannya BCrypt, melakukan peregangan kunci, menghasilkan hash yang sangat berbeda dengan salt random built-in dan akan mengambil apa pun antara 500 dan 999999 kali lebih banyak untuk menghitung (peregangan adalah merdu).

SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

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


15
2017-09-08 18:33



Menggunakan SHA256. Itu tidak sempurna, seperti SHA512 akan ideal untuk hash cepat, tetapi keluar dari opsi, ini adalah pilihan yang pasti. Sesuai teknologi hashing apapun, pastikan untuk memberi garam hash untuk keamanan tambahan.

Sebagai catatan tambahan, FRKT, tolong tunjukkan saya di mana seseorang dapat dengan mudah memecahkan hash SHA256 yang diasinkan? Saya sangat tertarik untuk melihat ini.

Edit Penting:

Bergerak maju silakan gunakan bcrypt sebagai hash yang keras. Informasi lebih lanjut bisa ditemukan di sini.


Edit pada Salting:

Gunakan nomor acak, atau aliran byte acak dll. Anda dapat menggunakan bidang catatan unik dalam database Anda sebagai garam juga, dengan cara ini garam berbeda per pengguna.


12
2018-02-10 07:58



Apa yang tampaknya orang hilang adalah bahwa jika peretas memiliki akses ke basis data, ia mungkin juga memiliki akses ke file php yang mem-hash kata sandi dan mungkin hanya memodifikasi itu untuk mengirimi dia semua kombo kata sandi nama pengguna yang sukses. Jika dia tidak memiliki akses ke direktori web, dia selalu bisa memilih kata sandi hash, dan menulisnya ke dalam database. Dengan kata lain algoritma hash tidak terlalu penting seperti keamanan sistem, dan membatasi upaya login juga jika Anda tidak menggunakan SSL maka penyerang dapat mendengarkan koneksi untuk mendapatkan informasi. Kecuali Anda membutuhkan algoritma untuk mengambil waktu lama untuk menghitung (untuk keperluan Anda sendiri) kemudian SHA-256 atau SHA-512 dengan garam khusus pengguna Seharusnya cukup.

Sebagai tindakan keamanan tambahan buat skrip (bash, batch, python, dll) atau program dan beri nama yang tidak jelas dan periksa dan lihat apakah login.php telah berubah (lihat cap tanggal / waktu) dan kirim email kepada Anda jika sudah. Juga mungkin harus mencatat semua upaya masuk dengan hak admin dan mencatat semua upaya gagal untuk masuk ke dalam basis data dan mengirimkannya kepada Anda melalui email.


4
2018-01-08 20:32



Semua orang membicarakan hal ini seperti mereka dapat diretas melalui internet. Seperti yang sudah 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 penting. Garam saja berhenti 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 database dikompromikan dan seorang hacker kemudian dapat melakukan 100 juta upaya kata sandi per detik terhadap hash md5. SHA512 sekitar 10.000 kali lebih lambat. Kata sandi yang rumit dengan kekuatan hari ini masih bisa membutuhkan waktu 100 tahun untuk menjadi 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.


2
2018-06-14 13:51



MD5, SHA1 dan SHA256 adalah intisari pesan, tidak fungsi hashing kata sandi.

Saat ini, satu-satunya standar (seperti dalam sanksi oleh NIST) hashing sandi atau fungsi derivasi utama PBKDF2. Pilihan wajar lainnya, jika menggunakan standar tidak diperlukan, adalah bcrypt, yang lebih baru scrypt dan bahkan yang lebih baru argon2i. Wikipedia memiliki halaman untuk fungsi-fungsi ini:

Beralih dari MD5 ke SHA1 atau SHA512 tidak akan meningkatkan keamanan konstruksi begitu banyak. Menghitung hash SHA256 atau SHA512 sangat cepat. Seorang penyerang dengan perangkat keras umum masih bisa mencoba puluhan juta (dengan satu CPU) atau bahkan miliaran (dengan satu GPU) hash per detik. Fungsi hashing sandi yang bagus termasuk faktor kerja untuk memperlambat penyerang.

Berikut beberapa saran untuk programmer PHP: baca FAQ PHP: http://php.net/manual/en/faq.passwords.php kemudian gunakan salah satu dari ini:


2
2017-12-18 12:48



MD5 buruk karena masalah tabrakan - dua kata sandi berbeda mungkin menghasilkan md-5 yang sama.

Sha-1 akan sangat aman untuk ini. Alasan Anda menyimpan versi sandi sha-1 asin adalah agar swerver tidak menyimpan kata sandi pengguna dalam file, yang mungkin mereka gunakan dengan server orang lain. Jika tidak, apa bedanya?

Jika peretas mencuri seluruh basisdata tidak terenkripsi, bagaimana caranya, satu-satunya sandi sandi yang di-hash adalah mencegahnya meniru identitas pengguna untuk penandatangan selanjutnya - peretas sudah memiliki datanya.

Apa gunanya penyerang memiliki nilai hash, jika apa yang dimasukkan pengguna Anda adalah kata sandi biasa?

Dan bahkan jika peretas dengan teknologi masa depan bisa menghasilkan sejuta tombol sha-1 per detik untuk serangan brute force, akankah server Anda menangani jutaan log per detik bagi peretas untuk menguji kunci? Itu jika Anda membiarkan peretas mencoba masuk dengan sha-1 asin alih-alih kata sandi seperti log masuk normal.

Taruhan terbaik adalah membatasi upaya masuk yang buruk ke beberapa nomor yang masuk akal - 25 misalnya, dan kemudian waktu pengguna keluar untuk satu atau dua menit. Dan jika upaya logon kumulatif berhasil mencapai 250 dalam 24 jam, tutup akses akun dan email pemiliknya.


1
2017-12-04 22:37