กรอบงาน. NET มาพร้อมกับอัลกอริทึมการแฮช 6 แบบ:
- MD5: 16 ไบต์ (เวลาที่แฮช 500MB: 1462 ms)
- SHA-1: 20 ไบต์ (1644 มิลลิวินาที)
- SHA256: 32 ไบต์ (5618 ms)
- SHA384: 48 ไบต์ (3839 มิลลิวินาที)
- SHA512: 64 ไบต์ (3820 มิลลิวินาที)
- RIPEMD: 20 ไบต์ (7066 ms)
แต่ละฟังก์ชันเหล่านี้ทำงานแตกต่างกัน MD5 นั้นเร็วที่สุดและ RIPEMD นั้นช้าที่สุด
MD5 มีข้อได้เปรียบที่เหมาะกับ Guid ประเภทในตัว; และมันก็เป็นพื้นฐานของประเภท 3 UUID แฮช SHA-1 เป็นพื้นฐานของประเภท 5 UUID ซึ่งทำให้พวกเขาใช้งานได้ง่ายมากสำหรับการระบุตัวตน
อย่างไรก็ตาม MD5 มีความเสี่ยงที่จะถูกโจมตีจากการชน SHA-1 ก็มีความเสี่ยงเช่นกัน แต่ในระดับที่น้อยกว่า
ฉันควรใช้อัลกอริทึมการแปลงแป้นพิมพ์แบบใดภายใต้เงื่อนไขใด
คำถามที่เฉพาะเจาะจงฉันอยากรู้อยากเห็นคำตอบคือ:
MD5 ไม่น่าเชื่อถือใช่ไหม ภายใต้สถานการณ์ปกติเมื่อคุณใช้อัลกอริทึม MD5 โดยไม่มีเจตนาที่เป็นอันตรายและไม่มีบุคคลที่สามที่มีเจตนาร้ายใด ๆ ที่คุณคาดหวังว่าจะมีการชนกันใด ๆ
RIPEMD ดีกว่า SHA1 มากแค่ไหน? (ถ้ามันดีกว่า) มันช้ากว่าการคำนวณ 5 เท่า แต่ขนาดแฮชจะเหมือนกับ SHA1
อัตราต่อรองของการชนที่ไม่เป็นอันตรายเมื่อ hashing ชื่อไฟล์ (หรือสตริงสั้น ๆ อื่น ๆ ) คืออะไร? (เช่นชื่อไฟล์สุ่ม 2 รายการที่มีแฮช MD5 เดียวกัน) (โดยมี 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();
}