.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();
}
답변
암호화에서 해시 함수는 세 가지 별도의 함수를 제공합니다.
- 충돌 저항 : 두 개의 메시지 (찾을 수있는 사람을 얼마나 열심히 있는 두 개의 메시지) 그 해시 동일합니다.
- Preimage Resistance : 해시가 주어지면 동일한 해시를 가진 다른 메시지를 찾기가 얼마나 어렵습니까? 단방향 해시 함수 라고도 합니다 .
- 두 번째 사전 이미지 저항 : 메시지가 주어지면 동일한 해시 메시지를 찾으십시오.
이러한 속성은 관련이 있지만 독립적입니다. 예를 들어 충돌 저항은 두 번째 사전 이미지 저항을 의미하지만 반대의 경우는 아닙니다. 특정 응용 프로그램에 대해 이러한 속성 중 하나 이상이 필요한 다른 요구 사항이 있습니다. 서버에서 비밀번호를 보호하기위한 해시 기능은 일반적으로 사전 이미지 저항 만 필요하며 메시지 요약에는 세 가지가 모두 필요합니다.
그러나 MD5는 내 충격성이 아니라 내 충격성이 요구되지 않는 응용 분야에서의 사용을 배제하지 않는 것으로 나타났습니다. 실제로 MD5는 키 크기와 속도가 작은 응용 프로그램에서 여전히 사용됩니다. 즉, 결함으로 인해 연구자들은 새로운 시나리오에서 다른 해시 함수를 사용할 것을 권장합니다.
SHA1에는 이론적으로 길이가 긴 보안 해시 함수에 필요한 2 ^ 80 단계보다 적은 충돌이 발견 될 수있는 결함이 있습니다. 공격은 지속적으로 수정되고 있으며 현재 ~ 2 ^ 63 단계로 수행 할 수 있습니다. 현재 컴퓨팅 영역 내에서는 거의 없습니다. 이러한 이유로 NIST는 2010 년 이후에 SHA2 제품군을 사용해야한다는 SHA1 사용을 단계적으로 폐지하고 있습니다.
SHA2는 SHA1에 따라 생성 된 새로운 해시 함수 제품군입니다. 현재 SHA2 기능에 대한 알려진 공격은 없습니다. SHA256, 384 및 512는 모두 서로 다른 키 길이를 사용하는 SHA2 제품군의 일부입니다.
RIPEMD 나는 SHA 가족만큼 일반적으로 사용되지 않으므로 암호 연구자들에 의해 면밀히 조사되지 않았다는 점을 제외하고는 너무 많이 언급 할 수 없습니다. 이러한 이유로 SHA 기능을 사용하는 것이 좋습니다. 사용중인 구현에서는 꽤 느리게 보이므로 유용하지 않습니다.
결론적으로 최상의 기능은 없습니다. 모두 필요한 기능에 따라 다릅니다. 각각의 결점을 염두에 두면 시나리오에 적합한 해시 기능을 가장 잘 선택할 수 있습니다.
답변
모든 해시 함수가 “손상됨”
비둘기 집 원리는 (당신이 비둘기를 잘라하지 않는 한) 당신이이 개 구멍에 2 개 이상의 비둘기 맞지 않는 것 같은 하드로 그 시도를 말한다. 마찬가지로 2 ^ 128 슬롯에 2 ^ 128 + 1 개의 숫자를 넣을 수 없습니다. 모든 해시 함수는 유한 크기의 해시를 생성하므로 “유한 크기”+ 1 시퀀스를 통해 검색하면 항상 충돌을 찾을 수 있습니다. 그렇게 할 수는 없습니다. MD5 및 Skein이 아닙니다 .
MD5 / SHA1 / Sha2xx는 우연의 충돌이 없습니다
모든 해시 함수에는 충돌이 있습니다. 우연히 이러한 충돌을 겪는 것은 은하계 복권에서 당첨되 는 것과 같습니다 . 다시 말해, 아무도 은하 간 복권 에서 당첨 되지 않으며, 복권이 작동하는 방식이 아닙니다. 실수로 MD5 / SHA1 / SHA2XXX 해시를 우연히 만나지 않을 것입니다. 모든 사전의 모든 언어에서 모든 단어는 다른 값으로 해시됩니다. 전체 행성의 모든 컴퓨터에있는 모든 경로 이름은 다른 MD5 / SHA1 / SHA2XXX 해시를 갖습니다. 내가 어떻게 알 수 있는지 물어보십시오. 글쎄, 내가 전에 말했듯이, 아무도 은하계 복권에서 당첨되지 않습니다.
그러나 … MD5가 고장났습니다.
때때로 그것의 깨진 사실은 중요하지 않습니다 .
MD5에 대해서는 알려진 사전 이미지 또는 두 번째 사전 이미지 공격 이 없습니다 .
MD5와 관련하여 어떤 문제가 발생했을까요? 타사가 2 개의 메시지를 생성 할 수 있습니다. 그 중 하나는 EVIL이고 다른 하나는 동일한 값으로 해시되는 GOOD입니다. ( 충돌 공격 )
그럼에도 불구하고 현재 RSA 권장 사항은 사전 이미지 저항이 필요한 경우 MD5를 사용하지 않는 것입니다. 사람들은 보안 알고리즘과 관련하여주의를 기울이는 경향이 있습니다.
.NET에서 어떤 해시 함수를 사용해야합니까?
- 속도 / 크기가 필요하고 생일 공격이나 사전 이미지 공격에 신경 쓰지 않으면 MD5를 사용하십시오.
나 후에 이것을 반복하십시오, MD5 충돌 가능성은 없습니다 , 악의적 인 충돌은 신중하게 설계 될 수 있습니다. MD5에서 현재까지 알려진 사전 이미지 공격은 없지만 보안 전문가의 말에 따르면 사전 이미지 공격을 방어해야하는 경우 MD5를 사용해서는 안됩니다. SAME는 SHA1로갑니다 .
모든 알고리즘이 사전 이미지 또는 충돌 공격을 방어 할 필요는 없습니다. HD에서 중복 파일에 대한 첫 번째 패스 검색의 사소한 경우를 생각해보십시오.
- 암호로 안전한 해시 기능을 원하면 SHA2XX 기반 기능을 사용하십시오.
아무도 SHA512 충돌을 발견하지 못했습니다. 이제까지. 그들은 정말 열심히 노력했습니다. 그 문제로 인해 아무도 SHA256 또는 384 충돌을 발견하지 못했습니다. .
- 상호 운용성 시나리오가 아닌 경우 SHA1 또는 RIPEMD를 사용하지 마십시오.
RIPMED는 SHAX 및 MD5와 동일한 양의 정밀 조사를받지 못했습니다. SHA1과 RIPEMD는 생일 공격에 취약합니다. 그들은 .NET에서 MD5보다 느리고 어색한 20 바이트 크기로 제공됩니다. 이 기능을 사용하는 것은 의미가 없습니다. 잊어 버리십시오.
SHA1 충돌 공격은 2 ^ 52로 내려 가며 SHA1 충돌이 발생할 때까지 너무 오래 걸리지 않습니다.
다양한 해시 함수에 대한 최신 정보 는 해시 함수 zoo를 살펴보십시오 .
그러나 더 기다립니다
빠른 해시 기능 을 갖는 것은 저주가 될 수 있습니다. 예를 들어, 해시 함수의 가장 일반적인 사용법은 암호 저장입니다. 기본적으로 알려진 임의 문자열과 함께 암호 해시를 계산하고 (무지개 공격을 막기 위해) 해시를 데이터베이스에 저장합니다.
문제는 공격자가 데이터베이스 덤프를 얻는 경우 무차별 대입을 사용하여 암호를 효과적으로 추측 할 수 있다는 것입니다. 그가 시도하는 모든 조합은 단지 밀리 초 만 걸리며 초당 수십만 개의 암호를 시험해 볼 수 있습니다.
이 문제를 해결하기 위해 bcrypt 알고리즘을 사용할 수 있으며, bcrypt를 사용하여 시스템을 공격하는 경우 공격자가 크게 느려지도록 느리게 설계되었습니다. 최근에 scrypt 는 약간의 헤드 라인을 만들었으며 일부 사람들 은 bcrypt 보다 더 효과적이라고 생각하지만 .Net 구현에 대해서는 알지 못합니다.
답변
최신 정보:
시간이 바뀌었고 SHA3 우승자가 있습니다. SHA3 컨테스트의 keccak (일명 SHA3 ) 우승자를 사용하는 것이 좋습니다 .
원래 답변 :
가장 약한 것부터 가장 강한 것까지 :
- RIPEMD BROKEN, 이 pdf에서 볼 수 있듯이 절대 사용해서는 안됩니다
- MD-5 BROKEN, 절대 사용하지 말 것, 랩탑으로 2 분 안에 파손될 수 있음
- SHA-1 BROKEN, 절대 사용해서는 안 됨, 원칙적으로 손상됨, 주별 공격 수 증가
- SHA-2 약, 아마 앞으로 몇 년 안에 깨질 것입니다. 몇 가지 약점이 발견되었습니다. 일반적으로 키 크기가 클수록 해시 기능이 더 어려워집니다. 키 크기 = 강도가 항상 사실은 아니지만 대부분 사실입니다. 따라서 SHA-256은 아마도 SHA-512보다 약할 것입니다.
- Skein NO KNOWN WEAKNESSES 는 SHA-3 후보입니다 . 상당히 새롭고 테스트되지 않았습니다. 많은 언어로 구현되었습니다.
- MD6 NO KNOWN WEAKNESSES는 SHA-3의 또 다른 후보입니다. 아마도 Skien보다 강력하지만 단일 코어 시스템에서는 느립니다. Skien처럼 테스트되지 않았습니다. 일부 보안을 염두에 둔 개발자는 미션 크리티컬 역할 에서이를 사용하고 있습니다.
개인적으로는 MD6을 사용합니다. 왜냐하면 절대 편집증이 될 수 없기 때문입니다. 속도가 진짜 관심사라면 Skein 또는 SHA-256을 살펴볼 것입니다.
답변
MD5의 방어에는 임의의 MD5 해시로 파일을 생성하는 알려진 방법이 없습니다. 원래 작성자는 충돌이 발생하도록 미리 계획해야합니다. 따라서 수신자가 발신자를 신뢰하면 MD5는 정상입니다. 서명자가 악의적 인 경우 MD5가 손상되었지만 중간자 (man-in-the-middle) 공격에 취약한 것으로 알려져 있지 않습니다.
답변
어떤 것을 사용하는지는 실제로 무엇을 사용하는지에 달려 있습니다. 파일이 전송 중에 손상되지 않고 보안에 관심이 없는지 확인하려면 빠르고 작게 진행하십시오. 수십억 달러에 달하는 연방 구제 금융 계약에 대한 디지털 서명이 필요하고 위조되지 않았는지 확인해야하는 경우 스푸핑이 느려지고 느려집니다.
답변
md5가 찢어지기 전에 많은 암호가 압도적으로 손상되었지만 md5를 광범위하게 사용하고 있습니다.
충돌로부터 보호하지 않아도 (여전히 hmac에서 md5를 사용하는 것이 안전합니다) 속도를 원한다면 (때로는 느린 해시를 원할 경우) md5를 자신있게 사용할 수 있습니다.
답변
BLAKE2 알고리즘을 살펴 보는 것이 좋습니다 .
설명했듯이 MD5보다 빠르며 최소한 SHA-3만큼 안전합니다. 또한 WinRar를 포함한 여러 소프트웨어 응용 프로그램으로 구현됩니다 .