it-swarm-id.com

Apa yang harus digunakan sebagai garam?

Saya selalu mendengar bahwa yang terbaik adalah menggunakan garam di atas kata sandi yang disimpan, yang kemudian entah bagaimana digabungkan dan di hash setelahnya. Tapi saya tidak tahu apa untuk digunakan sebagai garam. Apa yang akan menjadi garam yang baik?

43
Sal

Katakanlah Anda memiliki tabel tempat Anda menyimpan kata sandi untuk setiap orang.

Untuk "menyimpan" kata sandi yang dihasilkan, lakukan hal berikut

  1. dapatkan login dari pengguna
  2. dapatkan kata sandi
  3. menghasilkan garam dari nilai acak. Katakanlah, dari/dev/random (seperti yang disarankan @Michal), Anda mendapat "a12bc34de56fg"
  4. Gunakan beberapa fungsi hashing untuk menghasilkan kata sandi hash. Katakanlah kata sandi asli adalah "1 kata sandi" dan Anda akan menggunakan hashing SHA. Anda akan melakukannya

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg")))))))))))

Simpan kata sandi, dengan login dan garam, di tabel.

login      password      salt
--------------------------------------
john       a7b82783...   a12bc34de56fg

Dan kemudian, untuk memverifikasi ketika pengguna mengakses aplikasi Anda:

  1. dapatkan login dan kata sandi
  2. ambil garam untuk login dari database (Anda akan mendapatkan garam: a12bc34de56fg)
  3. gabungkan kata sandi teks biasa dengan garam dan lakukan semua hashing lagi:

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg")))))))))))

Verifikasi apakah hashed_password yang Anda hitung sama dengan yang disimpan dalam database. Anda akan tahu apakah kata sandi itu benar atau tidak.

Itu dia!. Anda bisa mendapatkan garam dari sumber acak yang Anda suka. Kenapa harus acak? Karena garam non-acak akan membuatnya lebih mudah untuk mencoba memaksa aplikasi Anda.

13
woliveirajr

Rekomendasi klasik untuk salt forhing hashing adalah:

  • A nilai acak 128 bit atau lebih ;
  • diperoleh dari generator nomor acak suara kriptografis ( /dev/random atau /dev/urandom pada Unix modern hari ini);
  • unik untuk setiap entri (mis. jangan menggunakan kembali garam yang sama, menghasilkan garam baru untuk setiap kata sandi baru);
  • disimpan dalam plaintext dalam database (sehingga garam tersedia saat memverifikasi hash).

Ada banyak diskusi terakhir tentang topik terkait . Dan yang paling penting, Anda harus tidak mengimplementasikan skema hashing kata sandi Anda sendiri - Anda harus menggunakan terbukti, teruji dengan baik, implementasi peer-review) ( bcrypt/PBKDF2) .

30
Jesper M

Jawabannya adalah "hampir semuanya", meskipun beberapa lebih kuat dari yang lain.

Mari kita asumsikan Anda menggunakan md5 (salt.password).

Tanpa garam, peretas akan dengan cepat memecahkan sebagian besar kata sandi hanya dengan melihat hash di tabel Rainbow.

Katakanlah Anda menggunakan "x" sebagai garam untuk semua kata sandi Anda. Banyak kata sandi Anda masih akan ditemukan, tetapi lebih sedikit. Itu karena jika kata sandi adalah "p4ssw0rd", maka itu menjadi "xp4ssw0rd" dengan garam - membuatnya sedikit lebih keras, tetapi tidak secara signifikan.

Sekarang katakanlah Anda menggunakan "% X88Fc + 7" sebagai satu-satunya garam untuk semua kata sandi Anda. Pada titik ini, Rainbow table tidak akan berfungsi. Tetapi, konsekuensi dari menggunakan satu garam untuk semua kata sandi, peretas akan dapat menghasilkan tabel Rainbow dengan asumsi itu, dan membangun tabel Rainbow terlebih dahulu. Jauh lebih aman, tetapi tidak sempurna.

Opsi teraman berikutnya adalah menggunakan nama pengguna sebagai garam, dengan kata lain menggunakan 'md5 (username.password)'. Sekali lagi, ini mengalahkan tabel Rainbow standar, tetapi seorang hacker mungkin membuat tabel Rainbow untuk nama pengguna tertentu (seperti "root" atau "administrator"), sehingga setiap kali kata sandi diubah, peretas dapat melakukan pencarian di Rainbow. meja bukannya retak lagi.

Jadi, agar lebih aman, pilih garam acak yang berbeda untuk pengguna yang berbeda. Anda harus menyimpan ini bersama dengan hash nama pengguna dan kata sandi. Ini benar-benar mengalahkan tabel Rainbow.

Beberapa menyarankan generator nomor acak "aman", daripada sesuatu yang sederhana. Misalnya, melakukan MD5 (cap waktu + nama pengguna) saat pengguna membuat akun itu sederhana, tetapi tidak aman secara kriptografis (karena cap waktu dan nama pengguna dapat diprediksi, dan dengan demikian entropi rendah). Tapi, karena hacker tetap memiliki salinan garam ketika dia mencuri database, itu tidak masalah.

10

Untuk garam cukup gunakan bit acak.

Di Linux Anda dapat menggunakan /dev/random. Ini adalah generator nomor acak kernel berdasarkan kebisingan lingkungan. Ini cukup tidak dapat diprediksi kecuali untuk mesin virtual. Jadi jika Anda katakan saja mouse fisik dicolokkan ke kotak Anda, maka /dev/random Akan memberikan Anda bit acak berkualitas tinggi yang baik untuk garam.

Inilah yang bagus artikel untuk memulai. Lihat juga referensi eksternal.

Ini adalah contoh Java kode . Lihat bagaimana garam dihasilkan dan disimpan dalam DB dalam fungsi createUser(). Kecuali untuk menggunakan import Sun.misc. ... Itu kode yang sangat bagus.

1
Michał Šrajer