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();
}