6 अलग हैशिंग एल्गोरिदम के साथ .NET फ्रेमवर्क जहाज:
- एमडी 5: 16 बाइट्स (हैश करने का समय 500 एमबी: 1462 एमएस)
- SHA-1: 20 बाइट्स (1644 एमएस)
- SHA256: 32 बाइट्स (5618 एमएस)
- SHA384: 48 बाइट्स (3839 एमएस)
- SHA512: 64 बाइट्स (3820 एमएस)
- RIPEMD: 20 बाइट्स (7066 एमएस)
इन कार्यों में से प्रत्येक अलग तरीके से करता है; MD5 सबसे तेज और RIPEMD सबसे धीमा है।
एमडी 5 का लाभ यह है कि यह अंतर्निहित गाइड प्रकार में फिट बैठता है; और यह टाइप 3 UUID का आधार है । SHA-1 हैश टाइप 5 UUID का आधार है। जिससे उन्हें पहचान के लिए उपयोग करना वास्तव में आसान हो जाता है।
एमडी 5 हालांकि टकराव के हमलों के प्रति संवेदनशील है , एसएचए -1 भी कमजोर है, लेकिन कुछ हद तक।
मुझे किन परिस्थितियों में हैशिंग एल्गोरिथम का उपयोग करना चाहिए?
विशेष रूप से मैं उत्तर देने के लिए उत्सुक हूं सवाल ये हैं:
क्या एमडी 5 पर भरोसा नहीं किया जाना है? सामान्य परिस्थितियों में जब आप MD5 एल्गोरिथ्म का उपयोग बिना किसी दुर्भावनापूर्ण इरादे के साथ करते हैं और किसी तीसरे पक्ष का कोई दुर्भावनापूर्ण इरादा नहीं है, तो आप किसी भी टकराव की उम्मीद करेंगे (जिसका अर्थ है दो मनमाने बाइट [] एक ही हैश का उत्पादन करना)
SHA1 की तुलना में RIPEMD कितना बेहतर है? (यदि इसका कोई बेहतर हो) गणना करने के लिए इसका 5 गुना धीमा है लेकिन हैश का आकार SHA1 के समान है।
फ़ाइल-नाम (या अन्य छोटे तार) हैशिंग को गैर-दुर्भावनापूर्ण टकराव मिलने की संभावना क्या है? (उदा। एक ही MD5 हैश के साथ 2 यादृच्छिक फ़ाइल-नाम) (MD5 / SHA1 / SHA2xx के साथ) सामान्य रूप से गैर-दुर्भावनापूर्ण टकराव के लिए क्या संभावनाएं हैं?
यह मेरे द्वारा उपयोग किया गया बेंचमार्क है:
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();
}