我正在查看一些我自己没有写过的代码。代码尝试使用SHA512哈希密码,并仅使用time()
作为salt。 time()
是否过于简单,或者此代码是否安全?
感谢您的回答和评论。我将在此为新读者总结一下:
random, evenly distributed, high entropy
盐?好的,那么我用随机字符串32 char long替换time()怎么样。可以通过在一组字母表字符上循环32次来生成随机字符串。听起来不错吗?
答案 0 :(得分:83)
答案 1 :(得分:2)
<强>更新强>
这不是一个真正好的盐,但可能足以打败除了最坚定和足智多谋的攻击者之外的所有人。好盐的要求是:
time()
值不够长,因为它们有10个字符,但只有数字。
此外,有时两个用户在同一秒内创建时可能会获得相同的值。但是,如果您遇到在同一秒内自动创建许多用户的情况,那么这只是一个问题。
在任何情况下,比完美的盐更重要的是使用良好的哈希函数,SHA512是我们现在可用的最好的之一。
答案 2 :(得分:2)
这篇文章可能会偏离你原来的问题,但我希望你觉得它很有用;
安全是关于提高障碍和障碍;深度防守。没有真正安全的散列解决方案,只有那些难以破解的解决方案。这就像在你的房子里放入一个防盗报警器和窗户锁 - 让你的网站比其他人更不具吸引力。
用于加密算法的Salt只是安全问题的一小部分。单个盐只意味着在尝试破坏多个用户的密码时,可以找到更少的东西。低熵盐(例如服务器的时间)使得它变得更难一点,并且高熵盐使其更难。使用哪一种,以及是否需要担心的主要取决于您所保护的数据的敏感性,以及您所采取的其他安全措施。一个只为所选城市提供个性化天气预报的网站显然比拥有您的家庭住址,母亲的婚前姓名,出生日期和其他可用于识别目的的信息的数据敏感度低。
所以这就是摩擦;如果很容易获得,高熵盐仍然是一种不好的盐。
在现实世界中,将盐存储在数据库中(随机或非随机)可能不如使用常量盐并将其从私人眼睛中隐藏在通过Web浏览器无法访问的文件中。虽然难以猜测一个独特的高熵盐,但如果您允许从MySql上的任何服务器进行root登录并将密码设置为“密码”,那么这并不重要!决定破解数据库与获取有效登录服务器是多么容易 - 这可能更难以离散地执行,因为根据您的设置,您可以放置fail2ban和大量其他攻击向量监视器。
您可以通过将包含用户特定salt的文件的位置存储在数据库中而不是salt本身来组合这两种方法。是否必须同时破解文件系统和数据库取决于您尝试保护的数据的敏感性是否保证了这种开销。
安全专家提出的另一个替代建议是将用户名存储在与密码不同的数据库(理想情况下是不同的技术)中,并使用UUID在两者之间进行引用。例如。同时使用MySQL和SQLite。这意味着两个数据库都必须被破解(这也是为什么,为了一个例子,为了一个单独的兔子洞,你不应该在同一个数据库中存储用户详细信息和信用卡号码,因为没有用另一个)。
请注意,像SHA-512和Blowfish这样的算法可以将salt作为哈希值的一部分返回。小心这些就好像你存储了你给出算法的完整哈希值,这意味着黑客可以解决两个问题(盐也会放弃算法)。
确保强制使用强密码和用户名,因此字典攻击将失败;我知道MD5用户名/密码条目的所有6个字母数字组合的字典,我怀疑所有类型的算法都有更多可用的字典。随着低成本云和CPGPU计算的爆炸式增长,可用字典的大小和复杂性将会爆炸。
最终,最安全的方法是永远不要以编程方式生成盐,但要求用户通过SSL链接将其与用户名和密码一起输入(因此无法窥探),但永远不会存储它。这是信用卡公司采取的方法;即信用卡上的3位CSV安全密钥,您必须在每次在线购买时输入该密钥,因为它永远不应存储在任何数据库中。如果你真的想要生成盐,请单独发送给它们(例如通过短信或电子邮件),并且每次都让它们手动输入。使用这种方法,虽然更安全,但您需要将复杂性与用户是否会停止使用该网站进行对比,因为您已经太难以使用它。
以上所有内容仍然依赖于这样一个事实,即您还可以对会话劫持,跨站点脚本等进行保护。如果我需要做的就是计算一个世界上最强大的密码算法是无关紧要的。登录用户的有效PHPSESSID并劫持它!
我不是安全专家,但我已尽可能多地阅读此内容。关于这个主题有这么多书的事实表明你的问题的答案有多大。
你可能想尝试的几本非常棒的书,我发现它们非常宝贵;
Web应用程序漏洞检测,利用,阻止 - ISBN-13:978-1-59749-209-6
使用Apache防止Web攻击 - ISBN-13:978-0-321-32128-2
答案 3 :(得分:1)
是。
似乎unix时间戳,存储在用户数据库中作为“成员自”字段将变得不错。
然而,盐问题最为微不足道。 还有更重要的事情要注意:
很可能不是密码,盐或哈希算法将成为您网站中最薄弱的部分。一些蹩脚的文件注入或XSS或CSRF肯定是。所以,不要做太大的事情 说到典型的网络应用程序中一个32字符长的真正随机字符串就像在木制谷仓里谈论32英寸装甲门。
说到密码,最重要的事情是密码复杂性。弱密码没有盐也没有哈希算法,甚至是超级巧妙 - 难以置信的难题, 有帮助。要求用户使用复杂的密码是一件痛苦的事,但如果没有它,其他一切都会成为废话 所以,你的第一个问题应该是密码复杂性。不同情况下12-16个字符,包括数字和标点符号是必需的。
至于盐,我认为使用时间没有任何好处,因为你必须将它与其他用户数据一起存储。更好地使用电子邮件 - 它足够随机,无论如何你已经拥有了它。如果用户更改了电子邮件,请不要忘记重新密码。 似乎unix timstamp将成为一个不错的盐,不需要使用电子邮件或其他任何东西。
<强>更新强>
我可以看到,许多人仍然无法明白这一点
就像评论中的那个人一样,说
许多用户使用弱密码(我们应该教育他们,或者至少继续尝试),但这不是借口;他们仍然应该得到良好的安全保障
毫无疑问,他们应得的。但凭借弱密码的使命。是。不可能的。强>
虽然在这个主题上花费10千字节的文字并不重要。
答案 4 :(得分:1)
最好不要在身份验证时重新发明轮子,但要回答你的问题, 否 。 time()的问题:
答案 5 :(得分:0)
Salt用于通过破坏密码和预先计算的哈希之间的匹配来防止彩虹攻击。因此,盐的主要任务是每个用户/密码记录不同。盐的随机化质量并不重要,只要盐对于不同的用户是不同的。
答案 6 :(得分:0)
成员加入论坛/网站的日期通常是公开访问的,这与time()相同,因此使您的盐无用。
答案 7 :(得分:0)
没有!切勿将当前时间用作盐。你可以在java中使用类似'SecureRandom'的东西来生成一个安全的随机盐。始终使用不可预测的随机数作为盐。
使用时间作为盐将帮助您仅在一定程度上消除冲突(因为两个用户可以同时处理相同的密码),但仍然使密码可恢复的。
答案 8 :(得分:-2)
用户名应该足够并且可能是注册时间戳,但是您应该将其存储在数据库中的某个位置。无论如何,用于限制密码哈希值的每个值都应该以某种方式存储,这样你就可以重新计算哈希值。
用用户名腌制+时间戳足够安全吗?它应该是。对于破解SHA512哈希,通常使用彩虹表。一个用户名+一个时间戳应该是一个单程足够的盐,所以网上没有一些彩虹表,其中包含带有密码的预先计算的哈希值,这些都是这样的。