存储密码的正确代码程序在MYSQL中确保密码安全

5

目前,我的代码使用标准的sha1进行密码哈希以实现数据库功能。

是否有更好、更安全的方式来存储密码?也许是MD5(开玩笑的)

例如,我正在使用Codeigniter作为我的框架,那么加密密码的最佳方式是什么?


标准的SHA-1不够安全。你需要加盐的SHA-1,至少如此。 - Ignacio Vazquez-Abrams
你应该阅读PHP Mcrypt库,我认为MCRYPT_RIJNDAEL_128是值得的。 - user1280616
@O.D 我没有给你点踩,但我猜可能是因为这个问题在Stack Overflow上已经被问过很多次了。我自己也曾经问过一个类似的问题:https://dev59.com/42ox5IYBdhLWcg3wHAwA - Tchoupi
4个回答

2
我会这样做。
salt = For each user generate a random seed with a random length. 

iterations = Select a random number

while(iterations  != 0)  {

hashed_password = hash_function(password.salt) . salt;    iterations-- }

在密码字段中保存它们的方式如下:
hashed_password:salt:hash_function:iterations.

在登录时,请使用新密码与盐、哈希函数和迭代结合使用进行哈希处理,并将结果与哈希后的密码进行比较。

当然,您可以使用多个哈希函数,例如 sha_x(md5(salt.password).salt).salt 或其他任何哈希函数,但一定要以某种方式保存它,以便在登录时进行比较。


我只会创建并使用一个普通的 authdb 条目。这样算法和程序员都可以更改,而且所有东西都能以同样的方式工作。 - Ignacio Vazquez-Abrams
1
+1. 对于每个用户,加盐和迭代已经足够了。我只想补充一点,迭代次数必须足够大,以使暴力攻击变得非常缓慢。而使用的加密函数并不重要,只要让它变慢,md5就足够好了,但推荐使用blowfish。 - Imre L

1

这个库非常好:http://www.openwall.com/phpass/ 它使用各种算法的加密方法,还有自己基于md5但具有许多迭代和盐的“安全”算法。


1

在哈希密码时,您应该真正使用 bcrypt,它是专门为哈希密码而设计的。

用于密码的哈希函数应该(需要一些计算时间)。大多数哈希算法如 SHA-1、MD5 或甚至 SHA-256 都被设计成快速的,但这使其成为暴力攻击的易目标。

不要害怕使用 bcrypt!它不仅适用于高安全性网站,而且使用它可以像使用 md5 哈希一样简单。建议使用一个经过良好验证的库,如 phpass,如果您想了解它的工作原理,可以阅读这篇 文章,我在其中试图解释最重要的几点。


0

SHA1在2005年被破解

2005年2月15日

SHA-1被破解

SHA-1已经被破解。不是简化版,也不是减少轮数的版本。是真正的SHA-1。

来自中国山东大学的王小云、尹丽sa和于洪波(主要成员)的研究小组一直在悄悄地传播一篇论文,描述了他们的结果:在2*69个哈希操作中找到了完整的SHA-1碰撞,比基于哈希长度的2*80次暴力攻击少得多。

在2**39个操作中找到了SHA-0的碰撞。

在2**33个操作中找到了58轮SHA-1的碰撞。

看看这个比较列表


这就是为什么你要加盐的原因。 - Ignacio Vazquez-Abrams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接