密码盐应该存储在哪里,如何获取它?

7

我负责在我们的 .Net MVC 4 Web 应用程序中进行身份验证,但是我在密码哈希、存储和验证方面遇到了问题。

目前计划使用两个盐值,一个动态盐(每个用户都不同)和一个静态盐(Web 应用程序常量),以及强大的哈希函数。

给定一个简单的用户表,其中包含用户名和密码:

  • 我应该在用户表中的一列中存储每个用户的盐值吗?

我的担心是这样做会导致我只能通过用户名从数据库中获取用户并将其存储在 Web 应用程序内存中。这可能会有什么问题吗?理想情况下,我希望这是一步/一个 SQL 请求身份验证。

我是否过于担心了?是否有替代“每个用户”盐值的方法,可以实现一步身份验证?


同样的问题:https://dev59.com/hXM_5IYBdhLWcg3wzmnL - user956584
2个回答

4
盐可以与密码哈希一起存储,因此您可以为每个密码创建一个盐,而不是为每个用户创建一个盐。对于密码哈希函数(例如BCrypt或PBKDF2这样的慢密钥派生函数),将盐明文作为密码哈希的一部分返回是一种常见做法,这意味着您可以在单个数据库字段中存储盐和哈希。

要验证输入的密码,首先必须搜索密码哈希(使用用户名或电子邮件),然后函数可以从存储的密码哈希中提取所使用的盐,并将其用于比较哈希值。那实际上回答了您的问题,数据库通常没有适当的功能来散列密码,因此无法在SQL查询中进行验证,验证将在代码中完成。

第二个盐实际上被称为pepper,添加此服务器端秘密的最佳方法是使用此密钥对已经哈希过的密码进行加密。与哈希相反,这将是一种双向加密,如果有必要,可以交换密钥。


非常感谢。我使用了SimpleCrypto.Net库来进行PBKDF2哈希方法。我将进一步研究Pepper。 - Alexandre

1
你不需要使用外部库来完成这个任务。这个框架内置了自己的PBKDF2实现。我更喜欢将盐存储在数据库中的一个单独的字段中,但这只是我的个人喜好。我已经写下了我对密码哈希的思考在这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接