Dovecot SHA512-Crypt和PHP

时间:2016-09-02 21:03:09

标签: php mysql encryption sha512 dovecot

我已使用以下说明安装邮件服务器: 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))

但正如我每次收到新字符串时所说的那样。

2 个答案:

答案 0 :(得分:0)

使用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)

答案 1 :(得分:0)

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

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

所以你存储的数据是$ 6 $ [salt] $ [哈希(盐+密码)]

要验证密码,请使用存储的salt和显示的密码重新创建哈希值,并将其与存储的哈希值进行比较。 crypt函数忽略salt之后的任何数据,所以你只需这样做:

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

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