Perbedaan antara Hashing Kata Sandi dan Enkripsi itu


140

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?


Artikel yang ditulis dengan baik tentang mengapa Anda tidak harus hanya hash rahasia / kata sandi Anda. Alih-alih menggunakan HMAC. benlog.com/articles/2008/06/19/dont-hash-secrets
Jay Kumar

Ringkasan subjek yang luar biasa di blog keamanan StackExchange: security.blogoverflow.com/2011/11/…
David J. Liszewski

@JayKumar: Artikel yang Anda tautkan sangat menyesatkan. Ini mengonfigurasi garam kata sandi (yang diharapkan terlihat oleh penyerang) dengan kunci MAC (yang diharapkan tetap rahasia). Tautan David J. Liszewski memberikan deskripsi yang jauh lebih akurat.
Rufflewind

Jawaban:


222

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.


1
Untuk menjadi jelas, dapatkan keamanan yang diinginkan dengan hash, itu harus algoritma hash aman secara kriptografis dengan properti spesifik yang tidak hanya hash menjadi non-reversable TAPI JUGA secara komputasi juga tidak praktis untuk menghasilkan string APA PUN lain yang menghasilkan hash yang sama.
Tall Jeff

11
Ya dan tidak ... Tabrakan hash harus sulit untuk dibuat demi keamanan aplikasi Anda sendiri, tetapi non-pembalikan cukup untuk menghindari kebocoran kata sandi.
Dave Sherohman

5
silky: dan bagaimana tepatnya Anda akan mendapatkan kembali kata sandi asli dari fungsi hash Anda yang buruk? Saya sarankan Anda membaca kembali komentar Dave
Vinko Vrsalovic

1
Jika ada, fungsi hash yang memiliki banyak tabrakan lebih baik untuk keamanan kata sandi, namun itu jelas berarti lebih banyak kata sandi dapat digunakan untuk masuk ke akun.
Williamvicary

1
@ n00b garam tidak dapat dikodekan karena setiap item hash harus menggunakan garam terpisah. Intinya adalah jika UserA dan UserB menggunakan kata sandi "1234" jika Anda menemukan kata sandi UserA, Anda tidak bisa mengatakan bahwa UserB menggunakan kata sandi yang sama karena mereka memiliki garam yang berbeda. Bukan keamanan kritis bahwa garam dirahasiakan, sebagian besar implementasi hanya menggabungkan garam ke depan atau belakang gumpalan biner yang mewakili hash.
Scott Chamberlain

34

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.


12

Dienkripsi vs Kata Sandi Hashed

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?


Oke, tetapi ketika Anda masuk ke suatu layanan, kata sandi Anda dikirim dalam plaintext / dienkripsi, karena jika dikirim sebagai hash ke server untuk dibandingkan. seorang hacker bisa jika mereka tahu hash, cukup kirim hash ke server untuk login. Inilah sebabnya mengapa kata sandi untuk perbandingan perlu dikirim dienkripsi ke server, di mana mereka didekripsi dan diacak. Ini aman kan? Selama kata sandi tidak pernah disimpan dalam bentuk tidak rusak untuk jangka panjang dan semua kejadian kata sandi terenkripsi / plainteks dihapus dari memori mana pun ketika tidak lagi diperlukan?
AgentM

8

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.


8

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.


4

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.


3
Enkripsikan dengan apa? Jika mereka membajak Anda begitu keras sehingga mereka sampai ke database dengan semua kata sandi pengguna Anda (hash, dienkripsi, atau sebaliknya), tidak akankah mereka dapat menemukan kunci untuk mendekripsi mereka?
Luc

5
Ini tidak boleh diturunkan. Ini adalah kemungkinan yang seharusnya tidak dikesampingkan semudah itu, bahwa database dikompromikan sementara aplikasi tidak. Oleh karena itu mengenkripsi hash adalah lapisan keamanan tambahan.
Arie

@Luc, saya tidak setuju dengan Anda, diri saya sebelumnya. Saya telah melihat terlalu banyak suntikan SQL yang tidak mengganggu kode aplikasi (atau file konfigurasi) dan saya sekarang berpendapat bahwa menambahkan rahasia sangat membantu, baik dalam bentuk enkripsi atau dalam bentuk lada, tetapi itu tidak harus menggantikan hashing. Untuk jawaban yang lebih lengkap, lihat di sini: security.stackexchange.com/a/31846/10863
Luc

3

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.

  1. 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.

  2. 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.

  3. 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.


1

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.


-9

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'.


16
Anda jelas tidak membaca jawaban yang diterima dengan cukup baik. Baca dengan cermat: Anda tidak seharusnya menawarkan fitur pencarian kata sandi . Anda seharusnya menawarkan fitur pengaturan ulang kata sandi . Saya telah mengelola banyak situs web selama bertahun-tahun, termasuk vBulletin, phpBB, e107, IPB, blogspot, dan bahkan CMS buatan saya sendiri. Sebagai administrator, Anda TIDAK PERNAH perlu memiliki kata sandi yang dipra-hash seseorang. Anda tidak melakukannya. Dan Anda seharusnya tidak memilikinya juga. Jika Anda tidak setuju dengan apa yang saya katakan, izinkan saya meyakinkan Anda: Anda salah.
Lakey

3
Maaf karena WAY terlalu marah. Saya hanya melihat terlalu banyak situs web yang menyimpan kata sandi dalam teks biasa dan itu membuat saya frustrasi. Sebagai catatan: beberapa situs web yang memikirkan keamanan ingin membuat pengguna mengubah kata sandi mereka secara berkala. Mereka ingin memastikan orang tersebut tidak mengubah kata sandi dari "Kata Sandi1" menjadi "Kata Sandi2". Jadi mereka mempertahankan kata sandi teks biasa untuk melakukan perbandingan ini di kemudian hari. Itu bukan praktik yang baik. Apa yang perlu mereka lakukan, dalam hal ini, adalah melakukan analisis pada kata sandi PERTAMA, membuat banyak kata sandi yang serupa - hash masing-masing - dan hanya menyimpan hash .
Lakey

7
Tidak masalah, itu membuat saya kembali dan membaca kembali pertanyaan dan juga melakukan penelitian lebih lanjut, jadi semuanya tidak hilang :-) Saya tidak yakin apa yang saya pikirkan ketika saya menulis jawaban itu. sorak-sorai
philtron
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.