SHA512 vs. Blowfish dan Bcrypt [ditutup]

222

Saya melihat algoritma hashing, tetapi tidak dapat menemukan jawaban.

  • Bcrypt menggunakan Blowfish
  • Blowfish lebih baik daripada MD5
  • T: tetapi apakah Blowfish lebih baik daripada SHA512?

Terima kasih..

Memperbarui:

Saya ingin menjelaskan bahwa saya memahami perbedaan antara hashing dan enkripsi. Apa yang mendorong saya untuk mengajukan pertanyaan dengan cara ini adalah artikel ini , di mana penulis menyebut bcrypt sebagai "hashing adaptif"

Karena bcrypt didasarkan pada Blowfish, saya jadi berpikir bahwa Blowfish adalah algoritma hashing. Jika itu enkripsi seperti yang ditunjukkan oleh jawaban, maka bagi saya sepertinya tidak ada tempat dalam artikel ini. Yang lebih buruk adalah dia menyimpulkan bahwa bcrypt adalah yang terbaik. Yang juga membingungkan saya sekarang adalah kelas phpass (digunakan untuk hashing kata sandi saya percaya) menggunakan bcrypt (yaitu blowfish, yaitu enkripsi). Berdasarkan info baru ini yang kalian beri tahu (blowfish adalah enkripsi), kelas ini terdengar salah. Apakah saya melewatkan sesuatu?

Chris
sumber
2
Itu tidak salah; lihat pembaruan pada jawaban saya untuk penjelasan tentang cara kerja bcrypt dan mengapa ia melayani tujuan yang sama dengan algoritma "satu arah" berbasis hash.
erickson
3
bcrypthanya memiliki "faktor kerja" yang lebih tinggi secara default. SHA diasumsikan tidak untuk ... kecuali jika Anda menggunakan passhash9, yang dapat digunakan bersama dengan faktor kerja. mengapa pertanyaan ini ditutup? itu jauh dari jawab namun sangat penting.
1
Tautan yang dimaksud sedang down ...............
Pacerier

Jawaban:

320

Seharusnya cukup untuk mengatakan apakah bcrypt atau SHA-512 (dalam konteks algoritma yang sesuai seperti PBKDF2) cukup baik . Dan jawabannya adalah ya, algoritma mana pun cukup aman sehingga pelanggaran akan terjadi melalui cacat implementasi, bukan kriptanalisis.

Jika Anda bersikeras tahu mana yang "lebih baik", SHA-512 telah memiliki ulasan mendalam oleh NIST dan lainnya. Itu bagus, tetapi kelemahan telah diakui bahwa, meskipun tidak dapat dieksploitasi sekarang, telah menyebabkan kompetisi SHA-3 untuk algoritma hash baru. Juga, perlu diingat bahwa studi tentang algoritma hash "lebih baru" dari pada cipher, dan cryptographers masih belajar tentang mereka.

Meskipun bcrypt secara keseluruhan tidak memiliki pengawasan sebanyak seperti Blowfish itu sendiri, saya percaya bahwa didasarkan pada cipher dengan struktur yang dipahami dengan baik memberinya beberapa keamanan yang melekat yang tidak memiliki otentikasi berbasis hash. Juga, lebih mudah untuk menggunakan GPU umum sebagai alat untuk menyerang hash berbasis SHA-2; karena persyaratan memorinya, mengoptimalkan bcrypt memerlukan perangkat keras yang lebih khusus seperti FPGA dengan beberapa on-board RAM.


Catatan: bcrypt adalah algoritma yang menggunakan Blowfish secara internal. Ini bukan algoritma enkripsi itu sendiri. Ini digunakan untuk mengaburkan kata sandi yang tidak dapat dibalikkan, sama seperti fungsi hash digunakan untuk melakukan "hash satu arah".

Algoritma hash kriptografi dirancang agar tidak mungkin untuk dibalik. Dengan kata lain, hanya diberi output dari fungsi hash, perlu "selamanya" untuk menemukan pesan yang akan menghasilkan output hash yang sama. Sebenarnya, secara komputasi tidak layak untuk menemukan dua pesan yang menghasilkan nilai hash yang sama. Tidak seperti sandi, fungsi hash tidak diparameterisasi dengan kunci; input yang sama akan selalu menghasilkan output yang sama.

Jika seseorang memberikan kata sandi yang hash dengan nilai yang disimpan dalam tabel kata sandi, mereka diautentikasi. Khususnya, karena tidak dapat dibaliknya fungsi hash, itu diasumsikan bahwa pengguna bukan penyerang yang memegang hash dan membaliknya untuk menemukan kata sandi yang berfungsi.

