散列密码的最佳方法是啥? [复制]

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 是的,它是一样的......我从来没有使用过它,所以我不知道成本是多少......我想你可能只是使用默认值。

以上是关于散列密码的最佳方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

复制数据库的最佳方法是啥?

检查属性是不是存在的最佳方法是啥? [复制]

以正确格式显示 localDateTime 的最佳方法是啥? [复制]

Android隐藏日志的最佳方法是啥? [复制]

计算用于运输的最佳包装箱尺寸的最佳方法是啥? [复制]

检查 Python 变量类型的最佳(惯用)方法是啥? [复制]