散列密码的最佳方法是啥? [复制]
Posted
技术标签:
【中文标题】散列密码的最佳方法是啥? [复制]【英文标题】:What way is the best way to hash a password? [duplicate]散列密码的最佳方法是什么? [复制] 【发布时间】:2014-01-15 18:34:57 【问题描述】:我正在开发一个对用户来说应该非常安全的网站,所以我需要对密码进行哈希处理。通常我使用 MD5,但我读到它不再安全了。所以我尝试了phpass,但后来我读到它也被破解了。所以我尝试了 PHP 5.5 的password_hash()
,但我使用的是 HostGator,而且那里的 PHP 是 5.4。此外,我希望能够在不知情的情况下添加盐(如time() * userid()
),如password_hash()
。
哈希强度对我来说非常重要,因为我想 100% 确保我的用户是安全的。那么有没有一种非常安全的方法,而不是像 SHA 这样很快就会被黑客入侵的方法?
【问题讨论】:
sha256 是一种目前仍然相当可靠的安全单向哈希函数,适用于密码存储。 看这里:***.com/a/6337021/2629998. @halfer 答案建议他使用 PHPass,但正如我在这里写的那样,它不再安全了。这在 2012 年很棒,但在 2014 年已经(几乎)...... @Vlad:那里接受的答案涵盖了为尚未拥有 5.5 的用户提供password_hash
的库。因此,我认为这个问题仍然是重复的。
旁白:一般不建议使用password_hash
添加自己的盐,除非您了解其背后的密码学。它会自行添加自己的盐 - 请参阅 PHP 手册页。
【参考方案1】:
看看http://php.net/manual/de/function.crypt.php
您应该考虑使用盐来防止彩虹表攻击 你可以在这里找到教程:http://www.yiiframework.com/wiki/425/use-crypt-for-password-storage/
【讨论】:
【参考方案2】:PHP 带有内置的哈希算法,例如 MD5、SHA1 等。但是,从安全角度来看,不建议使用这些函数对密码进行哈希处理,因为使用 Passwordpro 等工具很容易通过暴力攻击破解它们。
最好使用加盐来保护密码。下面是一个例子:
$password = 'yourpassword';
$salt = 'randomstr!ng';
$password = md5($salt.$password);
一种更好的生成盐的方法是先散列它:
$password = 'yourpassword';
$salt = sha1(md5($password));
$password = md5($password.$salt);
这样做的好处是盐值是随机的,它会随着每个密码而变化,几乎不可能被破解。
【讨论】:
【参考方案3】:我认为最好的办法是使用库来管理密码。 如果你不能使用 php 5.5,你可以试试这个适用于 php5.3+ 的库,看看这个项目:
http://rchouinard.github.io/phpass/
【讨论】:
So I tried the PHPass, but then I read the it is also has been cracked
你在使用任何框架吗?
@ChristianGiupponi no.【参考方案4】:
使用this library,它提供与password_*
函数的前向兼容性。
示例用法:
require_once("password.php"); // imports the library, assuming it's in the same directory as the current script
$password = "Hello***"; // example password
$hash = password_hash($password, PASSWORD_BCRYPT); // here's the hash of the previous password
$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10)); // you can set the "complexity" of the hashing algorithm, it uses more CPU power but it'll be harder to crack, even though the default is already good enough
if (password_verify($password, $hash)) // checking if a password is valid
/* Valid */
else
/* Invalid */
【讨论】:
与 PHP 5.5 中的password_hash()
相同还是更弱?你建议使用什么费用(我在 HostGator 托管,所以我猜他们的服务器很强大)?
@VladGincher 是的,它是一样的......我从来没有使用过它,所以我不知道成本是多少......我想你可能只是使用默认值。以上是关于散列密码的最佳方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章