每次我使用:
BCrypt.HashPassword(password, 12)
它给了我不同的输出。根据我的阅读,为了检查登录详细信息,我必须拥有密码:
BCrypt.Verify(expectedPassword , hashed);
所以我很困惑:我认为我应该只保留我的数据库中的哈希值,而不是密码本身。我错过了什么?
答案 0 :(得分:1)
当你陈述时,你是100%正确的:
我认为我应该只保留我的数据库中的哈希值,而不是密码本身。
继我们的在线聊天之后,我们澄清了您要查询的问题,一般流程如下:
稍后......
需要注意的重要一点是,对于给定的散列算法,两个相同的字符串将始终散列为相同的值,因此这种比较是安全的。
标准是允许密码在仍在内存中时以纯文本格式显示。理论上可以在它到达服务器之前对其进行加密(例如,如果在提交之前存在用JavaScript编写的SHA-512过程来对密码进行哈希处理,那就不会让我感到惊讶),但这通常超出了甚至超过最复杂的安全要求。
答案 1 :(得分:0)
在代码中
BCrypt.Verify(expectedPassword,hashed);
您使用名称“expectedPassword”,我想知道这是否表明您的误解。这不是您希望用户输入的密码。这是他们试图用来登录的纯文本密码。
第二个参数hashed是他们的“官方”密码的散列值(即他们注册的密码)。
所以“散列”存储在数据库中。 “expectedPassword”是他们刚刚登录时输入的密码。您不存储该密码。