当前位置:  开发笔记 > 人工智能 > 正文

保存密码:最佳实践?

如何解决《保存密码:最佳实践?》经验,为你挑选了6个好方法。

我一直都很好奇...在使用散列密码进行散列时哪个更好:前缀或后缀?为什么?或者它是否重要,只要你加盐?

为了解释:我们所有(希望)现在我们应该知道盐之前,我们哈希它存储在数据库中的密码[ 编辑:所以你能避免类似的事情发生了什么杰夫阿特伍德最近.通常,这是通过在将盐传递给散列算法之前将盐与密码连接来完成的.但是这些例子各不相同......有些例子在密码之前加盐.一些示例在密码添加salt .我甚至看到过一些尝试将盐放在中间的人.

那么哪种方法更好,为什么呢?有没有一种方法可以减少哈希冲突的可能性?我的谷歌搜索没有找到关于这个问题的体面分析.

编辑:很棒的答案人们!对不起,我只能选一个答案.:)



1> Georg Schöll..:

前缀或后缀是无关紧要的,它只是为密码添加一些熵和长度.

你应该考虑这三件事:

    对于您存储的每个密码,盐必须不同.(这是一个很常见的误解.)

    使用加密安全随机数生成器.

    选择足够长的盐.想想生日问题.

Dave Sherohman对另一个问题有一个很好的答案,为什么你应该使用随机生成的盐而不是用户的名字(或其他个人数据).如果你遵循这些建议,你把盐放在哪里都没关系.


站点范围内的随机盐很糟糕,因为攻击者可以预先计算彩虹表并获取整个用户数据库.如果你不明白这一点,请不要写登录/安全系统:) - 你需要每用户盐.
我添加了一个旧问题的链接,阅读这些答案.基本上,通过不为每个密码使用不同的随机盐,您将承担不必要的安全风险,这可能是未来的真正问题.
是的,每用户盐.理想情况下,存储每用户迭代(因此您可以增加一段时间内使用的迭代次数).任何体面的框架都会内置这个.(.NET有PasswordDeriveBytes,可以为你处理一切.)
如果你正在设计任何类型的安全系统,那就不是使用每用户盐.*您的*网站可能不是非常有趣,但考虑用户在多个网站上使用相同的密码...试图保持数据库安全往往会失败:)
当然,盐可以防止字典攻击,正是通过使它们慢得多.在密码中使用盐远远早于彩虹表.通过防止攻击者对密码进行散列,然后将其与所有用户进行比较,专门添加了盐来减缓字典攻击.

2> Tom Ritter..:

我认为这都是语义学.除非针对特定的威胁模型,否则将其置于之前或之后无关紧要.

它应该打败彩虹表的事实.

我提到的威胁模型将是对手可以在密码附加/预先附加普通盐的彩虹表的情况.(比如美国国家安全局)你猜测他们要么附加或附加,要么不是两者兼而有之.这很愚蠢,这是一个糟糕的猜测.

最好假设他们有能力存储这些彩虹表,但不是说,例如,在密码中间插入奇怪的盐的表.在那个狭隘的案例中,我猜想穿插最好.

就像我说的.这是语义.为每个密码选一个不同的盐,一个长盐,并在其中包含奇数字符,如符号和ASCII码:©¤¡


@Samuel:我不知道你们,但是我们用"12345"作为我们的盐.:)

3> Stephen Tous..:

真正的答案,没有人似乎已经触及过,两者都是错的.如果你正在实施自己的加密,无论你认为自己在做什么都是微不足道的,你都会犯错误.

HMAC是一种更好的方法,但即便如此,如果您使用SHA-1之类的东西,由于其速度设计,您已经选择了一种不适合密码散列的算法.使用像bcrypt或scrypt这样的东西,完全解决问题.

哦,甚至不考虑将产生的哈希值与您的编程语言或数据库字符串比较实用程序进行比较.那些字符和短路的比较,就false好像一个字符不同.所以现在攻击者可以使用统计方法来尝试找出哈希是什么,一次一个字符.



4> Phil H..:

它应该没有任何区别.无论你把盐放在哪里,哈希都不会轻易猜到.由于故意非线性,哈希碰撞既罕见又不可预测.如果它对安全性产生影响,则表明散列问题,而不是腌制问题.


仅当您截断结果时.无论如何,我仍然坚持认为盐不会有所不同,因为哈希的要点是使输入和输出之间的关系不包含任何模式.

5> snemarch..:

如果使用加密安全散列,无论你是pre-post还是postfix都无关紧要; 哈希点是源数据中的单个位更改(无论在哪里)应该产生不同的哈希.

什么重要的,虽然是使用长盐,用正确的密码PRNG生成它们,并且每用户的盐.使用站点范围的哈希在数据库中存储每用户salt 不是安全问题.


安全问题.
错误的anwser:攻击者可以为许多常用密码预先计算MD(通过),然后非常便宜地计算MD(传递+盐),因为消息摘要以增量方式工作以支持流式传输.

6> cygil..:

首先,术语"彩虹表"一直被滥用.A"彩虹"表只是一个特定类型的查找表,一个允许特定种类上的按键数据压缩.通过交换空间计算,可以将需要1000 TB的查找表压缩一千次,以便可以将其存储在较小的驱动器驱动器上.

你应该担心哈希到密码查找表,彩虹或其他.

@ onebyone.livejournal.com:

攻击者的"彩虹表"不是由字典单词的散列组成,而是由最终确定散列计算之前的散列计算状态组成.

然后,使用postfix salt强制使用密码文件条目比使用salt前缀更便宜:对于每个字典单词,您将加载状态,将salt字节添加到散列中,然后完成它.使用前缀盐,每个字典单词的计算之间没有任何共同点.

对于通过输入字符串线性扫描的简单散列函数,例如简单的线性同余生成器,这是一种实际的攻击.但是加密安全散列函数被故意设计为具有多个循环,每个循环使用输入字符串的所有位,因此在添加盐之前计算内部状态在第一轮之后没有意义.例如,SHA-1有80轮.

此外,像PBKDF这样的密码散列算法多次组合它们的散列函数(建议迭代PBKDF-2至少1000次,每次迭代应用SHA-1两次)使得这种攻击双重不切实际.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有