密码散列,盐和散列值的存储(Password hashing, salt and storage o

2019-06-17 16:44发布

假设你可以自由地决定散列密码是如何被存储在一个数据库管理系统。 在类似这样的方案有明显的弱点?

要创建存储在DBMS的散列值,取:

  • 的值是唯一到DBMS服务器实例作为盐的一部分,
  • 和用户名作为盐的第二部分,
  • 并创建盐的串联与实际密码,
  • 并使用SHA-256算法散列整个字符串,
  • 并将结果存储在数据库管理系统。

这意味着,任何人想要拿出一个碰撞应该为每个用户名,并分别各DBMS服务器实例单独做的工作。 我打算让实际的散列机制有所灵活,允许使用新的NIST标准的哈希算法( SHA-3这仍然是正在处理)。

“价值是唯一的DBMS服务器实例”不必是秘密的 - 虽然它不会被随便泄露。 其目的是为了确保如果有人使用不同的DBMS服务器实例相同的密码,记录的哈希值会有所不同。 同样,用户名不会是秘密 - 只要密码正确。

会不会有什么优势具有密码第一,用户名和“独特的价值”第二或数据的三个来源中的任何其他排列? 或约交织串是什么?

我是否需要添加(和记录)随机盐值(每个密码)以及上述信息? (优点:用户可以重新使用密码,仍然,很可能得到记录在数据库中不同的哈希缺点:盐具有要记录我相当怀疑的好处远远大于缺点。)

有相当多的相关的做题 - 这个名单不太可能是全面的:

  • 加密/哈希数据库明文密码
  • 安全散列和盐的PHP密码
  • 隐藏盐的哈希的必要性
  • 客户端MD5哈希随着时间的推移盐
  • 简单的密码加密
  • 产生盐和开源软件
  • 密码哈希值:固定长度的二进制字段或单独的字符串字段?

我认为,这些问题的答案支持我的算法(但如果你只需使用随机盐,然后将“每个服务器的独特价值”和用户名组件不太重要)。

Answer 1:

盐只是需要随机的和独特的。 它可以自由地称它不会帮助攻击。 许多系统将纯文本盐存储在列的数据库旁边的哈希密码。

盐有助于确保,如果两个人(用户A和用户B)碰巧共享相同的密码不是很明显。 如果没有对每个密码随机和独特的盐的哈希值将是相同的,显然,如果用户A的密码被破解然后用户B必须具有相同的密码。

它还有助于从那里散列的字典可针对已知的密码相匹配的攻击保护。 如彩虹表。

还使用一种算法与内置的也是一个“工作因素”是指作为计算能力增加了工作的算法要经过创建哈希也可以增加。 例如, bcrypt 。 这意味着蛮力攻击经济学变得站不住脚。 据推测,它变得更加困难,因为他们需要更长的时间来创建创建称为哈希表的; 在“工作因素”的变化会意味着更多的表就必须建造。



Answer 2:

我觉得你过于复杂的问题。

开始的问题:

  1. 你们是不是要保护脆弱的密码?
  2. 你们是不是要减少对彩虹攻击?

你建议并防止简单的彩虹攻击,因为即使用户A和用户B具有相同的密码机制,哈希密码会有所不同。 它看上去象是一个相当复杂的方法进行腌制密码是过于复杂。

  • 当你的数据库迁移到另一台服务器会发生什么?
    • 你可以改变的独特,每DB值,如果这样的话,可以产生一个全球性的彩虹表,如果没有,那么你将无法恢复你的数据库。

相反,我只想补充额外的列和存储适当的随机盐。 这将防止任何形式的彩虹攻击。 横跨多重部署。

但是,它不会保护你免受暴力攻击。 所以,如果你想保护有蹩脚的密码的用户,您将需要到别处。 例如,如果你的用户有4名字母的密码,它也许可以在几秒钟内破解即使有盐,并在最新的哈希算法。



Answer 3:

我认为你需要问自己“你希望通过使这不仅仅是产生一个随机盐值并将其存储更复杂好处?” 你让你的算法更复杂,你就越有可能是无意中引入一个弱点。 这可能会发出声音尖刻无论我怎么说,但它的有益的意思 - 什么特别之处您的应用程序,它需要一个花哨的新密码哈希算法?



Answer 4:

为什么随机盐不增加密码的散列和该组合。 接着级联散列和盐单字节[],并将其存储在数据库中?

随机盐的优点是,用户可以自由改变它的用户名。 该盐不必须是秘密的,因为它是用来防止字典攻击。



文章来源: Password hashing, salt and storage of hashed values