Sekarang pertimbangkan bcrypt. Ini menggunakan Blowfish untuk mengenkripsi string ajaib, menggunakan kunci "berasal" dari kata sandi. Kemudian, ketika pengguna memasukkan kata sandi, kunci tersebut diturunkan lagi, dan jika ciphertext yang dihasilkan dengan mengenkripsi dengan kunci itu cocok dengan ciphertext yang disimpan, pengguna diautentikasi. Ciphertext disimpan dalam tabel "kata sandi", tetapi kunci turunannya tidak pernah disimpan.

Untuk memecahkan kriptografi di sini, penyerang harus memulihkan kunci dari ciphertext. Ini disebut serangan "diketahui-plainteks", karena serangan itu tahu string ajaib yang telah dienkripsi, tetapi bukan kunci yang digunakan. Blowfish telah dipelajari secara luas, dan belum ada serangan yang diketahui yang memungkinkan penyerang menemukan kunci dengan plaintext tunggal yang diketahui.

Jadi, seperti halnya algoritma kriptografi berbasis ireversibel, bcrypt menghasilkan output yang ireversibel, dari kata sandi, garam, dan faktor biaya. Kekuatannya terletak pada resistensi Blowfish terhadap serangan plaintext yang diketahui, yang dianalogikan dengan "serangan pra-gambar pertama" pada algoritma digest. Karena dapat digunakan sebagai pengganti algoritma hash untuk melindungi kata sandi, bcrypt secara membingungkan disebut sebagai algoritma "hash" itu sendiri.

Dengan asumsi bahwa tabel pelangi telah digagalkan oleh penggunaan garam yang tepat, fungsi yang benar-benar ireversibel akan mengurangi penyerang menjadi trial-and-error. Dan kecepatan yang bisa diserang oleh penyerang ditentukan oleh kecepatan dari algoritma "hash" yang tidak dapat diubah. Jika satu iterasi fungsi hash digunakan, penyerang dapat membuat jutaan percobaan per detik menggunakan peralatan yang harganya $ 1.000, menguji semua kata sandi hingga 8 karakter dalam beberapa bulan.

Namun jika, intisari keluaran "diumpankan" ribuan kali, akan butuh ratusan tahun untuk menguji serangkaian kata sandi yang sama pada perangkat keras itu. Bcrypt mencapai efek "penguatan kunci" yang sama dengan beralih ke dalam rutin derivasi kunci, dan metode berbasis hash yang tepat seperti PBKDF2 melakukan hal yang sama; dalam hal ini, kedua metode tersebut serupa.

Jadi, rekomendasi bcrypt saya berasal dari asumsi 1) bahwa Blowfish telah memiliki tingkat pengawasan yang sama dengan keluarga SHA-2 fungsi hash, dan 2) bahwa metode cryptanalytic untuk sandi lebih baik dikembangkan daripada yang untuk fungsi hash.

