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

Ale*_*dre 7 database security salt password-hash

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

计划是当前使用2 Salts,1 Dynamic(每用户)和1 Static(Web App Constant)和强Hashing功能.

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

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

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

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

mar*_*kli 4

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

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

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