【问题标题】:Dovecot SHA512-Crypt and PHPDovecot SHA512-Crypt 和 PHP
【发布时间】:2016-09-02 21:03:09
【问题描述】:

我已使用以下说明安装邮件服务器: http://www.geoffstratton.com/ubuntu-mail-server-postfix-dovecot-and-mysql

现在我正在尝试用 PHP 编写登录表单,但不知道如何将输入的密码与保存的密码进行比较。

这是密码加密的mysql代码:

ENCRYPT('PASSWORD', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16)))

我不明白它是如何工作的,因为每次调用这个函数都会生成一个全新的字符串。

这是我目前所拥有的:

crypt($_POST[‘password’], '$6$'.substr(sha1(rand()), 0, 16))

但正如我所说的每次我得到一个新字符串。

【问题讨论】:

  • 对于 PHP 使用 password_hash 和 password-verify,请参见以下内容了解原因: 仅使用哈希函数是不够的,仅添加盐对提高安全性无济于事。相反,iIterate over an HMAC with a random salt for about 100ms duration and save the salt with the hash.使用 PBKDF2、password_hash、Bcrypt 等函数和类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。

标签: php mysql encryption sha512 dovecot


【解决方案1】:

使用 PHP 函数 password_hashpassword_verify。 这些函数加盐和迭代以提供安全保护。

请参阅 PHP 手册 password_hashpassword-verify

string password_hash ( string $password , integer $algo [, array $options ] )

返回散列密码,失败时返回 FALSE。

boolean password_verify ( string $password , string $hash )

如果密码和哈希匹配,则返回 TRUE,否则返回 FALSE。

示例代码:

$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT)

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

在您的情况下,您从数据库中获取该用户名的密码哈希,并将其保存在名为 $hash 的变量中。然后你像这样使用password_verify()

password_verify($_POST["password"], $hash)

【讨论】:

  • 非常感谢您的回答!它适用于密码验证。但是如果我用 password_hash 加密我的密码并将其添加到我的数据库中,dovecot 就无法使用它们。但是使用 mail-tutorial 和 password_verify 的加密,效果很好!
【解决方案2】:

考虑将密码简单地存储为哈希值的情况。任何阅读数据的人都很难弄清楚密码实际上是什么,但这并非不可能,确实有在线数据库包含大量索引散列和相应的明文 - 可以简单地查找常用密码的散列。此外,考虑两个用户具有相同哈希值的情况 - 这也意味着任何读取数据的人都会知道他们拥有相同的密码。

通过在明文中添加一个称为salt 的随机字符串,可以在安全系统上解决这两个问题。该盐只生成一次,然后与密码一起存储。

所以你存储的数据是 $6$[salt]$[hash of (salt + password)]

要验证密码,您可以使用存储的盐和提供的密码重新创建哈希,并将其与存储的哈希进行比较。 crypt 函数会忽略 salt 之后的任何数据,因此您只需这样做:

if ($stored === crypt($_REQUEST['password'], $stored)) {
    // Password is valid

您使用的代码在其盐派生中的熵非常低 - 这可能足以满足大多数目的,但不适用于高度安全的上下文。

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 2018-12-28
    • 2014-11-29
    • 1970-01-01
    • 2013-12-31
    • 2020-02-08
    • 2015-12-10
    相关资源
    最近更新 更多