Pilihan saat ini untuk pertanyaan ini menyatakan:
Masalah lain yang tidak terlalu menjadi masalah keamanan, meskipun berkaitan dengan keamanan, adalah lengkap dan gagal menghilangkan perbedaan antara hashing kata sandi dan mengenkripsinya . Paling umum ditemukan dalam kode di mana programmer berusaha menyediakan fungsionalitas "Ingatkan saya akan kata sandi saya" yang tidak aman.
Apa sebenarnya perbedaan ini? Saya selalu mendapat kesan bahwa hashing adalah bentuk enkripsi. Apa fungsi tidak aman yang dimaksud poster itu?
Jawaban:
Hashing adalah fungsi satu arah (well, mapping). Ini tidak dapat dipulihkan, Anda menerapkan algoritma hash aman dan Anda tidak bisa mendapatkan string asli kembali. Yang paling bisa Anda lakukan adalah menghasilkan apa yang disebut "tabrakan", yaitu menemukan string berbeda yang menyediakan hash yang sama. Algoritme hash yang aman secara kriptografis dirancang untuk mencegah terjadinya tabrakan. Anda bisa menyerang hash yang aman dengan menggunakan meja pelangi , yang bisa Anda lawan dengan mengoleskan garam ke hash sebelum menyimpannya.
Enkripsi adalah fungsi (dua arah) yang tepat. Itu reversibel, Anda dapat mendekripsi string yang rusak untuk mendapatkan string asli jika Anda memiliki kunci.
Fungsionalitas tidak aman yang dimaksud adalah jika Anda mengenkripsi kata sandi, aplikasi Anda menyimpan kunci di suatu tempat dan penyerang yang mendapat akses ke basis data Anda (dan / atau kode) dapat mendapatkan kata sandi asli dengan mendapatkan kunci dan teks yang dienkripsi. , sedangkan dengan hash itu tidak mungkin.
Orang-orang biasanya mengatakan bahwa jika seorang cracker memiliki basis data atau kode Anda, ia tidak memerlukan kata sandi, sehingga perbedaannya bisa diperdebatkan. Ini naif, karena Anda masih memiliki kewajiban untuk melindungi kata sandi pengguna Anda, terutama karena sebagian besar dari mereka memang menggunakan kata sandi yang sama berulang-ulang, membuat mereka berisiko lebih besar dengan membocorkan kata sandi mereka.
sumber
Hashing adalah fungsi satu arah, yang berarti bahwa sekali Anda hash kata sandi, sangat sulit untuk mendapatkan kata sandi asli kembali dari hash. Enkripsi adalah fungsi dua arah, di mana lebih mudah untuk mendapatkan teks asli kembali dari teks yang dienkripsi.
Hashing polos mudah dikalahkan menggunakan serangan kamus, di mana penyerang hanya pra-hash setiap kata dalam kamus (atau setiap kombinasi karakter hingga panjang tertentu), kemudian menggunakan kamus baru ini untuk mencari kata sandi hash. Menggunakan garam acak unik untuk setiap kata sandi hash yang disimpan membuatnya lebih sulit bagi penyerang untuk menggunakan metode ini. Mereka pada dasarnya perlu membuat kamus unik baru untuk setiap nilai garam yang Anda gunakan, memperlambat serangan mereka dengan sangat.
Tidak aman untuk menyimpan kata sandi menggunakan algoritma enkripsi karena jika lebih mudah bagi pengguna atau administrator untuk mendapatkan kata sandi kembali dari teks yang dienkripsi, penyerang juga lebih mudah melakukan hal yang sama.
sumber
Seperti yang ditunjukkan pada gambar di atas, jika kata sandi dienkripsi itu selalu merupakan rahasia tersembunyi di mana seseorang dapat mengekstraksi kata sandi teks biasa. Namun ketika kata sandi di-hash, Anda merasa santai karena hampir tidak ada metode untuk memulihkan kata sandi dari nilai hash.
Diekstrak dari Kata Sandi Terenkripsi vs Hancur - Mana yang lebih baik?
Apakah enkripsi baik?
Kata sandi teks biasa dapat dienkripsi menggunakan algoritma enkripsi simetris seperti DES, AES atau dengan algoritma lainnya dan disimpan di dalam basis data. Pada autentikasi (mengonfirmasi identitas dengan nama pengguna dan kata sandi), aplikasi akan mendekripsi kata sandi terenkripsi yang disimpan dalam database dan membandingkan dengan kata sandi yang disediakan pengguna untuk persamaan. Dalam jenis pendekatan penanganan kata sandi ini, bahkan jika seseorang mendapatkan akses ke tabel basis data kata sandi tidak akan dapat digunakan kembali. Namun ada kabar buruk dalam pendekatan ini juga. Jika seseorang mendapatkan algoritma kriptografi bersama dengan kunci yang digunakan oleh aplikasi Anda, ia akan dapat melihat semua kata sandi pengguna yang disimpan dalam database Anda dengan dekripsi. "Ini pilihan terbaik yang saya dapat", seorang pengembang perangkat lunak mungkin berteriak, tetapi apakah ada cara yang lebih baik?
Fungsi hash kriptografis (satu arah)
Ya ada, mungkin Anda sudah melewatkan poinnya di sini. Apakah Anda memperhatikan bahwa tidak ada persyaratan untuk mendekripsi dan membandingkan? Jika ada pendekatan konversi satu arah di mana kata sandi dapat dikonversi menjadi beberapa kata yang dikonversi, tetapi operasi sebaliknya (pembuatan kata sandi dari kata yang dikonversi) tidak mungkin dilakukan. Sekarang bahkan jika seseorang mendapatkan akses ke database, kata sandi tidak dapat diproduksi kembali atau diekstraksi menggunakan kata-kata yang dikonversi. Dalam pendekatan ini, hampir tidak ada yang bisa mengetahui kata sandi rahasia pengguna Anda; dan ini akan melindungi pengguna menggunakan kata sandi yang sama di beberapa aplikasi. Algoritma apa yang dapat digunakan untuk pendekatan ini?
sumber
Saya selalu berpikir bahwa Enkripsi dapat dikonversi dua arah, dengan cara nilai akhir dapat membawa Anda ke nilai asli dan dengan Hashing Anda tidak akan dapat mengembalikan dari hasil akhir ke nilai asli.
sumber
Algoritme hashing biasanya bersifat kriptografis, tetapi perbedaan utamanya adalah enkripsi dapat dibalik melalui dekripsi, dan hashing tidak.
Fungsi enkripsi biasanya mengambil input dan menghasilkan output terenkripsi yang sama, atau ukurannya sedikit lebih besar.
Fungsi hashing mengambil input dan menghasilkan output yang biasanya lebih kecil, biasanya dengan ukuran tetap juga.
Meskipun tidak mungkin untuk mengambil hasil hash dan "menghilangkannya" untuk mendapatkan kembali input asli, Anda biasanya dapat memaksa-paksa jalan Anda ke sesuatu yang menghasilkan hash yang sama.
Dengan kata lain, jika skema otentikasi mengambil kata sandi, hash, dan membandingkannya dengan versi hash dari kata sandi yang diperlukan, mungkin tidak diperlukan bahwa Anda benar-benar mengetahui kata sandi asli, hanya hash-nya, dan Anda dapat dengan kasar memaksa cara Anda ke sesuatu yang akan cocok, bahkan jika itu kata sandi yang berbeda.
Fungsi hash biasanya dibuat untuk meminimalkan kemungkinan tabrakan dan membuatnya sulit untuk hanya menghitung sesuatu yang akan menghasilkan hash yang sama dengan sesuatu yang lain.
sumber
Idealnya Anda harus melakukan keduanya.
Pertama Hash pass password untuk keamanan satu arah. Gunakan garam untuk keamanan ekstra.
Kemudian mengenkripsi hash untuk bertahan terhadap serangan kamus jika basis data kata sandi hash Anda terganggu.
sumber
Hashing :
Ini adalah algoritma satu arah dan sekali hash tidak dapat mengembalikan dan ini adalah titik manis terhadap enkripsi.
Enkripsi
Jika kami melakukan enkripsi, akan ada kunci untuk melakukan ini. Jika kunci ini bocor, semua kata sandi Anda dapat didekripsi dengan mudah.
Di sisi lain, bahkan jika database Anda akan diretas atau admin server Anda mengambil data dari DB dan Anda menggunakan kata sandi hash, peretas tidak akan dapat memecahkan kata sandi hash ini. Ini sebenarnya praktis tidak mungkin jika kita menggunakan hashing dengan garam yang tepat dan keamanan tambahan dengan PBKDF2.
Jika Anda ingin melihat bagaimana Anda harus menulis fungsi hash Anda, Anda dapat mengunjungi di sini .
Ada banyak algoritma untuk melakukan hashing.
MD5 - Menggunakan fungsi hash Message Digest Algorithm 5 (MD5). Panjang hash adalah 128 bit. Algoritma MD5 dirancang oleh Ron Rivest pada awal 1990-an dan bukan pilihan yang disukai saat ini.
SHA1 - Menggunakan hash Security Hash Algorithm (SHA1) yang diterbitkan pada tahun 1995. Output hash memiliki panjang 160 bit. Meskipun paling banyak digunakan, ini bukan pilihan yang disukai saat ini.
HMACSHA256 , HMACSHA384 , HMACSHA512 - Gunakan fungsi SHA-256, SHA-384, dan SHA-512 dari keluarga SHA-2. SHA-2 diterbitkan pada tahun 2001. Panjang hash output masing-masing adalah 256, 384, dan 512 bit, seperti yang ditunjukkan oleh nama fungsi hash.
sumber
Sama benarnya dengan jawaban lain, dalam konteks kutipan tersebut, hashing adalah alat yang dapat digunakan dalam mengamankan informasi, enkripsi adalah proses yang mengambil informasi dan membuat sangat sulit bagi orang yang tidak berwenang untuk membaca / menggunakan.
sumber
Inilah salah satu alasan Anda mungkin ingin menggunakan salah satunya - pengambilan kata sandi.
Jika Anda hanya menyimpan hash kata sandi pengguna, Anda tidak dapat menawarkan fitur 'kata sandi yang terlupakan'.
sumber