Kerangka .NET dikirimkan dengan 6 algoritme hashing yang berbeda:
- MD5: 16 byte (Waktu untuk hash 500MB: 1462 ms)
- SHA-1: 20 byte (1644 ms)
- SHA256: 32 byte (5618 md)
- SHA384: 48 byte (3839 ms)
- SHA512: 64 byte (3820 md)
- RIPEMD: 20 byte (7066 md)
Masing-masing fungsi ini bekerja secara berbeda; MD5 menjadi yang tercepat dan RIPEMD menjadi yang paling lambat.
MD5 memiliki keunggulan karena cocok dengan tipe Panduan bawaan; dan itu adalah dasar dari UUID tipe 3 . Hash SHA-1 adalah dasar dari tipe 5 UUID. Yang membuatnya sangat mudah digunakan untuk identifikasi.
Namun MD5 rentan terhadap serangan tabrakan , SHA-1 juga rentan tetapi pada tingkat yang lebih rendah.
Dalam kondisi apa saya harus menggunakan algoritma hashing?
Pertanyaan khusus yang sangat ingin saya jawab adalah:
Apakah MD5 tidak bisa dipercaya? Dalam situasi normal ketika Anda menggunakan algoritma MD5 tanpa niat jahat dan tidak ada pihak ketiga yang memiliki niat jahat apa pun yang Anda harapkan terjadi tabrakan (artinya dua byte acak [] menghasilkan hash yang sama)
Seberapa jauh lebih baik RIPEMD daripada SHA1? (jika ada yang lebih baik) 5 kali lebih lambat untuk menghitung tetapi ukuran hashnya sama dengan SHA1.
Seberapa besar kemungkinan mendapatkan tabrakan tidak berbahaya saat mencirikan nama file (atau string pendek lainnya)? (Misalnya, 2 nama file acak dengan hash MD5 yang sama) (dengan MD5 / SHA1 / SHA2xx) Secara umum, seberapa besar kemungkinan tabrakan tidak berbahaya?
Ini patokan yang saya gunakan:
static void TimeAction(string description, int iterations, Action func) {
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
static byte[] GetRandomBytes(int count) {
var bytes = new byte[count];
(new Random()).NextBytes(bytes);
return bytes;
}
static void Main(string[] args) {
var md5 = new MD5CryptoServiceProvider();
var sha1 = new SHA1CryptoServiceProvider();
var sha256 = new SHA256CryptoServiceProvider();
var sha384 = new SHA384CryptoServiceProvider();
var sha512 = new SHA512CryptoServiceProvider();
var ripemd160 = new RIPEMD160Managed();
var source = GetRandomBytes(1000 * 1024);
var algorithms = new Dictionary<string,HashAlgorithm>();
algorithms["md5"] = md5;
algorithms["sha1"] = sha1;
algorithms["sha256"] = sha256;
algorithms["sha384"] = sha384;
algorithms["sha512"] = sha512;
algorithms["ripemd160"] = ripemd160;
foreach (var pair in algorithms) {
Console.WriteLine("Hash Length for {0} is {1}",
pair.Key,
pair.Value.ComputeHash(source).Length);
}
foreach (var pair in algorithms) {
TimeAction(pair.Key + " calculation", 500, () =>
{
pair.Value.ComputeHash(source);
});
}
Console.ReadKey();
}
sumber
Jawaban:
Dalam kriptografi, fungsi hash menyediakan tiga fungsi terpisah.
Properti ini terkait tetapi independen. Misalnya, resistensi tabrakan menyiratkan resistensi preimage kedua, tetapi tidak sebaliknya. Untuk aplikasi tertentu, Anda akan memiliki persyaratan yang berbeda, membutuhkan satu atau beberapa properti ini. Fungsi hash untuk mengamankan kata sandi di server biasanya hanya memerlukan resistensi preimage, sedangkan message digest membutuhkan ketiganya.
Telah ditunjukkan bahwa MD5 tidak tahan benturan, namun tidak menghalangi penggunaannya dalam aplikasi yang tidak memerlukan ketahanan benturan. Memang, MD5 sering masih digunakan dalam aplikasi yang menguntungkan ukuran dan kecepatan tombol yang lebih kecil. Karena kekurangannya, peneliti merekomendasikan penggunaan fungsi hash lainnya dalam skenario baru.
SHA1 memiliki cacat yang memungkinkan tabrakan ditemukan secara teoritis jauh lebih sedikit daripada langkah 2 ^ 80 yang dibutuhkan oleh fungsi hash yang aman dari panjangnya. Serangan itu terus direvisi dan saat ini dapat dilakukan dalam ~ 2 ^ 63 langkah - hampir tidak dalam bidang komputasi saat ini. Untuk alasan ini, NIST menghentikan penggunaan SHA1 secara bertahap, yang menyatakan bahwa keluarga SHA2 harus digunakan setelah tahun 2010.
SHA2 adalah keluarga baru dari fungsi hash yang dibuat mengikuti SHA1. Saat ini tidak ada serangan yang diketahui terhadap fungsi SHA2. SHA256, 384 dan 512 adalah bagian dari kelompok SHA2, hanya menggunakan panjang kunci yang berbeda.
RIPEMD Saya tidak dapat berkomentar terlalu banyak, kecuali untuk dicatat bahwa RIPEMD tidak umum digunakan seperti keluarga SHA, dan karenanya belum diteliti secara cermat oleh para peneliti kriptografi. Untuk alasan itu saja saya akan merekomendasikan penggunaan fungsi SHA di atasnya. Dalam implementasi yang Anda gunakan sepertinya juga cukup lambat, yang membuatnya kurang berguna.
Kesimpulannya, tidak ada satu fungsi terbaik - semuanya tergantung pada apa yang Anda butuhkan. Waspadai kekurangan masing-masing dan Anda akan dapat memilih fungsi hash yang tepat untuk skenario Anda .
sumber
Semua fungsi hash "rusak"
The prinsip mengesampingkan mengatakan bahwa mencoba sekeras yang Anda akan Anda tidak dapat memasukkan lebih dari 2 merpati di 2 lubang (kecuali jika Anda memotong merpati up). Demikian pula Anda tidak dapat memasukkan 2 ^ 128 + 1 angka dalam 2 ^ 128 slot. Semua fungsi hash menghasilkan hash dengan ukuran terbatas, ini berarti Anda selalu dapat menemukan tabrakan jika mencari melalui "ukuran terbatas" + 1 urutan. Hanya saja tidak mungkin untuk melakukannya. Bukan untuk MD5 dan bukan untuk Skein .
MD5 / SHA1 / Sha2xx tidak memiliki kemungkinan tabrakan
Semua fungsi hash memiliki benturan, itu fakta kehidupan. Menghadapi tabrakan ini secara tidak sengaja sama saja dengan memenangkan lotre antargalaksi . Artinya, tidak ada yang memenangkan lotere intergalaksi , hanya saja cara kerjanya tidak demikian. Anda tidak akan menemukan hash MD5 / SHA1 / SHA2XXX yang tidak disengaja, EVER. Setiap kata dalam setiap kamus, dalam setiap bahasa, memiliki nilai yang berbeda. Setiap nama jalur, pada setiap mesin di seluruh planet memiliki hash MD5 / SHA1 / SHA2XXX yang berbeda. Bagaimana saya tahu itu, Anda mungkin bertanya. Yah, seperti yang saya katakan sebelumnya, tidak ada yang pernah memenangkan lotere antargalaksi.
Tapi ... MD5 rusak
Terkadang fakta bahwa kerusakannya tidak masalah .
Tidak ada serangan gambar awal atau gambar kedua yang diketahui di MD5.
Jadi apa yang salah tentang MD5, Anda mungkin bertanya? Ada kemungkinan bagi pihak ketiga untuk menghasilkan 2 pesan, salah satunya adalah JAHAT dan yang lainnya BAIK yang keduanya memiliki nilai yang sama. ( Serangan tabrakan )
Meskipun demikian, rekomendasi RSA saat ini adalah tidak menggunakan MD5 jika Anda membutuhkan resistansi gambar sebelumnya. Orang-orang cenderung bersikap hati-hati dalam hal algoritme keamanan.
Jadi apa fungsi hash yang harus saya gunakan di .NET?
Ulangi ini setelah saya, tidak ada kemungkinan tabrakan MD5 , tabrakan berbahaya dapat direkayasa dengan hati-hati. Meskipun hingga saat ini belum ada serangan gambar awal di MD5, garis dari pakar keamanan menyatakan bahwa MD5 tidak boleh digunakan di tempat yang Anda butuhkan untuk melindungi dari serangan gambar sebelumnya. SAMA berlaku untuk SHA1 .
Perlu diingat, tidak semua algoritme perlu mempertahankan diri dari serangan pra-gambar atau benturan. Ambil kasus sepele dari pencarian jalan pertama untuk file duplikat pada HD Anda.
Tidak ada yang pernah menemukan tabrakan SHA512. PERNAH. Mereka telah berusaha sangat keras. Untuk itu tidak ada yang pernah menemukan tabrakan SHA256 atau 384. .
RIPMED belum menerima jumlah pemeriksaan yang sama seperti yang diterima SHAX dan MD5. Baik SHA1 dan RIPEMD rentan terhadap serangan ulang tahun. Keduanya lebih lambat dari MD5 di .NET dan memiliki ukuran 20 byte yang aneh. Tidak ada gunanya menggunakan fungsi-fungsi ini, lupakan saja.
Serangan tabrakan SHA1 turun menjadi 2 ^ 52, itu tidak akan terlalu lama sampai tabrakan SHA1 keluar di alam liar.
Untuk informasi terkini tentang berbagai fungsi hash, lihat kebun binatang fungsi hash .
Tapi tunggu, masih ada lagi
Memiliki fungsi hash yang cepat bisa menjadi kutukan. Misalnya: penggunaan yang paling umum untuk fungsi hash adalah penyimpanan kata sandi. Pada dasarnya, Anda menghitung hash dari kata sandi yang digabungkan dengan string acak yang diketahui (untuk menghalangi serangan pelangi) dan menyimpan hash itu di database.
Masalahnya adalah, jika seorang penyerang mendapatkan dump database, dia bisa, dengan cukup efektif menebak password menggunakan brute-force. Setiap kombinasi yang dia coba hanya membutuhkan sepersekian milidetik, dan dia dapat mencoba ratusan ribu kata sandi dalam satu detik.
Untuk mengatasi masalah ini, algoritma bcrypt dapat digunakan, ia dirancang untuk menjadi lambat sehingga penyerang akan sangat melambat jika menyerang sistem menggunakan bcrypt. Baru-baru ini scrypt telah menjadi berita utama dan dianggap oleh beberapa orang lebih efektif daripada bcrypt tetapi saya tidak tahu tentang implementasi .Net.
sumber
Memperbarui:
Waktu telah berubah, kami memiliki pemenang SHA3. Saya akan merekomendasikan menggunakan pemenang keccak (alias SHA3 ) dari kontes SHA3.
Jawaban Asli:
Dari yang terlemah ke terkuat saya akan mengatakan:
Secara pribadi saya akan menggunakan MD6, karena orang tidak pernah terlalu paranoid. Jika kecepatan adalah masalah nyata, saya akan melihat Skein, atau SHA-256.
sumber
Dalam pembelaan MD5, tidak ada cara yang diketahui untuk menghasilkan file dengan hash MD5 yang berubah-ubah. Penulis asli harus merencanakan terlebih dahulu agar tabrakan berfungsi. Jadi jika penerima mempercayai pengirim, MD5 baik-baik saja. MD5 rusak jika penandatangannya jahat, tetapi tidak diketahui rentan terhadap serangan man-in-the-middle.
sumber
Ide yang bagus untuk melihat algorythm BLAKE2 .
Seperti yang dijelaskan, ini lebih cepat dari MD5 dan setidaknya seaman SHA-3. Ini juga diimplementasikan oleh beberapa aplikasi perangkat lunak , termasuk WinRar.
sumber
Yang mana yang Anda gunakan sangat bergantung pada tujuan Anda menggunakannya. Jika Anda hanya ingin memastikan bahwa file tidak rusak saat transit dan tidak terlalu mengkhawatirkan keamanan, lakukan dengan cepat dan kecil. Jika Anda memerlukan tanda tangan digital untuk perjanjian bailout federal bernilai miliaran dolar dan perlu memastikan perjanjian itu tidak dipalsukan, lakukan dengan susah payah dan lambat.
sumber
Saya ingin berpadu (sebelum md5 tercabik-cabik) bahwa saya masih menggunakan md5 secara ekstensif meskipun kerusakannya luar biasa untuk banyak kripto.
Selama Anda tidak peduli untuk melindungi dari tabrakan (Anda juga masih aman menggunakan md5 di hmac) dan Anda memang menginginkan kecepatan (terkadang Anda menginginkan hash yang lebih lambat) maka Anda masih dapat menggunakan md5 dengan percaya diri.
sumber
Saya bukan ahli dalam hal semacam ini, tetapi saya mengikuti komunitas keamanan dan banyak orang di sana menganggap hash md5 rusak. Saya akan mengatakan bahwa yang mana yang akan digunakan tergantung pada seberapa sensitif datanya dan aplikasi spesifiknya. Anda mungkin bisa lolos dengan hash yang sedikit kurang aman selama kuncinya bagus dan kuat.
sumber
Inilah saran saya untuk Anda:
Lihat di sini untuk makalah yang merinci algoritma untuk membuat tabrakan md5 dalam 31 detik dengan komputer desktop Intel P4.
http://eprint.iacr.org/2006/105
sumber