是时候()的好盐?是时候()的好盐?(Is time() a good salt?)

2019-05-13 09:09发布

我期待在我还没有写自己的一些代码。 代码试图散列与SHA512密码,并使用只是time()作为盐。 是time()太简单盐这或者是这个代码安全吗?

感谢您的答案和评论。 我将在这里总结一下新的读者:

  • 盐应当是对于每个用户不同的,因此,如果用户在同一时间寄存器,它们的盐将不是唯一的。 这是一个问题,但不是很大。
  • 但盐不应该在与用户相关的任何方式,所以时间()是不是一个很好的盐。
  • 使用随机的,分布均匀,高熵的盐。” -这是一个拗口,所以什么该代码可能会生成一个random, evenly distributed, high entropy盐?

好了,怎么样我更换时间()用随机字符串32字符长。 随机字符串可以从在一组字母字符的循环32次,来产生。 这听起来好?

Answer 1:

简短的回答:

不, time()是不是一个很好的盐。

长一点的回答:

从我的答案,复制产生盐和开源软件

什么是盐?

盐是随机的一组被添加到散列算法的输入的固定长度的字节。


为什么盐腌(或播种)哈希有用吗?

添加一个随机的盐哈希确保相同的密码会产生许多不同的哈希值。 该盐通常是存储在数据库中,与所述散列函数的结果一起。 腌制的哈希有利于一些原因:

  1. 盐析大大增加的precomputated攻击(包括难度/成本彩虹表 )
  2. 腌制可以确保相同的密码不会导致相同的哈希。 这可以确保你不能确定如果两个用户有相同的密码。 而且, 更重要的是 ,你不能确定是否同一人使用不同的系统之间相同的密码。
  3. 腌制提高密码的复杂性,从而大大降低双方的有效性 Dictionary- 生日攻击 (如果盐存储从散列分开这仅是真)。
  4. 适当的盐析大大增加了存储需求预计算的攻击,直至他们不再实用点。 (8字符区分大小写字母数字密码以16位盐,散列到一个128位的值,将占用不到200个 艾字节无彩虹减少)。


没有必要为盐是秘密的。

盐是不是一个秘密密钥,而不是盐“作品”通过将散列函数具体到每个实例。 咸散,没有一个哈希函数,而是一个为每个可能的盐值。 这阻止攻击者攻击ñ哈希密码少于攻击一个密码的N次的费用。 这是盐的地步。
A“秘密盐”不是盐时,它被称为“密钥”,它意味着你不再计算哈希值,但是一个消息鉴别码 (MAC)。 计算MAC是棘手的问题,这是一个非常不同的主题共有(不是简单的一个键和一个值打耳光连成一个哈希函数很多麻烦)。

必须是随机的每一个在使用它的实例。 这确保了攻击者能够单独攻击每一个盐渍哈希。
如果你依靠你的盐(或腌制算法)正在秘密,你进入的领域安全透过朦胧 (无效)。 最可能的是,你没有得到从盐保密额外的安全性; 你只会得到安全的温暖模糊的感觉。 因此,而不是让您的系统更加安全,它只是分散了你的现实。


那么,为什么盐必须是随机的?

从技术上讲,盐应该是唯一的 。 盐的点是成为不同的每个哈希密码。 这是世界范围内的意思。 由于没有中央组织,分发点播独特的盐,我们必须依靠退而求其次,这是不可预测的随机生成随机选择,最好在盐空间足够大,以使冲突不可能(使用相同的两个实例盐值)。

这是很有诱惑力的尝试获得一些数据,这是“大概是独一无二的”,比如用户ID的盐,但这些方案往往由于一些讨厌的细节失败:

  1. 如果您使用例如用户ID,一些坏人,攻击不同的系统,可能只是它们的资源,并为用户ID 1到50的用户ID是全球唯一的全系统的而不是预先计算表。

  2. 这同样适用于用户名 :有一个“根”每个Unix系统中,但也有在世界上许多根。 对于“根”彩虹表将是值得的,因为它可以被应用到数以百万计的系统。 更糟糕的是,也有不少“鲍勃”在那里,许多人没有系统管理员的培训:他们的密码可能是相当弱的。

  3. 唯一也是暂时的。 有时,用户更改他们的密码。 对于每一个新的密码 ,一个新的盐必须被选择。 否则,攻击者获得旧密码的哈希值与新的散列可以尝试同时攻击两个。

从使用加密的安全,不可预知的PRNG获得一个随机盐可能是某种大材小用,但至少可证明保护您免受所有那些危害。 这不是关于防止攻击者知道个人盐是什么,它是关于不给他们将会对潜在目标的大量使用的又大又肥的目标。 随机选择使目标薄如是可行的。


结论:

使用随机,分布均匀,高熵的盐。 使用时,你创建一个新的密码或改变密码的新盐。 与哈希密码存储盐一起。 有利于大盐(至少10字节,优选16个或更多)。

盐不转坏的密码,一个好的密码。 它只是确保攻击者将至少支付字典攻击价格为每个错误密码,他打破了。


