存储密码盐的位置以及如何获取密码

时间:2013-07-09 14:51:46

标签: database security salt password-hash

我负责在.Net MVC 4 Web应用程序中进行身份验证,我遇到了关于密码散列,存储和身份验证的问题。

计划目前使用2个Salts,1个Dynamic(每个用户)和1个Static(Web App Constant)和强大的Hashing功能。

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

  • 我是否将每用户盐存储在用户表中的一列?

我担心的是,通过这样做,我将不得不使用其用户名从Web应用程序内存中的数据库中获取用户。是否存在可能存在问题的某种攻击? 理想情况下,我希望这是一步/一SQL请求身份验证。

我担心太多了吗?是否有“每用户”盐的替代品,我仍然可以进行一步验证?

2 个答案:

答案 0 :(得分:3)

salt可以与password-hash一起存储,因此您可以为每个密码而不是每个用户创建一个salt。密码散列函数(像BCrypt或PBKDF2这样的慢键派生函数)的常见做法是将salt cleartext作为密码散列的一部分返回,这意味着您可以将salt和hash一起存储在单个数据库字段中。 / p>

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

第二个盐实际上被称为胡椒,添加此服务器端密码的最佳方法是使用此秘密加密已经散列的密码。与哈希相反,这将是一种双向加密,只要有必要就可以交换密钥。

答案 1 :(得分:1)

您不需要外部库来执行此操作。该框架内置了自己的PBKDF2实现。我更喜欢将salt存储在数据库的单独字段中,但这只是我想的问题。 我已经写了关于密码哈希here

的想法