implementação .net de bcrypt


116

Alguém sabe de uma boa implementação do bcrypt, eu sei que esta pergunta foi feita antes, mas obteve muito pouca resposta. Estou um pouco inseguro de apenas escolher uma implementação que aparece no google e estou pensando que talvez seja melhor usar sha256 no namespace System.Security.Cryptography, pelo menos então eu sei que é compatível! Quais são seus pensamentos?

Respostas:


58

Parece que você está procurando o BCrypt.net :

BCrypt.net é uma implementação do código de hashing de senha baseado em Blowfish do OpenBSD, descrito em "A Future-Adaptable Password Scheme" por Niels Provos e David Mazières. É uma versão direta do jBCrypt de Damien Miller e, portanto, é lançado sob a mesma licença de estilo BSD. O código é totalmente gerenciado e deve funcionar com qualquer implementação CLI little-endian - ele foi testado com Microsoft .NET e Mono.


Sim, foi o que encontrei no Google também. Você usa ou sabe se é amplamente utilizado?
Gareth

2
A razão pela qual pensei em usar o BCrypt foi por causa deste artigo matasano.com/log/958/… e ele afirmava que o BCrypt é o caminho a percorrer.
Gareth

13
Só queria acrescentar uma observação que se você estiver usando BCrypt.net no Windows Server 2008, você precisará nomeá-lo com algo diferente de BCrypt.dll ou entrará em conflito com a nova API do Windows no Vista que chama funções em um 'bcrypt. dll ', portanto, se você tiver Bcrypt.net como Bcrypt.dll em seu bin / diretório do aplicativo da web, o Windows não conseguirá encontrar a dll correta e você obterá alguns erros crípticos.
thelsdj

5
Nota: A seguinte razão sobre porque usar bCrypt (para os interessados). codahale.com/how-to-safely-store-a-password
thames

1
Artigo movido: chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow- tables-what-you-need-to-know-about-s.html
Código Silverback

25

BCrypt.Net parece ser a biblioteca mais popular no momento

http://bcrypt.codeplex.com/

Aqui está um exemplo de como usá-lo para hash de senha:

[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));
    }

Saída de amostra:

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

Eu precisava de uma implementação BCrypt ao mover algo do PostgreSQL (que tem pg_crypto) para o SQLite (que não tem), então escrevi o meu próprio. Vendo por esta mensagem eu não sou o único precisando disso, decidi colocar uma licença nisso e liberá-lo. O URL é:

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

A implementação Blowfish por trás disso é uma versão da implementação C de domínio público de Bruce Schneier, e é bem-sucedida em todos os vetores de teste oficiais.

O código BCrypt que eu mesmo escrevi com base nas especificações. Eu também criei um script PHP que gera senhas aleatórias de comprimento de 0 a 100 e sais, criptografa-os e os envia para um arquivo de teste. O código C # corresponde a esses 100% das vezes até agora. Você pode usar o script e testar você mesmo.

A biblioteca também inclui o código PBKDF2 que funciona para qualquer HMAC em oposição à implementação somente SHA-1 do .Net (adicionado hoje - pretendo fazer SCrypt em C # em breve e isso requer PBKDF2 com HMAC-SHA256). Você também pode criar um esquema baseado nisso, se quiser.


0

Resposta errada, por favor veja abaixo

Todos os algoritmos pós-fixados "Cng" (Cryptography Next Generation) no .Net Framework agora usam bcrypt. Por exemplo, SHA256Cng .


Na verdade, o MS BCrypt (BestCrypt) não se refere ao baseado na cifra Blowfish - obrigado, RobbyD, pelo comentário.
Não apagará a resposta, caso mais alguém faça a mesma confusão.


1
Nesse contexto, BCrypt refere-se a um nome de PR da Microsoft BestCrypt. Consulte stackoverflow.com/questions/9711568/… para obter mais detalhes.
RobbyD

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.