我正在开发一个LAMP(erl)堆栈,并知道存储模糊密码的几种方法。鉴于MySQL 4.1.1和Perl 5.8,我想听听那些认为他们有最佳实践的人,以及为什么它是最好的。
我读过的一个选项,使用MySQL ENCODE()和DECODE()函数,对我来说听起来不错......你的想法?
答案 0 :(得分:8)
通常,我更喜欢将密码保留为无法恢复的哈希值,而不是可以解密的加密项。
通过从访问者提供的字符串计算哈希值(当然还有一些盐),我可以判断用户是否提供了两次相同的密码,而没有允许我的应用程序能够解密所提供密码的安全风险,可能是恶意的。
我的感觉是,当您希望数据可以恢复时,encode()和decode()可能是很好的解决方案,但是不可恢复的哈希值(使用Crypt :: MD5)是存储密码的更好方法。
答案 1 :(得分:6)
我认为使用正确哈希函数(例如SHA-256)的salted哈希是最好的。可逆的密码不如那些无法逆转的密码安全。如果没有外部Perl模块,您可以使用内置的SHA1()函数,不如SHA256,但优于ENCODE / DECODE。
此外,您必须考虑从代码到数据库的路径,这可以被嗅探。您可以通过代码中的散列或加密数据库连接来避免这种风险。最好在代码中执行此操作,因为即使加密连接,仍然存在配置查询日志的风险,从而将明文存储在某个日志文件中。
答案 2 :(得分:5)
如果您只需要密码来验证自己/用户,那么单向存储(如md5)会更好。
答案 3 :(得分:3)
好吧,因为有一个DECODE()
函数,我会说不,因为您可能希望以密码形式存储密码,以防止任何人通过随便读密码获取您的数据库/密码文件
我建议使用经典的盐渍哈希方法。
答案 4 :(得分:3)
某些应用程序要求用户的密码可以检索,而不是用户的密码随机重置为某些内容的系统,如果忘记了(因为它无法解密,因为您使用的是哈希)。在这种情况下,编码和解码都可以,但为什么不使用内置的AES_ENCRYPT和AES_DECRYPT函数呢?
此外,请继续使用salt值的建议,无论是散列还是加密。这在两种情况下都是有益的。
答案 5 :(得分:1)
我不确定这些功能是做什么的,但对于LAMP堆栈网站中的密码,我肯定也会使用盐场。
您的用户表将包含:
然后使用明文密码和salt上的串联上的某些编码函数对纯文本密码进行编码。该结果进入传递字段。盐也被储存。这样你就可以在用户登录时验证明文密码。盐可以是任何东西,越长越随机越好,但我不认为它是那么敏感。
这大大提高了安全性,因为现在您的用户不再使用5个字母的密码,他们使用5 + len(盐)大小的密码,如果盐足够大,则没有彩虹数据库会包含您的哈希值。 / p>
答案 6 :(得分:0)
如果您可以解密密码,则您的安全性存在缺陷。你应该总是使用salt来密码密码,MD5很受欢迎,但是有一些优秀的哈希,比如SHA和SHA-256。