.NET çerçevesi 6 farklı karma algoritması ile birlikte gelir:
- MD5: 16 bayt (Karma süresi 500MB: 1462 ms)
- SHA-1: 20 bayt (1644 ms)
- SHA256: 32 bayt (5618 ms)
- SHA384: 48 bayt (3839 ms)
- SHA512: 64 bayt (3820 ms)
- RIPEMD: 20 bayt (7066 ms)
Bu işlevlerin her biri farklı performans gösterir; MD5 en hızlı ve RIPEMD en yavaştır.
MD5, yerleşik Guid tipine uyması avantajına sahiptir; ve bu tip 3 UUID'nin temelidir . SHA-1 karması, tip 5 UUID'nin temelidir.Bu da onları tanımlama için kullanımını gerçekten kolaylaştırır.
Ancak MD5 çarpışma saldırılarına karşı savunmasızdır , SHA-1 de daha zayıftır.
Hangi koşullar altında hangi karma algoritmasını kullanmalıyım?
Yanıtlanmasını gerçekten merak ettiğim özel sorular:
MD5'e güvenilmiyor mu? Normal durumlarda, MD5 algoritmasını kötü niyetli bir amaç olmadan kullandığınızda ve hiçbir üçüncü tarafın kötü niyetli bir amacı olmadığında HERHANGİ BİR çarpışma beklersiniz (aynı hash üreten iki rasgele bayt [] anlamına gelir)
RIPEMD ne kadar iyi? (eğer daha iyi ise) hesaplamak için 5 kat daha yavaş ama karma boyutu SHA1 ile aynıdır.
Dosya adlarını (veya diğer kısa dizeleri) karma yaparken kötü amaçlı olmayan çarpışmalar alma olasılığı nedir? (Örn. Aynı MD5 karmasına sahip 2 rastgele dosya adı) (MD5 / SHA1 / SHA2xx ile) Genel olarak kötü amaçlı olmayan çarpışmaların olasılığı nedir?
Kullandığım kriter bu:
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();
}