我已使用以下说明安装邮件服务器: 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))
但正如我每次收到新字符串时所说的那样。
答案 0 :(得分:0)
使用PHP函数password_hash
和password_verify
。
这些函数通过迭代和迭代来提供安全保护。
请参阅PHP手册password_hash和password-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
您使用的代码在其盐派生中具有非常低的熵 - 这可能适用于大多数目的,但不适用于高度安全的上下文。