有用的来源:
stackoverflow.com: 密码哈希的非随机盐
布鲁斯: 实用加密 (书)
Matasano安全: 足以与彩虹表
usenix.org: 自1976年以来的Unix隐窝使用盐
owasp.org : 为什么要加盐
openwall.com :

免责声明:
我不是一个安全专家。 (虽然这个答案予以审查托马斯Pornin )
如果有任何的安全专家在那里发现不对劲,请不要评论或编辑这个wiki答案。


至于什么似乎是为您随机盐的良好来源
另请阅读: 什么是随机数生成的最安全的种子?
在基于没有专用的,硬件的,随机生成,获得随机数据的最好的办法是向操作系统(在Linux上,这就是所谓/dev/random/dev/urandom [两者都有优点和存在的问题,选择您的毒药];在Windows上,调用CryptGenRandom()

如果由于某种原因你没有访问的随机上述来源,在PHP中您可以使用下列功能:
从源头phpass V0.3

<?php
/**
 * Generate pseudo random bits
 * @copyright: public domain
 * @link http://www.openwall.com/phpass/
 * @param int $length number of bits to generate
 * @return string A string with the hexadecimal number
 * @note don't try to improve this, you will likely just ruin it
 */
function random_bits($entropy) {
    $entropy /= 8;
    $state = uniqid();
    $str = '';
    for ($i = 0; $i < $entropy; $i += 16) {
        $state = md5(microtime().$state);
        $str .= md5($state, true);
    }
    $str = unpack('H*', substr($str, 0, $entropy));
    // for some weird reason, on some machines 32 bits binary data comes out as 65! hex characters!?
    // so, added the substr
    return substr(str_pad($str[1], $entropy*2, '0'), 0, $entropy*2);
}
?>


Answer 2:

更新

这不是一个很好的盐,但可能不够好,打败所有,但最坚决的和足智多谋的攻击者。 一个好的盐的要求是:

  • 为每个用户不同
  • 足够长的时间(至少是字母数字8个字符),使盐的级联和(潜在弱)密码太长蛮力攻击。

time()值是不是真的足够长的时间,因为他们有10个字符,但只有数字。

此外,有时它们是同一秒内建立两个用户可以得到相同的值。 但如果你有许多用户会自动在同一秒内产生的情况下,这只是一个问题。

在任何情况下,远远超过一个完美的盐更重要的是使用一个好的哈希函数和SHA512是的,我们有可用的,现在最好的一个。



Answer 3:

这篇文章可能会改变方向有点太远离你原来的问题,但我希望你觉得它有用;

安全性是关于提高壁垒和障碍; 纵深防御。 有没有真正的安全散列的解决方案,只是那些很难打破。 这就像把一个防盗报警窗锁在你的房子 - 让你的网站打入比别人的不那么有吸引力。

盐的地穴算法只是安全问题的一小部分。 单一的盐只是意味着少了一个东西试图打破对多个用户的密码时,要弄清楚。 的低熵盐(如服务器的时间)使得它有点困难,以及高熵盐使得它更难仍然。 其中哪些使用,以及它是否是你需要担心的东西,主要取决于双方你要保护的数据的敏感性,还能有什么其他的安全措施必须到位。 只是给出了一个个性化的天气预报为选定的城市显然是一个站点有不止一个具有您的家庭住址,母亲的娘家姓,出生等信息的日期可能被用于标识目的,不敏感的数据。

因此,这里的摩擦; 一个高熵盐仍然是一个坏的盐,如果它是很容易获得。

在现实世界中,在数据库(随机与否)存储盐可能比使用恒定的盐和通过Web浏览器无法访问文件掩埋它从私人眼前溜走不太安全。 虽然一个独特的,高熵的盐是更难猜测,如果你允许root登录从MySql上的任何服务器,并设置密码,“密码”这其实并不重要! Constrast是多么容易破解数据库与越来越有效的登录到你的服务器 - 这可能是更困难的事离散,你可以放的fail2ban并根据您的设置代替其它攻击向量观察家过多。

您可以通过存储包含数据库用户特定的盐,而不是盐本身的文件的位置,结合两种方法。 是否有破解这两个文件系统和数据库是必要的取决于是否数据的敏感性你试图保护令这种开销。

另一个,替代方案中,从安全专家的建议是为存储使用UUID两者之间在一个单独的数据库的用户名(并且理想地不同技术)的密码,和参考。 例如,使用MySQL和SQLite的。 这意味着,这两个数据库已被破解(并且也是为什么,走下来一个单独的兔子洞为例起见,你不应该存储在同一个数据库中的用户资料和信用卡号码,因为一个是没有用的,而不另一个)。

需要注意的是算法,如SHA-512和河豚可以返回盐作为其哈希的一部分。 小心这些,如果你存储完整的散列你放弃的算法,这意味着有两个用于黑客找出(盐还赠送算法)少的东西。

确保你强制使用强密码和用户名,那么字典攻击将失败; 我知道字典为MD5的用户名/密码条目的所有6个字母数字组合,我怀疑还有比这适用于各种算法的更多。 随着低成本的云计算CPGPU的爆炸,可用字典的大小和复杂程度会爆炸。

最终,最安全的方式是从来没有以编程方式生成盐,但需要用户与他们在SSL链接(所以不能被窃听)的用户名和密码,同时输入,但从来没有存储。 这是由信用卡公司所采取的办法; 即您的信用卡上,你必须在每个你在网上买,因为它不应该被存储在数据库中的任何时间进入3位数的CSV安全密钥。 如果你真的想生成盐,发送给他们分开(例如,通过短信或电子邮件),仍然让他们手动输入各一次。 通过这种方法,虽然更安全,你需要对比的复杂性对用户是否只是停止使用该网站,你做了它太难为他们用它来打扰。

所有上述的仍然依赖于事实,你也有对会话劫持,跨站脚本,等等等等地方保护世界上最强大的密码算法是无关的,如果我需要做的是计算有效的PHPSESSID登录的用户,并劫持了!

我不是一个安全专家,但阅读了这条像我合理能做到。 有关于这个问题这么多书的事实表明了回答你的问题有多大确实是。

你可能想尝试,我已经找到了宝贵的一对夫妇的真正伟大的书;

Web应用漏洞检测,漏洞利用,防止 - ISBN-13:978-1-59749-209-6

防范Web攻击与Apache - ISBN-13:978-0-321-32128-2



Answer 4:

不,时间()是不是一个很好的盐

最好不要重新发明轮子,当涉及到身份验证,但回答你的问题, 没有 。 随着时间的推移()的问题:

  • 这是可预见的,它关联到可能发现的东西。 这些问题更容易交叉匹配不同的散列结果。
  • 有没有很多可能的值。 由于高序位不改变,这是一个更窄的盐比它第一次出现。
  • 使用它重复过去的错误。 如果这个程序是一个使用时间()作为盐,至少它需要一个新的攻击。


Answer 5:

是。
看来,一个UNIX时间戳“因为会员”存储在用户数据库作为一个字段将成为体面的盐。

然而,盐的问题是最微不足道的一个。 还有更重要的事情,你必须要注意:

  1. 最有可能不是一个密码,也没有盐或散列算法将成为你的网站的薄弱环节。 有些跛文件注入或XSS和CSRF的肯定是。 所以,不要做它的一个过大的交易。
    在典型的web应用程序长32字符的真正的随机字符串说到就像是在木谷仓谈到32英寸装甲门。

  2. 说到密码, 有史以来最重要的就是密码的复杂性。 弱密码不咸也不散列算法,即使是超精巧,令人难以置信的硬之一,可以帮助。 这是一个痛苦询问用户使用复杂的密码,但是没有它一切变成一块垃圾。
    所以,你首先关注的应该是密码的复杂性。 不同的情况下,包括数字和标点字符12-16是一个要求。

  3. 至于盐, 我看到在使用时没有任何好处,因为你必须与其他用户数据一起存放。 更好地利用电子邮件-它是足够随机的,你有它已反正。 不要忘记,如果用户更改其电子邮件重提密码。 似乎UNIX timstamp将是一个不错的盐,没有必要使用电子邮件或其他任何东西。

更新
正如我所看到的,很多人仍无法获得分数。
从一样的意见那家伙,说

许多用户使用弱密码(我们应该教育他们,或至少保持努力),但是这是没有任何借口; 他们仍然值得良好的安全性

他们应得的,毫无疑问。 但随着弱口令的使命。 是。 不可能。

如果您的密码是弱的,则没有盐会保护它。

虽然盐是不是那么重要把钱花在该主题的10千字节的文本。



Answer 6:

盐是用打破密码,预先计算哈希值之间的匹配,以防止彩虹攻击。 因此,对于盐的主要任务是为每个用户/密码记录不同。 盐的随机化的质量只要不太多的盐是为不同的用户不同的问题。



Answer 7:

当有成员加入的论坛/网站一般公然能够访问这将是相同的时间日期,(),因此使你的盐没用。



Answer 8:

没有! 不要使用当前时间为盐。 您可以使用类似“SecureRandom的”在Java中生成一个随机的盐是安全的。 始终使用一个不可预知的随机数作为该盐。
使用时间作为盐会帮你删除的碰撞只有高达一定程度(因为两个用户可以sypply在同一时间同一密码),但仍使密码恢复。



Answer 9:

用户名应该是足够足够,也许报名时间戳记,但你应该在数据库中存储一些吧。 反正每次使用盐密码哈希值,应存放一些办法,这样你就可以重新计算哈希值。

与用户名+时间戳腌制是否足够安全? 它应该是。 用于裂化SHA512散列被正常使用彩虹表。 用户名+时间戳应该是盐,它是uniquq不够,所以没有办法有一定的彩虹表上包含的密码,这是咸这种方式预先计算散列网。



文章来源: Is time() a good salt?