1

在此处输入图像描述

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())

我正在以这种形式获得插入值在此处输入图像描述

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

4

2 回答 2

7

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

SHA1 是单向哈希函数。

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

于 2016-02-16T13:22:39.847 回答
2

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


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


不要使用 SHA1 存储密码


立即阅读Thomas Pornin 对如何安全地散列密码的规范答案

现在,选择 PBKDF2、BCrypt 或 SCrypt。


散列规则

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

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

  • 如果您绝对必须在 SQL Server 中散列,我的 Github 存储库中有 T-SQL PBKDF2 代码,具有公共领域许可,包括一些优化和一组测试向量。

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

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


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

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

  1. 从数据库中检索散列密码、盐和迭代计数/工作因子
  2. 使用刚刚检索到的盐和迭代计数/工作因子对用户输入的任何内容作为可能的密码进行哈希处理
  3. 如果新的哈希值与之前的相同,则密码相同。

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

如果你真的想得到密码的实际值,除了弱密码审计,你不应该这样做,使用oclHashcat或者,如果你不能使用 oclHashcat,试试John the Ripper

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

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

    • 并且针对未加盐的哈希,它可以同时针对数据库中的每个密码执行许多操作。
于 2016-02-18T07:54:27.840 回答