문제

.NET 프레임 워크에는 6 가지 해싱 알고리즘이 있습니다.

  • MD5 : 16 바이트 (해시 시간 500MB : 1462ms)
  • SHA-1 : 20 바이트 (1644ms)
  • SHA256 : 32 바이트 (5618ms)
  • SHA384 : 48 바이트 (3839ms)
  • SHA512 : 64 바이트 (3820ms)
  • Ripemd : 20 바이트 (7066ms)

이러한 각 기능은 다르게 수행됩니다. MD5는 가장 빠르며 가장 느린 것입니다.

MD5는 내장 안내 유형에 맞는 이점이 있습니다. 그리고 그것은 타입 3 uuid의 기초입니다.. SHA-1 해시는 유형 5 UUID의 기초입니다. 식별에 사용하기 쉽습니다.

그러나 MD5는 취약합니다 충돌 공격, SHA-1은 또한 취약하지만 적은 정도입니다.

어떤 조건에서 어떤 해싱 알고리즘을 사용해야합니까?

답이 정말 궁금한 질문은 다음과 같습니다.

  • MD5는 신뢰할 수 없습니까? 일반적인 상황에서 악의적 인 의도가없고 제 3자가 악의적 인 의도가없는 MD5 알고리즘을 사용할 때의 충돌을 기대할 수 있습니다 (동일한 해시를 생성하는 두 개의 임의 바이트 []를 의미).

  • Sha1보다 Ripemd는 얼마나 낫습니까? (더 나은 경우) 계산에는 5 배 느리지 만 해시 크기는 SHA1과 동일합니다.

  • 파일 이름 (또는 다른 짧은 문자열)을 해싱 할 때 비 악의적 인 충돌을받을 확률은 무엇입니까? (예를 들어, 동일한 MD5 HASH를 가진 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();
    }
도움이 되었습니까?

해결책

암호화에서 해시 기능은 세 가지 별도의 기능을 제공합니다.

  1. 충돌 저항: 누군가가 두 메시지를 찾는 것이 얼마나 어렵습니까 (어느 두 메시지) 동일하게 해시.
  2. 프리 이미지 저항: 해시가 주어지면 해시가 같은 다른 메시지를 찾는 것이 얼마나 어렵습니까? a라고도합니다 한 가지 방법 해시 기능.
  3. 두 번째 프리이 이미지 저항: 메시지가 주어지면 동일한 해시가있는 다른 메시지를 찾으십시오.

이러한 속성은 관련이 있지만 독립적입니다. 예를 들어, 충돌 저항은 두 번째 프리 이미지 저항을 의미하지만 다른 방법은 아닙니다. 주어진 응용 프로그램의 경우 이러한 속성 중 하나 이상이 필요한 요구 사항이 다릅니다. 서버에서 비밀번호를 보호하기위한 해시 함수는 일반적으로 프리 이미지 저항 만 필요하지만 메시지 소화에는 세 가지가 모두 필요합니다.

그러나 MD5는 충돌 저항성이 아니지만 충돌 저항이 필요하지 않은 응용 분야에서의 사용을 방해하지 않는 것으로 나타났습니다. 실제로, MD5는 종종 더 작은 키 크기와 속도가 유익한 응용 분야에서 여전히 사용됩니다. 즉, 결함으로 인해 연구원들은 새로운 시나리오에서 다른 해시 기능의 사용을 권장합니다.

SHA1에는 이론적으로 충돌이 2^80 단계보다 훨씬 작게 찾을 수있는 결함이 있습니다. 공격은 지속적으로 개정되고 있으며 현재 ~ 2^63 단계로 수행 할 수 있습니다. 이러한 이유로 NIST는 SHA1의 사용을 단계적으로 사용하여 SHA2 가족이 2010 년 이후에 사용되어야한다고 진술합니다.

SHA2는 SHA1에 따라 생성 된 새로운 해시 기능 패밀리입니다. 현재 SHA2 기능에 대한 알려진 공격은 없습니다. SHA256, 384 및 512는 모두 다른 키 길이를 사용하는 SHA2 제품군의 일부입니다.

Ripemd는 SHA 가족만큼 일반적으로 사용되지 않으므로 암호화 연구원들에 의해 면밀히 조사되지 않았다는 점을 제외하고는 너무 많이 언급 할 수 없습니다. 이런 이유만만으로도 SHA 기능을 사용하는 것이 좋습니다. 구현에서 사용하는 것은 매우 느리게 보이므로 덜 유용합니다.

결론적으로, 최상의 기능은 없습니다. 모두 필요한 것에 달려 있습니다. 각각의 결함을 염두에두면 올바른 해시 함수를 선택할 수 있습니다. 당신의 대본.

다른 팁

모든 해시 함수는 "파손"됩니다.