erickson
sumber
4
+1 pos bagus. Tapi saya punya dua pertanyaan. Blowfish digantikan oleh twofish lebih dari satu dekade lalu, bukankah seharusnya sistem memanfaatkan primitif modern? Juga ribuan iterasi tampaknya boros dalam sistem seperti aplikasi web di mana banyak orang masuk pada saat tertentu. Misalnya PBKDF2 hanya diimplementasikan dalam skenario ketika 1 orang masuk pada suatu waktu, seperti fungsi string2key untuk sistem file terenkripsi. Saya menggunakan pepatah "Jika terlalu berat bagi penyerang untuk mengangkat, maka terlalu berat untuk server Anda." Bagaimana menurut anda?
benteng
17
Saya tidak berpikir ada yang salah dengan menggunakan primitif yang lebih modern. Kerentanan sering ditemukan dengan berlalunya waktu, dan Twofish dikembangkan menggunakan pengetahuan yang diperoleh dari Blowfish. Namun, saya tidak mengetahui kerentanan spesifik yang akan membuat penggunaan Blowfish tidak berlaku, sehingga argumen "jika-tidak-rusak" dapat dibuat juga. Pepatah Anda tentang penyerang tidak terdengar baik bagi saya. Bahkan jika Anda memilih algoritma yang akan membutuhkan bertahun-tahun bagi penyerang untuk menguji satu miliar kata sandi, ia akan menghabiskan sebagian kecil waktu yang dapat diabaikan dalam aplikasi yang sah.
erickson
15
Jika Anda melihat spesifikasi fungsi hash, Anda tidak akan melihat apa pun tentang "garam". Satu-satunya parameter adalah pesan yang akan dicerna. Tinjau spesifikasi setiap sandi, dan Anda akan melihat bahwa fungsinya diparameterisasi dengan kunci. "Garam" yang mungkin (atau mungkin tidak ) digunakan bersama dengan hash hanyalah bagian dari pesan. Algoritme hash tidak memerlukannya, tidak memperlakukannya secara khusus, dan tidak dapat membedakannya dari sisa pesan. Jadi, meskipun benar bahwa pesan sering diubah oleh pengasinan, pesan yang diberikan hanya menghasilkan satu hash.
erickson
1
@Andre D Sebagai pentester saya melaporkan aplikasi yang mengunci akun, dan saya Melaporkan aplikasi yang tidak mencegah terhadap kekerasan. Idealnya alamat IP yang menyinggung harus menyelesaikan captcha, selain itu jika nama pengguna ditargetkan (bahkan jika nama pengguna itu tidak ada) maka akun itu harus memecahkan captcha sebelum diautentikasi. Menerapkan ratelimit X per menit juga dapat diterima. Terkait: security.stackexchange.com/questions/25444/…
rook
2
@rook: sementara aplikasi ratelimiting adalah praktik yang baik, Anda dapat mengasumsikan dalam kasus ini bahwa database telah diunduh dan ditempatkan pada peralatan yang tidak memiliki batas kecepatan yang Anda gambarkan.
Ellert van Koperen
50

Saya setuju dengan jawaban Erickson, dengan satu peringatan: untuk tujuan otentikasi password, bcrypt adalah jauh lebih baik daripada iterasi tunggal dari SHA-512 - hanya karena jauh lebih lambat. Jika Anda tidak mengerti mengapa kelambatan merupakan keunggulan dalam gim ini, baca artikel yang Anda tautkan lagi (gulir ke bawah untuk " Kecepatan adalah persis apa yang tidak Anda inginkan dalam fungsi hash kata sandi. ").

Anda tentu saja dapat membangun algoritma hashing kata sandi yang aman di sekitar SHA-512 dengan mengulanginya ribuan kali, sama seperti cara kerja algoritma MD5 PHK. Ulrich Drepper melakukan ini , untuk crypt (). Tidak ada alasan khusus untuk melakukan ini, jika Anda sudah memiliki implementasi bcrypt yang teruji tersedia.

kaf
sumber
3
Mudah-mudahan jawaban saya menjelaskan bahwa iterasi hash tunggal tidak cukup (sayangnya, bahkan tingkat pengetahuan dasar ini tidak dapat diasumsikan). "Jika satu iterasi fungsi hash digunakan, penyerang dapat membuat jutaan uji coba per detik menggunakan peralatan yang harganya $ 1.000, menguji semua kata sandi hingga 8 karakter dalam beberapa bulan. Jika demikian, intisari keluaran adalah 'umpan balik' ribuan kali, akan butuh ratusan tahun untuk menguji set kata sandi yang sama pada perangkat keras itu. Bcrypt mencapai efek 'penguatan kunci' yang sama dengan mengulangi ... "
erickson
@erickson: Ya, meskipun saya pikir Anda mungkin telah mengubur lede di sana. Poin yang saya coba sampaikan adalah bahwa perbandingan langsung bcrypt dan SHA-512 tidak benar-benar relevan, karena satu adalah fungsi derivasi kunci dan yang lainnya hanya primitif kriptografi, tidak cocok dengan sendirinya.
caf
1
Menggunakan ribuan putaran SHA-512 bukanlah hal yang tidak pernah terjadi dan diberikan inklusi dalam berbagai cryptimplementasi (termasuk dalam PHP yang saya gunakan), ketika saya membaca pertanyaan asli saya bahkan berasumsi bahwa itulah yang dimaksud OP ketika dia bertanya tentang SHA-512 - bahwa dia sebenarnya mengacu pada ribuan putaran SHA-512 vs bcrypt yang menggunakan ratusan atau ribuan iterasi itu sendiri.
thomasrutter
33

Blowfish bukan algoritma hashing. Ini adalah algoritma enkripsi. Artinya adalah bahwa Anda dapat mengenkripsi sesuatu menggunakan blowfish, dan kemudian Anda dapat mendekripsi kembali ke teks biasa.

SHA512 adalah algoritma hashing. Itu berarti bahwa (secara teori) setelah Anda hash input Anda tidak bisa mendapatkan input asli kembali.

