在阅读了Jeff Atwood关于存储密码的帖子后,我偶然发现了BCrypt.net,这让我想到了Thomas Ptacek建议使用BCrypt来存储密码.这最终促成了我对BCrypt的C#实现
在上面最后一个链接的评论中,有人问"为什么GenerateSalt(30)永远服用,但GenerateSalt(31)似乎根本不花时间?"
我运行了BCrypt.HashPassword(密码,BCrypt.GenerateSalt(31))并在0毫秒内得到了我的结果.
我已经运行BCrypt.HashPassword("密码",BCrypt.GenerateSalt(30))超过5分钟,但仍然没有结果.
我意识到我们可能不需要随机生成的30个字符的盐来创建我们的密码哈希值(或BCrypt案例中的不可逆加密)多年.编辑我应该读一下代码,logRounds与salt长度没有任何关系.谢谢Aaronaught.
那么,为什么GenerateSalt(31)几乎立即返回一个值(当它需要大约两倍于GenerateSalt(30)的时候?
UPDATE
这是修复:
private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
// ... snip ...
uint rounds = 1U << logRounds;
// ... snip
}
Run Code Online (Sandbox Code Playgroud)