.NET 프레임 워크에는 6 가지 해시 알고리즘이 제공됩니다.
- MD5 : 16 바이트 (500MB 해시 시간 : 1462ms)
- SHA-1 : 20 바이트 (1644ms)
- SHA256 : 32 바이트 (5618ms)
- SHA384 : 48 바이트 (3839ms)
- SHA512 : 64 바이트 (3820ms)
- RIPEMD : 20 바이트 (7066ms)
이러한 기능은 각각 다르게 수행됩니다. MD5가 가장 빠르며 RIPEMD가 가장 느립니다.
MD5는 내장 Guid 유형에 적합하다는 이점이 있습니다. 그리고 이것은 유형 3 UUID의 기초입니다 . SHA-1 해시는 유형 5 UUID의 기초입니다. 식별에 사용하기가 정말 쉽습니다.
그러나 MD5는 충돌 공격에 취약하고 SHA-1도 취약하지만 덜 취약합니다.
어떤 조건에서 어떤 해싱 알고리즘을 사용해야합니까?
대답이 궁금한 특정 질문은 다음과 같습니다.
MD5를 신뢰할 수 없습니까? 악의적 인 의도없이 MD5 알고리즘을 사용하고 악의적 인 의도를 가지고 있지 않은 MD5 알고리즘을 사용하는 정상적인 상황에서는 모든 충돌을 예상 할 수 있습니다 (두 개의 임의 바이트 []가 동일한 해시를 생성 함)
SHAPE보다 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();
}