그만큼 비둘기 구멍 원리 당신은 당신이 할 수있는만큼 열심히 노력한다고 말합니다. 비둘기를 잘라내 지 않는 한 2 개의 구멍에 2 개 이상의 비둘기를 맞출 수 없습니다. 마찬가지로 2^128 슬롯에 2^128 + 1 숫자를 맞출 수 없습니다. 모든 해시 함수는 유한 크기의 해시를 초래하므로 "유한 크기" + 1 시퀀스를 검색하면 언제든지 충돌을 찾을 수 있음을 의미합니다. 그렇게하는 것은 불가능합니다. MD5를위한 것이 아니라 타래.

MD5/SHA1/SHA2XX는 기회 충돌이 없습니다

모든 해시 기능에는 충돌이 있습니다. 우연히 이러한 충돌을 겪는 것은 다음과 같습니다. 은하계 복권에서 우승. 즉 말하자면, 아무도 은부 간 복권을 얻지 못합니다, 그것은 복권이 작동하는 방식이 아닙니다. 우발적 인 MD5/SHA1/SHA2XXX 해시를 발견하지 못할 것입니다. 모든 사전, 모든 언어의 모든 단어는 다른 가치를 해시합니다. 지구 전체의 모든 기계에있는 모든 경로 이름에는 다른 MD5/SHA1/SHA2XXX HASH가 있습니다. 내가 그것을 어떻게 알 수 있습니까? 글쎄, 내가 전에 말했듯이, 아무도 은하계 복권을 얻지 못했습니다.

그러나 ... MD5가 고장났습니다

때로는 부러 졌다는 사실이 중요하지 않습니다.

그것이 서있는 것처럼 알려져 있지 않습니다 사전 이미지 또는 두 번째 사전 이미지 공격 MD5에서.

그래서 MD5에 대해 무엇이 깨진 것인지 물어볼 수 있습니까? 제 3자가 2 개의 메시지를 생성 할 수 있으며, 그 중 하나는 사악하고 다른 하나는 모두 같은 값으로 해시가 좋다. (충돌 공격)

그럼에도 불구하고, 현재 RSA 권장 사항은 사전 이미지 저항이 필요한 경우 MD5를 사용하지 않는 것입니다. 사람들은 보안 알고리즘과 관련하여주의를 기울이는 경향이 있습니다.

그렇다면 .NET에서 어떤 해시 기능을 사용해야합니까?

  • 속도/크기가 필요하고 생일 공격이나 사전 이미지 공격에 신경 쓰지 않는 경우 MD5를 사용하십시오.

나중에 이것을 반복하십시오. MD5 충돌 가능성은 없습니다, 악성 충돌을 신중하게 조작 할 수 있습니다. MD5에는 현재까지 알려진 사전 이미지 공격이 없지만 보안 전문가의 라인은 사전 이미지 공격을 방어 해야하는 경우 MD5를 사용해서는 안된다는 것입니다. SHA1도 마찬가지입니다.

모든 알고리즘이 사전 이미지 또는 충돌 공격을 방어 할 필요는 없습니다. HD에서 중복 파일에 대한 첫 번째 패스 검색의 사소한 사례를 사용하십시오.

  • 암호화 적으로 안전 해시 기능을 원한다면 SHA2XX 기반 기능을 사용하십시오.

아무도 SHA512 충돌을 찾지 못했습니다. 항상. 그들은 정말 열심히 노력했습니다. 그 문제에 대해 아무도 SHA256 또는 384 충돌을 찾지 못했습니다. .

  • 상호 운용성 시나리오를 사용하지 않는 한 SHA1 또는 Ripemd를 사용하지 마십시오.

Ripmed는 Shax와 MD5와 동일한 양의 조사를받지 못했습니다. Sha1과 Ripemd는 생일 공격에 취약합니다. 둘 다 .net의 MD5보다 느리고 20 바이트 크기가 어색합니다. 이러한 기능을 사용하는 것은 무의미합니다.

SHA1 충돌 공격은 2^52로 떨어졌으며 SHA1 충돌이 야생에서 나올 때까지 너무 오래 걸리지 않을 것입니다.

다양한 해시 함수에 대한 최신 정보는 해시 기능 동물원.

그러나 더 기다려주세요

가있는 빠른 해시 기능은 저주가 될 수 있습니다. 예를 들어 : 해시 함수에 대한 매우 일반적인 사용법은 비밀번호 저장입니다. 기본적으로, 알려진 임의의 문자열 (무지개 공격을 방해하기 위해)과 데이터베이스에 해시를 저장하는 암호의 해시를 계산합니다.

문제는 공격자가 데이터베이스의 덤프를 받으면 Brute-Force를 사용하여 암호를 매우 효과적으로 추측 할 수 있다는 것입니다. 그가 시도하는 모든 조합은 몇 밀리 초의 일부만 걸리며, 수십만 개의 암호를 두 번째로 시험해 볼 수 있습니다.

이 문제를 해결하기 위해 bcrypt 알고리즘을 사용할 수 있으며, BCRYPT를 사용하여 시스템을 공격하면 공격자의 속도가 느려지도록 설계되었습니다. 최근에 Scrypt 일부 헤드 라인을 만들었으며 일부는 BCrypt보다 효과적이라고 생각하지만 .NET 구현은 모릅니다.

