Implementación .net de bcrypt

116

¿Alguien sabe de una buena implementación de bcrypt? Sé que esta pregunta se ha hecho antes pero obtuvo muy poca respuesta. No estoy seguro de elegir una implementación que aparezca en Google y creo que es mejor que use sha256 en el espacio de nombres System.Security.Cryptography, ¡al menos entonces sé que es compatible! ¿Qué pensamientos tienes?

Gareth
fuente

Respuestas:

58

Parece que estás buscando BCrypt.net :

BCrypt.net es una implementación del código hash de contraseña basado en Blowfish de OpenBSD, descrito en "Un esquema de contraseña adaptable al futuro" por Niels Provos y David Mazières. Es un puerto directo de jBCrypt de Damien Miller y, por lo tanto, se publica bajo la misma licencia estilo BSD. El código está completamente administrado y debería funcionar con cualquier implementación de CLI little-endian; se ha probado con Microsoft .NET y Mono.

ine
fuente
Sí, ese fue el que encontré con Google también. ¿Lo usa o sabe si se usa mucho?
Gareth
2
La razón por la que pensé en usar BCrypt fue por este artículo matasano.com/log/958/… y afirmó que BCrypt es el camino a seguir.
Gareth
13
Solo quería agregar una nota de que si está usando BCrypt.net en Windows Server 2008, deberá nombrarlo de otra manera que no sea BCrypt.dll o entrará en conflicto con la nueva API de Windows en Vista que llama a funciones en un 'bcrypt. dll ', por lo que si tiene Bcrypt.net como Bcrypt.dll en el directorio bin / de su aplicación web, Windows no podrá encontrar el dll correcto y obtendrá algunos errores crípticos.
thelsdj
5
Nota: La siguiente razón sobre por qué usar bCrypt (para aquellos interesados). codahale.com/how-to-safely-store-a-password
thames
1
Artículo movido: 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 parece ser la biblioteca más popular en este momento

http://bcrypt.codeplex.com/

Aquí hay un ejemplo de cómo usarlo para hash de contraseña:

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

Salida de muestra:

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
Maksym Kozlenko
fuente
6

Necesitaba una implementación de BCrypt al mover algo de PostgreSQL (que tiene pg_crypto) a SQLite (que no lo tiene), así que escribí la mía propia. Al ver este mensaje, no soy el único que necesita esto, he decidido ponerle una licencia y liberarlo. La URL es:

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

La implementación de Blowfish detrás de él es un puerto de la implementación de C de dominio público de Bruce Schneier, y tiene éxito en todos los vectores de prueba oficiales.

El código de BCrypt lo escribí yo mismo según la especificación. También creé un script PHP que genera contraseñas aleatorias de longitud 0 a 100 y las sales, las codifica y las envía a un archivo de prueba. El código C # coincide con estos el 100% del tiempo hasta ahora. Le invitamos a utilizar el script y probarlo usted mismo.

La biblioteca también incluye código PBKDF2 que funciona para cualquier HMAC a diferencia de la implementación solo SHA-1 de .Net (agregada hoy; tengo la intención de hacer SCrypt en C # pronto y eso requiere PBKDF2 con HMAC-SHA256). También podría crear un esquema basado en esto, si quisiera.

Zer
fuente
0

Respuesta incorrecta, consulte a continuación

Todos los algoritmos postfixed "Cng" (Cryptography Next Generation) en .Net Framework ahora usan bcrypt. Por ejemplo, SHA256Cng .


En realidad, el MS BCrypt (BestCrypt) no se refiere al que se basa en el cifrado Blowfish; gracias, RobbyD, por el comentario.
No eliminará la respuesta, en caso de que alguien más tenga la misma confusión.

Ioanna
fuente
1
BCrypt en ese contexto se refiere a un nombre de relaciones públicas de Microsoft BestCrypt. Consulte stackoverflow.com/questions/9711568/… para obtener más detalles.
RobbyD