Mereka adalah 2 hal yang berbeda, dirancang untuk digunakan untuk tugas yang berbeda. Tidak ada jawaban yang 'benar' untuk "apakah blowfish lebih baik daripada SHA512?" Anda mungkin juga bertanya "apakah apel lebih baik dari kanguru?"

Jika Anda ingin membaca lebih banyak tentang topik ini, berikut beberapa tautan:

Lembah kecil
sumber
18
Saya pikir pertanyaannya adalah tentang menggunakan bcrypt sebagai perlindungan yang tidak dapat diubah untuk kata sandi, seperti hashing yang digunakan untuk tujuan itu.
erickson
3
@erickson teks "T: tapi apakah Blowfish lebih baik daripada SHA512?" tampaknya cukup jelas bagi saya dan menunjukkan bahwa OP tidak mengerti perbedaan antara 2 algoritma
Glen
1
OP disini. Sebenarnya, berdasarkan asnwer Glen bahwa blowfish adalah algoritma enkripsi (yang saya pahami berbeda dari hashing), saya menyadari sekarang bahwa pertanyaan saya ya bingung. Yang membingungkan sekarang adalah bahwa kelas phpass (digunakan untuk hashing kata sandi saya percaya) menggunakan bcrypt (yaitu blowfish, yaitu enkripsi). Jika blowfish adalah enkripsi, mengapa phpass menggunakannya untuk kata sandi hash, sepertinya cacat bagi saya, bukan? Apakah saya melewatkan sesuatu?
Chris
2
namun pertanyaannya menanyakan apel dan kangguru mana yang lebih cocok untuk tugas tertentu. Blowfish adalah fungsi hashing yang lebih baik daripada sha karena waktu yang dibutuhkan untuk hash. Sebagian besar implementasi sha yang saya lihat sangat cepat. Anda ingin algoritma yang lambat untuk hashing kata sandi.
John Nicholas
Jawaban ini benar bahwa Blowfish adalah algoritma enkripsi, tetapi dalam konteks ini (misalnya, ketika digunakan dalam bcrypt) itu digunakan sebagai algoritma hashing dengan menurunkan kunci dari string sumber dan menggunakannya untuk mengenkripsi angka ajaib. Ini membuatnya ireversibel, pada dasarnya fungsi hashing. Anda tidak dapat menghitung kunci dari cipher, bahkan jika Anda tahu plaintext dan data terenkripsi.
thomasrutter
4

Blowfish tidak lebih baik dari MD5 atau SHA512, karena mereka melayani tujuan yang berbeda. MD5 dan SHA512 adalah algoritma hashing, Blowfish adalah algoritma enkripsi. Dua fungsi kriptografi yang sama sekali berbeda.

blowdart
sumber
2

Saya akan merekomendasikan implementasi crypt berbasis SHA-256 / SHA-512 dari Ulrich Drepper.

Kami mem-porting algoritme ini ke Java, dan Anda dapat menemukan versi yang dilisensikan secara bebas di ftp://ftp.arlut.utexas.edu/java_hashes/ .

Perhatikan bahwa sebagian besar Unix (modern) mendukung algoritma Drepper dalam file / etc / shadow mereka.

Jonathan Abbey
sumber
PWDTK sourceforge.net/projects/pwdtknet menggunakan HMAC-SHA512 namun ia melakukannya pada banyak iterasi untuk membuat "kelambatan" alias Peregangan Kunci seperti yang dibicarakan orang lain di sini. BCrypt lebih baik daripada SHA-512 tunggal seperti yang telah disebutkan, namun jika Anda menggunakan SHA-512 dalam sesuatu seperti PBKDF2 maka Anda aman (Selama Anda menggunakan garam crypto-random besar dan iterasi yang cukup untuk memaksa waktu untuk membuat tabel pelangi) API yang baru saja saya posting dibangun oleh saya dan akan melakukan apa yang Anda inginkan. NET jika itu yang Anda kembangkan untuk (Untuk manfaat pembaca masa depan)
thashiznets
2

Saya baru saja menemukan ini:

http://codahale.com/how-to-safely-store-a-password/

Bisakah penulis artikel ini salah?

menghilang
sumber
2
Bukannya dia salah, hanya saja dia mengabaikan banyak literatur tentang bagaimana menerapkan algoritma hash, yaitu. mereka harus digunakan secara iteratif dalam fungsi derivasi kunci, seperti halnya bcrypt.
erickson