Je suis tombé sur BCrypt.net après avoir lu Jeff Atwood's post about storing passwords qui m'a conduit à la recommandation de Thomas Ptacek à use BCrypt pour stocker les mots de passe. Qui m'a finalement conduit à this C# implementation of BCryptPourquoi BCrypt.net GenerateSalt (31) revient-il tout de suite?
Dans les commentaires sur le dernier lien ci-dessus quelqu'un a demandé "Pourquoi GenerateSalt (30) prend pour toujours, mais GenerateSalt (31) ne semble pas prendre du temps?" J'ai exécuté BCrypt.HashPassword (mot de passe, BCrypt.GenerateSalt (31)) et obtenu mon résultat en 0 millisecondes.
Je cours BCrypt.HashPassword ("mot de passe", BCrypt.GenerateSalt (30)) depuis plus de 5 minutes maintenant et n'a toujours pas de résultat.
Je réalise que nous n'aurons probablement pas besoin d'un sel de 30 caractères généré aléatoirement pour créer nos hachages de mots de passe (ou irreversible encryption in BCrypt's case) depuis des années. EDIT J'aurais dû lire un peu le code, logRounds n'a rien à voir avec la longueur du sel. Merci Aaronaught.
Alors, pourquoi GenerateSalt (31) retourne une valeur presque instantanément (quand il devrait prendre environ deux fois plus longtemps que GenerateSalt (30)
MISE À JOUR
est la solution ici:
private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
// ... snip ...
uint rounds = 1U << logRounds;
// ... snip
}
Voir, s'ils ont testé 'rounds' (à ce moment-là -2^31) en utilisant' rounds! = 0' au lieu de 'rounds> 0', alors cela aurait quand même fonctionné correctement! :-P –
@Chris: Leçon apprise, écrivez toujours vos boucles 'for' avec'! = 'En cas de débordement! : P C'est exactement pourquoi il est si dangereux pour les gens de rouler leurs propres fonctions de chiffrement; Même les experts se trompent! Je suppose que ce bug n'a jamais été signalé car personne n'a jamais essayé 31 rondes de journaux auparavant ... – Aaronaught
est-ce la bonne correction: uint rounds = 1U << logRounds; –