0

我想加密一些密码并将其放入数据库中。如何将这些东西保存在数据库中,以便在所有者匹配时检索数据。

例子

<?php
// some validations and other staff
$data = $_POST['input'];
$hash = crypt($data);
//then database insert code
?>

如果我echo$hash,它会给我一些加密数据,但是当我刷新页面时,数字会不时变化。如何保持数据静态?输入用户名和密码时,我将如何告诉加密密码这是所有者。

例子

<?php
//time of encryption 
$name = "someone";
$pass = "p1x6Fui0p>j";
$hash = "$pass"; //outcome of $hash e.g. $1$aD2.bo0.$S93XNfgOFLskhis0qjE.Q/

// $hash and $name inserted in database
?>

当用户尝试使用收集详细信息登录时,我将如何引用$hash"$1$aD2.bo0.$S93XNfgOFLskhis0qjE.Q/" 等于$pass"p1x6Fui0p>j" ?

4

3 回答 3

4

crypt()有一个不幸的名字。它不是加密函数,而是单向散列函数。

如果您使用的是 PHP 5.5+,只需使用password_hashand password_verify

$hash = password_hash($data, PASSWORD_BCRYPT);  // Bcrypt is slow, which is good

并验证输入的密码:

if (password_verify($pass, $hash)) {
    // The password is correct
}

现在回答您的实际问题:密码哈希的目的是在不实际存储其明文密码的情况下验证用户身份。如果hash(a) == hash(b),那么你可以很确定a == b。在您的情况下,您已经拥有hash(a)( $hash),因此您只需对输入的密码进行哈希处理并比较生成的哈希值。

crypt()为您执行此操作:

if (crypt($pass, $hash) === $hash) {
    // The password is correct
}
于 2013-06-10T21:11:19.830 回答
2

从 php crypt 页面

if (crypt($user_input, $hashed_password) == $hashed_password) {
   echo "Password verified!";
}
于 2013-06-10T21:10:27.790 回答
0

您没有使用自己的盐,因此每次调用都会自动生成盐,并对加盐密码进行哈希处理。要从此密码中获取相同的哈希值,您需要crypt使用在第一次运行期间生成的精确盐值来运行。

生成的盐因用于散列的算法而异,但从您的示例中它是 MD5,并且盐由第一个和第三个美元符号分隔:

$hash = '$1$aD2.bo0.$S93XNfgOFLskhis0qjE.Q/';
//       \   salt   /

因此,要获得完全相同的哈希,您需要调用crypt($pass, '$1$aD2.bo0.$');

请记住,如果您想使用自己的盐,它需要为给定算法采用正确的格式。为了获得最佳效果,请使用@Blenderpassword_hash提到的php 5.5+ ,对于较旧的 php 版本,有password_compat 库,这样您就不必担心正确的盐格式。

于 2013-06-10T21:23:36.417 回答