繁体   English   中英

如何将哈希密码插入数据库?

[英]How do I insert a hash password into the database?

如何将哈希密码而不是明文插入数据库?

(我尝试用'SHA2('?',256')'替换'?')。

也包括一些解释,谢谢!

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?)");
$email = $_POST["email"];
$psswd = $_POST["passd"];
$name = $_POST["name"];

$query->bind_param('bb', $email, $psswd, $name);
if ($query->execute()) {
  echo "Query executed.";
}else{
  echo "Query error.";
}

您可以尝试:

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?,?)");
$email = $_POST["email"];
$psswd = PASSWORD_HASH($_POST["passd"], PASSWORD_DEFAULT);
$name = $_POST["name"];

$query->bind_param('bbb', $email, $psswd, $name);
if ($query->execute()) {
  echo "Query executed.";
} else{
  echo "Query error.";
}

我已经使用PHP的PASSWORD_HASH函数对PASSWORD_HASH进行哈希处理,并且PHP 5.5和更高版本支持此功能。 此处的更多信息: http : //php.net/manual/zh/ref.password.php

散列密码的另一种方法是自PHP 4开始支持的PHP crypt()函数。有关更多信息,请参见: http : //php.net/manual/en/function.crypt.php

在下面替换

$query->bind_param('bb', $email, $psswd, $name);

$query->bind_param('bbb', $email, $psswd, $name);

由于您使用的是三个变量,因此还应该使用三种数据类型。

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?,?)"); //missing one parameter here
$email = $_POST["email"];
$psswd = $_POST["passd"]; 
$hash = password_hash($password, PASSWORD_DEFAULT); 
$name = $_POST["name"];
$query->execute([$email, $hash, $name]);

使用PASSWORD_HASH拥有

$query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?,?)");
$email = $_POST["email"];
$psswd = $_POST["passd"];
$name = $_POST["name"];

$query->bind_param('bbb', $email, PASSWORD_HASH($psswd, PASSWORD_DEFAULT), $name);
if ($query->execute()) {
  echo "Query executed.";
}else{
  echo "Query error.";
}

供验证使用

// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
$psswd = $_POST["passd"];
$psswd1 =password_hash("passwd");

这样使用,并在查询中使用$psswd1而不是$psswd

关于此问题有多个答案,但我认为它们涵盖了如何而不是为什么 我将尽量省略有关数据库处理程序或加密功能的详细信息,因为它们会随着时间的推移而变化。

其他答案表明的要点是,您想在PHP中创建散列,而不是在MySQL中创建散列。 原因是如果您在MySQL中创建哈希,则PHP需要向MySQL发送明文密码,而这仅仅是攻击者可以利用的另一种媒介。

然后将密码另存为其他字符串。 散列密码的方式有多种,通常您需要存储散列的密码和一个盐。

例如:

$salt = bin2hex(random_bytes(16));
$passwordHash = sha1('123456' . $salt);

然后您的查询将显示为:

INSERT INTO ... (..., password, salt) VALUES (..., $passwordHash, $salt)

当攻击者知道密码的哈希值时,这有助于防止找出密码; 存储普通哈希的问题是容易受到彩虹表攻击 ,因为普通字符串已经映射到其哈希,因此可以通过其哈希搜索原始字符串。

编辑:请参阅Jay Blanchard的评论,以获取使用自5.5以来内置在PHP中的函数的最新方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM