Saya perlu hash kata sandi untuk penyimpanan dalam database. Bagaimana saya bisa melakukan ini di Jawa?
Saya berharap untuk mengambil kata sandi teks biasa, menambahkan garam acak, lalu menyimpan garam dan kata sandi hash dalam database.
Kemudian ketika seorang pengguna ingin masuk, saya bisa mengambil kata sandi yang dikirimkan, menambahkan garam acak dari informasi akun mereka, memotongnya dan melihat apakah itu setara dengan kata sandi hash yang disimpan dengan informasi akun mereka.
java
passwords
cryptographic-hash-function
Chris Dutrow
sumber
sumber
Jawaban:
Anda benar-benar dapat menggunakan fasilitas bawaan Java runtime untuk melakukan ini. SunJCE di Java 6 mendukung PBKDF2, yang merupakan algoritma yang baik untuk digunakan untuk hashing kata sandi.
Berikut kelas utilitas yang dapat Anda gunakan untuk otentikasi kata sandi PBKDF2:
sumber
BigInteger
: nol di depan dihapus. Tidak apa-apa untuk debug cepat, tetapi saya telah melihat bug dalam kode produksi karena efek itu.Berikut ini adalah implementasi lengkap dengan dua metode melakukan apa yang Anda inginkan:
Intinya adalah bahwa bahkan jika penyerang mendapatkan akses ke database dan kode sumber Anda, kata sandi tetap aman.
Kami menyimpan
'salt$iterated_hash(password, salt)'
. Garamnya adalah 32 byte acak dan tujuannya adalah jika dua orang yang berbeda memilih kata sandi yang sama, kata sandi yang disimpan akan tetap terlihat berbeda.Itu
iterated_hash
, yang pada dasarnyahash(hash(hash(... hash(password, salt) ...)))
membuatnya sangat mahal bagi penyerang potensial yang memiliki akses ke database Anda untuk menebak kata sandi, hash mereka, dan mencari hash dalam database. Anda harus menghitung iniiterated_hash
setiap kali pengguna login, tetapi itu tidak dikenakan biaya banyak dibandingkan dengan penyerang yang menghabiskan hampir 100% dari hash komputasi waktu mereka.sumber
char[] password
alih-alihString password
.BCrypt adalah perpustakaan yang sangat bagus, dan ada port Java -nya.
sumber
Anda dapat menggunakan implementasi perpustakaan Shiro (sebelumnya JSecurity ) dari apa yang dijelaskan oleh OWASP .
Ini juga terlihat seperti perpustakaan JASYPT yang memiliki utilitas serupa .
sumber
Anda dapat menghitung hash menggunakan
MessageDigest
, tetapi ini salah dalam hal keamanan. Hash tidak boleh digunakan untuk menyimpan kata sandi, karena mudah pecah.Anda harus menggunakan algoritma lain seperti bcrypt, PBKDF2 dan scrypt untuk menyimpan kata sandi Anda. Lihat di sini .
sumber
Selain bcrypt dan PBKDF2 yang disebutkan dalam jawaban lain, saya akan merekomendasikan melihat scrypt
MD5 dan SHA-1 tidak direkomendasikan karena relatif cepat sehingga menggunakan komputasi terdistribusi "sewa per jam" (misalnya EC2) atau GPU modern kelas atas yang dapat "memecahkan" kata sandi menggunakan serangan brute force / kamus dengan biaya yang relatif rendah dan masuk akal waktu.
Jika Anda harus menggunakannya, maka paling tidak iterasi algoritma yang telah ditentukan dalam jumlah signifikan (1000+).
Lihat di sini untuk lebih lanjut: /security/211/how-to-securely-hash-passwords
Dan di sini: http://codahale.com/how-to-safely-store-a-password/ (mengkritik keluarga SHA, MD5 dll untuk keperluan hashing kata sandi)
sumber
Sepenuhnya setuju dengan Erickson bahwa PBKDF2 adalah jawabannya.
Jika Anda tidak memiliki opsi itu, atau hanya perlu menggunakan hash, Apache Commons DigestUtils jauh lebih mudah daripada mendapatkan kode JCE dengan benar: https://commons.apache.org/proper/commons-codec/apidocs/org/apache /commons/codec/digest/DigestUtils.html
Jika Anda menggunakan hash, gunakan sha256 atau sha512. Halaman ini memiliki rekomendasi yang baik untuk penanganan dan hashing kata sandi (perhatikan ini tidak merekomendasikan hashing untuk penanganan kata sandi): http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html
sumber
Anda dapat menggunakan Spring Security Crypto (hanya memiliki 2 dependensi kompilasi opsional ), yang mendukung PBKDF2 , BCrypt , SCrypt , dan enkripsi kata sandi Argon2 .
sumber
Sementara rekomendasi NIST PBKDF2 telah disebutkan, saya ingin menunjukkan bahwa ada kompetisi hashing kata sandi publik yang berlangsung dari 2013 hingga 2015. Pada akhirnya, Argon2 dipilih sebagai fungsi hashing kata sandi yang direkomendasikan.
Ada Java binding yang diadopsi dengan cukup baik untuk pustaka asli (asli C) yang dapat Anda gunakan.
Dalam kasus penggunaan rata-rata, saya tidak berpikir itu penting dari perspektif keamanan jika Anda memilih PBKDF2 daripada Argon2 atau sebaliknya. Jika Anda memiliki persyaratan keamanan yang kuat, saya sarankan mempertimbangkan Argon2 dalam evaluasi Anda.
Untuk informasi lebih lanjut tentang keamanan fungsi hashing kata sandi, lihat security.se .
sumber
Di sini Anda memiliki dua tautan untuk hashing MD5 dan metode hash lainnya:
API Javadoc: https://docs.oracle.com/javase/1.5.0/docs/api/java/security/MessageDigest.html
Tutorial: http://www.twmacinta.com/myjava/fast_md5.php
sumber
Di antara semua skema hash standar, ssha LDAP adalah yang paling aman untuk digunakan,
http://www.openldap.org/faq/data/cache/347.html
Saya hanya akan mengikuti algoritma yang ditentukan di sana dan menggunakan MessageDigest untuk melakukan hash.
Anda perlu menyimpan garam di database Anda seperti yang Anda sarankan.
sumber
Pada 2020, algoritma yang paling kredibel dan fleksibel digunakan,
yang paling mungkin untuk mengoptimalkan kekuatannya diberikan perangkat keras apa pun,
adalah Argon2id atau Argon2i .
Ini menyediakan alat kalibrasi yang diperlukan untuk menemukan parameter kekuatan yang dioptimalkan mengingat waktu hashing target dan perangkat keras yang digunakan.
Memory greedy hashing akan membantu melawan penggunaan GPU untuk cracking.
Implementasi keamanan Spring / Bouncy Castle tidak dioptimalkan dan relatif seminggu mengingat apa yang bisa digunakan penyerang. lih: dokumentasi Spring
Implementasi paling kredibel yang digunakan untuk java adalah mkammerer ,
tabung pembungkus / perpustakaan dari implementasi asli resmi yang ditulis dalam Rust.
Ini ditulis dengan baik dan mudah digunakan.
Versi yang disematkan menyediakan versi bawaan untuk Linux, windows dan OSX.
Sebagai contoh, ini digunakan oleh jpmorganchase dalam proyek keamanan tessera yang digunakan untuk mengamankan Quorum , implementasi cryptocurency Ethereum-nya.
Berikut ini contoh kode dari tessera.
Kalibrasi dapat dilakukan menggunakan de.mkammerer.argon2.Argon2Helper # findIterations
Algoritma SCRYPT dan Pbkdf2 mungkin juga dikalibrasi dengan menulis beberapa tolok ukur sederhana, tetapi nilai iterasi aman minimal saat ini, akan membutuhkan waktu hashing yang lebih tinggi.
sumber
Saya bersandar pada video di udemy dan diedit menjadi kata sandi acak yang lebih kuat
sumber