bcrypt의 .net 구현


116

누구든지 bcrypt의 좋은 구현을 알고 있습니까?이 질문이 이전에 요청되었지만 응답이 거의 없다는 것을 알고 있습니다. 나는 Google에서 나타나는 구현을 선택하는 데 약간 확신이 없으며 System.Security.Cryptography 네임 스페이스에서 sha256을 사용하는 것이 더 나을 것이라고 생각하고 있습니다. 적어도 지원된다는 것을 압니다! 당신의 생각은 무엇입니까?

답변:


58

BCrypt.net을 찾는 것 같습니다 .

BCrypt.net은 Niels Provos와 David Mazières의 "A Future-Adaptable Password Scheme"에 설명 된 OpenBSD의 Blowfish 기반 암호 해싱 코드의 구현입니다. Damien Miller에 의해 jBCrypt의 직접 포트이므로 동일한 BSD 스타일 라이센스로 릴리스됩니다. 코드는 완전히 관리되며 모든 리틀 엔디안 CLI 구현에서 작동해야합니다. Microsoft .NET 및 Mono로 테스트되었습니다.


예, Google에서도 찾은 것입니다. 그것을 사용합니까, 아니면 널리 사용되는지 알고 있습니까?
Gareth

2
내가 BCrypt 사용에 대해 생각한 이유는이 기사 matasano.com/log/958/… 때문이며 BCrypt가 갈 길이라고 주장했습니다.
Gareth

13
Windows Server 2008에서 BCrypt.net을 사용하는 경우 BCrypt.dll 이외의 이름을 지정해야합니다. 그렇지 않으면 'bcrypt.dll'에서 함수를 호출하는 Vista의 새 Windows API와 충돌합니다. 따라서 웹 앱 bin / 디렉터리에 Bcrypt.dll로 Bcrypt.net이있는 경우 Windows는 올바른 dll을 찾을 수 없으며 몇 가지 알 수없는 오류가 발생합니다.
thelsdj

5
참고 : bCrypt를 사용하는 이유는 다음과 같습니다 (관심있는 분들을 위해). codahale.com/how-to-safely-store-a-password
thames

1
기사 이동 : chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow- tables-what-you-need-to-know-about-s.html
Code Silverback

25

BCrypt.Net은 현재 가장 인기있는 라이브러리 인 것 같습니다.

http://bcrypt.codeplex.com/

다음은 해싱 암호에 사용하는 방법의 예입니다.

[TestMethod]
    public void BCryptTest()
    {
        const string password = "PASSWORD";
        const int workFactor = 13;

        var start = DateTime.UtcNow;
        var hashed = BCrypt.Net.BCrypt.HashPassword(password, workFactor);
        var end = DateTime.UtcNow;

        Console.WriteLine("hash length is {0} chars", hashed.Length);
        Console.WriteLine("Processing time is {0} with workFactor {1}", end - start, workFactor);
        Console.WriteLine("Hashed password: {0} ", hashed);
        Console.WriteLine("correct password {0}", BCrypt.Net.BCrypt.Verify("PASSWORD", hashed));
        Console.WriteLine("incorrect password {0}", BCrypt.Net.BCrypt.Verify("PASSWORd", hashed));
    }

샘플 출력 :

hash length is 60 chars
Processing time is 00:00:01.0020000 with workFactor 13
Hashed password: $2a$13$iBqdG7ENBABEargiyzGlTexPsmviF/qrFxUZB2zce7HKF6MoBNhEq 
correct password True
incorrect password False


6

PostgreSQL (pg_crypto 포함)에서 SQLite (없음)로 이동할 때 BCrypt 구현이 필요했기 때문에 직접 작성했습니다. 이 메시지를보고 나는 이것을 필요로하는 유일한 사람이 아니다. 나는 그것에 라이선스를 박아 풀어 놓기로 결정했다. URL은 다음과 같습니다.

http://zer7.com/software.php?page=cryptsharp

그 뒤에있는 Blowfish 구현은 Bruce Schneier의 공용 도메인 C 구현 포트이며 모든 공식 테스트 벡터에서 성공합니다.

사양에 따라 직접 작성한 BCrypt 코드입니다. 나는 또한 길이가 0에서 100 사이의 임의의 암호와 솔트를 생성하고 암호화하여 테스트 파일로 출력하는 PHP 스크립트를 만들었습니다. C # 코드는 지금까지 100 % 일치합니다. 스크립트를 사용하고 직접 테스트 할 수 있습니다.

이 라이브러리에는 .Net의 SHA-1 전용 구현과는 반대로 모든 HMAC에서 작동하는 PBKDF2 코드도 포함되어 있습니다 (오늘 추가됨-곧 C #에서 SCrypt를 수행 할 예정이며 HMAC-SHA256과 함께 PBKDF2가 필요함). 원한다면 이것에 기초한 계획을 만들 수도 있습니다.


0

오답입니다. 아래를 참조하세요.

.Net Framework의 모든 "Cng"(Cryptography Next Generation) 후위 알고리즘은 이제 bcrypt를 사용합니다. 예 : SHA256Cng .


실제로 MS BCrypt (BestCrypt)는 Blowfish 암호를 기반으로 한 것을 참조하지 않습니다. 코멘트에 대해 감사합니다. RobbyD.
다른 사람이 같은 혼동을하는 경우를 대비하여 답변을 삭제하지 않습니다.


1
이 컨텍스트에서 BCrypt는 Microsoft PR 이름 BestCrypt를 나타냅니다. 자세한 내용은 stackoverflow.com/questions/9711568/… 을 참조하십시오.
RobbyD

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.