关于在数据库中存储密码



今天,我们将看到如何最好地将密码存储在数据库中以及知名平台如何解决此问题。

明文


当然,当出现存储密码的问题时,第一个想法就是简单地在数据库中的相应铭牌中打开密码。 如果客户不能真正直接访问它,一切都会很好。 但是,不幸的是,这种众所周知的SQL注入有时仍可以在各种Web应用程序中运行,更不用说其他潜在的漏洞了。 为了安全起见,即使在这种情况下,也可以假设最坏的情况并准备行动计划和保护措施。 我们假设攻击者已经以某种方式发现了Web应用程序中的漏洞,并愉快地卸载了带有用户名和密码的表,然后按自己的意愿处理它们。 一般而言,他的进一步行动可能如下:

  • 使用他们在易受攻击资源上的凭据代表用户执行非法操作:例如,将银行卡绑定到一个帐户,现在攻击者可以使用它;
  • 试图在其他资源上使用接收到的密码:用户并非总是遵循建议,每次都会针对不同的服务提出新的密码;
  • 尝试识别生成密码的规则并转到第二点:某种形式的生成密码的规则,结果,不同资源上的密码不同,但是它们遵循可以检测到的相同规则;
  • 特权升级:管理员密码也可以存储在同一张表中,并且有时您可以完全了解服务器的知识。

加密散列


这个主意立刻变得不那么好。 怎么办 最好以加密形式存储密码。 然后,即使将它们卸下,它们也将无法恢复,或者至少它们将花费太多时间。 这里的选择出现在两个开发分支之间:加密密码或哈希。 开发人员选择了第二个,原则上很清楚为什么。 比较我们的申请人的不同特征:

  1. 人工投入。 加密需要更多时间,无论我们选择哪种转换方式,都必须通过每次密码检查来完成。 哈希函数的要求之一是执行速度。
  2. 输出值的长度。 加密结果的长度是可变的,哈希结果始终是相同的,并且在数据库中存储统一的数据非常方便。 更不用说加密形式的密码长度将提供有关原始密码长度的一些信息这一事实。 但是,相同的长度会导致发生碰撞的可能性,但下文将对此进行详细介绍。
  3. 密钥管理。 加密需要一个密钥,该密钥也必须存储在某个地方,希望没人能找到它。 无论如何,密钥的生成和管理都是一个独立的故事(它们不应该太弱,需要定期进行更改,依此类推)。
  4. 发生冲突的可能性。 加密时,来自不同输入数据的输出也将始终不同。 对于散列,情况并非总是如此。 恒定的哈希长度意味着哈希函数的输出值集受到限制,这会导致冲突。 也就是说,假设用户真的很困惑,并想出了一个非常酷的长密码,其中包含大小写的特殊字符,数字和字母。 攻击者在密码字段中输入了同样不错的密码“ admin”。 服务器对它进行哈希处理,以检查和比较哈希值。 哈希匹配。 真可惜

因此,分数为3:1,则散列取胜。 但是有可能停在那里吗?
答案是否定的。

哈希密码攻击


因此,攻击者使用用户名和密码获得了我们的表。 现在已对密码进行哈希处理,但这并不能阻止我们的攻击者,他认真地打算恢复它们。 他可能采取的行动:

  • 字典暴力破解:如果攻击者未成功使用管理员的主密码,他将转向流行密码字典并尝试使用其哈希值来运气;
  • 彩虹表:今天一般来说,也许他不需要计算任何东西并通过字典进行排序。 转到网络上的彩虹表就足够了。 Rainbow表包含某人之前已经计算出的哈希值及其相应的输入数据。 重要的是要注意,由于冲突,彩虹表将提供的密码不一定是用户使用的密码。 计算值已经用于MD5,SHA1,SHA256,SHA512,以及它们的修改和其他一些值。 您可以尝试反转哈希,例如在这里
  • 详尽搜索:如果这样做没有帮助,则您将不得不使用蛮力搜索并连续对所有可能的密码进行排序,直到最终计算出的哈希值匹配为止。

在最一般的情况下,攻击者将不得不破解密码。 在这里,它的成功将取决于哈希函数的计算速度。 哈希时间的比较可以在这里找到。 例如,在具有1个核心Intel i7 2.60GHz和16GB RAM的64位Windows 10上,由Java实现的哈希函数运行了100万次,以计算36个字符的哈希。 他们显示了以下结果:

MD5-627毫秒
SHA-1-604毫秒
SHA-256-739毫秒
SHA-512-1056毫秒

但是如今,蛮力可以并行化,并且可以在GPU(以及APU,DSP和FPGA)上更快地运行许多倍。 但是,除了选择更长的算法和更长的输出之外,您还可以执行其他操作。

哈希哈希


为了防止攻击者使用现成的彩虹表,有一种技术可以对密码进行多次哈希处理。 也就是说,我们从哈希中的哈希中计算出哈希中的哈希...等等n次(但是有必要不要太参与其中,因为在通常验证用户密码的过程中,服务器也必须这样做)。 现在,根据彩虹表是如此简单,他找不到密码,暴力破解的时间将大大增加。 但是知道哈希算法后,没有什么能阻止攻击者从密码字典生成彩虹表。 此外,对于此方法的最流行组合,已经生成了以下表:



加盐调味


为了使他无法做到这一点,今天对密码加上了salt进行了哈希处理。
盐是分配给密码并对其进行哈希处理的额外随机字符串。 您无法从彩虹表中的哈希表中恢复密码。 知道了盐和输出哈希后,攻击者注定要蛮力行事,并且没有任何预先计算的表很可能会帮助他。
密码加盐分类法:

1.根据腌制原理:

  • 每个用户的唯一盐:每个用户各自的盐-这样,如果攻击者知道了盐,则必须破解每个密码。 此外,即使两个用户以相同的方式思考并提供相同的密码,输出中的哈希值仍将不同。
  • 全球盐:所有盐都相同,用于所有哈希值;
  • 两者兼而有之。

2.根据盐的储存方法:

  • 在数据库中:通常,各个盐与密码哈希存储在同一数据库中; 通常甚至在同一条线上;
  • 在代码中(在配置文件中读取):全局盐通常不存储在数据库中,而是存储在配置文件中,这样违反者就不得不花时间选择它。

我们假设单个用户盐存储在数据库中,全局盐存储在配置中。 攻击者可以访问数据库,并且他知道所有散列及其对应的盐(全局盐未存储在数据库中,并且他也不知道)。 总体而言,如果将所有方法组合在一起,以便像第一个系统中的情况那样以清晰的形式获取密码,那么他极有目标地将遇到以下障碍:

  1. 他不知道全球盐,因此必须残酷对待。
  2. 他知道用户使用的盐,但是他没有用这些盐准备表,因此他将必须破解密码。
  3. 由于您必须对哈希进行n次哈希处理,因此此过程将花费更多时间。

密码如何存储各种CMS


WordPress的


在3.x版之前,密码仅使用MD5进行哈希处理。 现在使用phpass库。 默认情况下,salt会被分配给前面的密码,并且生成的字符串会被MD5哈希2 ^ 8次。

Joomla


在1.0.12版之前,仅使用MD5。 使用phpass库,默认情况下使用带有盐和2 ^ 10次重复的bcrypt。

Drupal


不含盐的版本6 md5。 使用phpass库。 默认值为盐腌sha512,具有2 ^ 16次重复。

银纹


使用咸河豚2代表10次。

Umbraco


与盐一起使用HMACSHA256。 使用配置中指定的第二个全局盐。

Source: https://habr.com/ru/post/zh-CN413157/


All Articles