업데이트:

시간이 바뀌었고, 우리는 SHA3 우승자가 있습니다. 사용하는 것이 좋습니다 Keccak (일명 SHA3) SHA3 콘테스트의 우승자.

원래 답변 :

가장 약한 것의 가장 강한 순서로 다음과 같이 말할 것입니다.

  1. Ripemd Broken, 절대 사용해서는 안됩니다 이 PDF에서 볼 수 있듯이
  2. MD-5 깨진, 절대 사용해서는 안되며 노트북으로 2 분 안에 깨질 수 있습니다
  3. SHA-1 부서진, 절대 사용해서는 안되며 원칙적으로 무너지고, 일주일까지 공격이 나아지고 있습니다.
  4. SHA-2 약한 것은 아마도 앞으로 몇 년 안에 깨질 것입니다. 몇 가지 약점이 발견되었습니다. 일반적으로 키 크기가 높을수록 해시 기능이 깨지기가 더 어려워집니다. 키 크기 = 강도가 항상 사실은 아니지만 대부분 사실입니다. 따라서 SHA-256은 아마도 SHA-512보다 약할 것입니다.
  5. Skein 알려진 약점이 없음, SHA-3의 후보입니다. 그것은 상당히 새롭고 테스트되지 않았습니다. 그것은 많은 언어로 구현되었습니다.
  6. MD6 알려진 약점은 SHA-3의 후보입니다. 아마도 Skien보다 강하지 만 단일 코어 머신에서는 느립니다. Skien처럼 그것은 테스트되지 않았습니다. 일부 보안 마인드 개발자는이를 사용하고 있습니다 미션 비판적 역할.

개인적으로 나는 MD6을 사용할 수 없기 때문에 나는 너무 편집증이 아니기 때문에 나는 MD6을 사용할 것이다. 속도가 진정한 관심사라면 Skein 또는 SHA-256을 살펴보십시오.

MD5의 방어에는 임의의 MD5 해시가있는 파일을 생성하는 알려진 방법이 없습니다. 원래 저자는 작업 충돌을 미리 계획해야합니다. 따라서 수신자가 발신자를 신뢰하면 MD5는 괜찮습니다. 서명자가 악의적이면 MD5가 파손되었지만, 중간의 사람의 공격에 취약한 것으로 알려져 있지 않습니다.

당신이 사용하는 것은 실제로 당신이 그것을 사용하는 것에 달려 있습니다. 파일이 대중 교통에서 손상되지 않고 보안에 대해 걱정하지 않도록하려면 빠르고 작게 이동하십시오. 수십억 달러의 연방 구제 금융 계약에 대한 디지털 서명이 필요하고 위조되지 않도록 해야하는 경우, 스프핑하기 어려워지고 느리게하십시오.

나는 많은 암호화에 대한 압도적 인 상처에도 불구하고 MD5가 여전히 MD5를 광범위하게 사용한다는 것을 차임하고 싶습니다.

충돌로부터 보호하지 않는 한 (HMAC에서도 MD5를 사용하는 것이 안전합니다) 속도를 원합니다 (때로는 속도가 느린 해시를 원합니다). MD5를 자신있게 사용할 수 있습니다.

It would be a good ideea to take a look at the Blake2 algorythm.

설명 된 바와 같이, 그것은 MD5보다 빠르며 적어도 SHA-3만큼 안전합니다. 또한 구현됩니다 여러 소프트웨어 응용 프로그램, Winrar를 포함하여.

나는 이런 종류의 전문가가 아니지만 보안 커뮤니티를 따라 잡으며 많은 사람들이 MD5 해시가 깨진 것을 고려합니다. 사용해야 할 것은 데이터가 얼마나 민감한 지, 특정 응용 프로그램에 달려 있다고 말합니다. 열쇠가 좋고 강한 한 약간 덜 안전한 해시로 도망 갈 수 있습니다.

다음은 귀하를위한 내 제안입니다.

  1. 공격을 예상하면 MD5를 잊어야 할 것입니다. 많이있다 무지개 테이블 그들에게 온라인으로, RIAA와 같은 기업은 해시와 동등한 시퀀스를 생산할 수있는 것으로 알려져 있습니다.
  2. a 소금 가능하다면. 메시지에 메시지 길이를 포함 시키면 유용한 해시 충돌을 만들기가 매우 어려울 수 있습니다.
  3. 일반적으로 더 많은 비트는 (비둘기 구멍 원칙에 따라) 충돌이 줄어들고 느리게, 아마도 더 안전 할 수 있습니다 (취약점을 찾을 수있는 수학 천재가 아니라면).

데스크탑 인텔 P4 컴퓨터로 31 초 안에 MD5 충돌을 생성하기위한 알고리즘을 자세히 설명하는 용지를 참조하십시오.

http://eprint.iacr.org/2006/105

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top