我想知道是否有人可以给我一些建议吗?我想知道以下代码用于使用 Codeigniter 加密密码有多安全/不安全或其他垃圾?
$safe_password = sha1($password, $config['encryption_key'])
如果不安全,人们可以给我一些提示以使其使用 Codeigniter 更安全吗?
非常感谢 :)
我想知道是否有人可以给我一些建议吗?我想知道以下代码用于使用 Codeigniter 加密密码有多安全/不安全或其他垃圾?
$safe_password = sha1($password, $config['encryption_key'])
如果不安全,人们可以给我一些提示以使其使用 Codeigniter 更安全吗?
非常感谢 :)
众所周知,sha1 容易受到碰撞攻击,请尝试使用 bcrypt,因为它是最好的之一。如果 bcrypt 对您不起作用,请使用 sha512 并添加盐。
bcrypt 可能看起来令人生畏,但这里有一篇关于为什么你应该使用它的文章:http: //phpmaster.com/why-you-should-use-bcrypt-to-hash-stored-passwords/
sha1 不安全的原因是因为碰撞攻击,这里是暴露 sha1 安全风险的论文之一:http ://www.schneier.com/blog/archives/2005/02/cryptanalysis_o.html
如果您想使用 sha512,您需要做的就是:
hash('sha512', $password.$salt);
并确保您始终使用盐,否则有人可以使用彩虹表(数据库)来查看您的哈希是否与数据库中的通用密码匹配。
更好的解决方案是使用 bcrypt,看看这个教程。
这是一个可以与 Codeigniter 一起使用的小型库https://github.com/waldirbertazzijr/codeigniter-bcrypt
另一个相关的问题。
sha1 和 md5 等散列算法不适用于密码存储。它们的设计非常高效。这意味着暴力破解非常快。即使黑客获得了您散列密码的副本,暴力破解也很快。如果您使用盐,它会使彩虹表的效果降低,但对蛮力没有任何作用。使用较慢的算法会使蛮力无效。例如,bcrypt 算法可以随心所欲地变慢,并且它在内部使用盐来防止彩虹表。如果我是你,我会采用这种方法或类似方法。
来自 PHP 文档
string sha1 ( string $str [, bool $raw_output = false ] ) 如果可选raw_output 设置为 TRUE,则 sha1 摘要以长度为 20 的原始二进制格式返回,否则返回值为 40 个字符十六进制数。
我的建议使用BCRYPT
它更安全以便于实施,您可以尝试password_compat
例子
$hash = password_hash($password, PASSWORD_BCRYPT);
不,sha1()
不被认为是安全的,例如在这里:
http ://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash
目前,一个不错的选择可能是使用盐的 SHA512:hash('sha512', 'text+salt')