SQL 服务器:如何检索使用 HASHBYTES 加密的密码的实际值

SQL Server: How to retrieve actual value of password encrypted using HASHBYTES

insert into Customer(AccountNo,Name,EmailId,MobileNo,[Password],Balance,
                     CustomerKey,OTPPin,CreatedBy,CreatedOn)
values(@AccountNumber,@Name,@EmailId,
       EncryptByPassPhrase(@PassPhrase, CONVERT(nvarchar,@MobileNo)),
       HASHBYTES('SHA1',@Password),@TotalBalance,@CustomerKey,@OTPPin,0,GETDATE())

我正在以这种形式获取插入值

现在我想要密码的实际值。我怎样才能得到它?

由于您在密码上使用了 HASHBYTES('SHA1' - 您无法直接取回其原始值。

SHA1 是单向哈希函数。

事实上,在大多数情况下您不需要那个原始值。 hased密码的典型用法不是通过某种方式从哈希中获取原始值并将其与用户输入的密码进行比较,而是将哈希函数应用于用户输入的密码然后比较两个哈希值。

不要使用单轮哈希来存储密码


不要使用未加盐的哈希来存储密码


不要使用 SHA1 存储密码


立即阅读 Thomas Pornin's canonical answer to How to securely hash passwords

现在,选择 PBKDF2、BCrypt 或 SCrypt。


哈希规则

  • 在您控制的地方进行哈希处理 - 在 Web 上,这是您的服务器端应用程序(无论是 PHP、ASP.NET 等)。

    • 不在 SQL 中,如果可能的话 - 您的应用程序服务器会更快,往往更具可扩展性,并且您需要高迭代次数,应该高到用完大部分您的应用程序服务器的 CPU 低于每秒登录的峰值数量 - 请记住,8 个内核可以同时 运行 8 个哈希 8 个内核可以 运行 1 个哈希。
  • 安全地加密应用程序服务器和 SQL 服务器之间的连接。

  • 如果您绝对必须在 SQL 服务器中散列,我有 T-SQL PBKDF2 code in my Github repository 和 public 域许可证,包括一些优化和一组测试向量.

    • 并让您的应用程序开发人员修复该应用程序。

Here 是一些关于如何在数据库中存储 PBKDF2(或 BCrypt,或 SCrypt)的信息,如果这也有帮助的话。


通常将密码与散列密码进行比较

更正密码存储后,验证用户密码的正确方法是

  1. 从数据库中检索散列密码、salt 和迭代 count/work 因子
  2. 使用 salt 和迭代 count/work 刚检索到的因子
  3. 将用户输入的任何内容散列为可能的密码
  4. 如果新哈希值与之前相同,则密码相同。

从哈希中获取密码的实际值:

如果你真的想得到密码的实际值,除了弱密码审计你不应该,使用oclHashcat or, if you can't use oclHashcat, try John the Ripper

这将进行马尔可夫攻击和掩码攻击(高级暴力攻击),以及统计攻击和基于规则的字典攻击,每秒对单轮 SHA1 或 8 次密码进行数十亿次猜测截至 2016 年初的现代 GPU

  • 那是 9.7E16 (2^56) 单次迭代 SHA1 每 30 天猜测一次

    • 对于未加盐的哈希,它可以同时对数据库中的每个密码执行这么多操作。