Me encontré con BCrypt.net después de leer Jeff Atwood's post about storing passwords que me llevó a la recomendación de Thomas Ptacek a use BCrypt para almacenar contraseñas. Lo cual finalmente me llevó a this C# implementation of BCrypt¿Por qué BCrypt.net GenerateSalt (31) vuelve inmediatamente?
En los comentarios en el último enlace anterior, alguien preguntó "¿Por qué GenerateSalt (30) se toma para siempre, pero GenerateSalt (31) parece que no tarda en absoluto?"
Ejecuté BCrypt.HashPassword (contraseña, BCrypt.GenerateSalt (31)) y obtuve mi resultado en 0 milisegundos.
He estado ejecutando BCrypt.HashPassword ("contraseña", BCrypt.GenerateSalt (30)) durante más de 5 minutos y todavía no he obtenido ningún resultado.
Me doy cuenta de que probablemente no necesitemos una sal de 30 caracteres generada al azar para crear nuestros hash de contraseñas (o irreversible encryption in BCrypt's case) durante años. EDITAR Debería haber leído el código un poco, logRounds no tiene nada que ver con la longitud de sal. Gracias Aaronaught.
Así que, ¿por qué GenerateSalt (31) devuelve un valor casi al instante (cuando se debe tomar alrededor de dos veces más que GenerateSalt (30)
ACTUALIZACIÓN
aquí está la solución:?
private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
// ... snip ...
uint rounds = 1U << logRounds;
// ... snip
}
Mira, si probaran 'rondas' (en este punto -2^31) usando' rondas! = 0' en lugar de 'rondas> 0', ¡entonces todavía habría funcionado correctamente! :-P –
@Chris: Lección aprendida, siempre escribe tus bucles 'for' con'! = 'En caso de desbordamiento. : P Esta es exactamente la razón por la que es tan peligroso para las personas rodar sus propias funciones de cifrado; ¡incluso los expertos lo malinterpretan! Supongo que este error nunca se informó porque nadie ha intentado 31 rondas de registro antes ... – Aaronaught
es la solución correcta: uint rounds = 1U << logRounds; –