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

Php 如何将哈希密码插入数据库?,php,Php,如何将哈希密码插入数据库而不是明文 (我已尝试将“?”替换为“SHA2(“?”,256')) 一定要包括一些解释,谢谢 $query= $con->prepare("INSERT INTO `useracct` (`email`, `password`, `name`) VALUES (?,?)"); $email = $_POST["email"]; $psswd = $_POST["passd"]; $name = $_POST["name"]; $query->bind_pa

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

(我已尝试将“?”替换为“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->bind_param('bb', $email, $psswd, $name);

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

替换如下

$query->bind_param('bb', $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]);

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

您可以尝试:

$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]);
$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\u HASH
函数对密码进行散列,PHP5.5及更高版本支持此函数。更多信息请点击此处:

另一种散列密码的方法是PHP的
crypt()
函数,该函数自PHP4以来一直受支持。更多信息可在此处找到:

您可以尝试:

$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\u HASH
函数对密码进行散列,PHP5.5及更高版本支持此函数。更多信息请点击此处:


另一种散列密码的方法是PHP的
crypt()
函数,该函数自PHP4以来一直受支持。更多信息可以在这里找到:

使用密码\u散列进行hasing

$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.';
}

使用密码\u散列进行hasing

$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.';
}
像这样使用,在查询中使用
$psswd1
而不是
$psswd


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

关于这一点有多种答案,但我觉得它们涵盖了如何,而不是为什么。我将尽量省略有关数据库处理程序或加密函数的详细信息,因为它们会随着时间的推移而变化

其他答案说明的要点是,您希望在PHP中创建哈希,而不是在MySQL中。原因是,如果您在MySQL中创建哈希,那么PHP需要向MySQL发送明文密码,而这只是攻击者可以利用的另一个向量

然后将密码另存为任何其他字符串。散列密码有多种方法,通常您希望存储散列密码和salt

例如:

$salt = bin2hex(random_bytes(16));
$passwordHash = sha1('123456' . $salt);
然后,您的查询将显示如下内容:

INSERT INTO ... (..., password, salt) VALUES (..., $passwordHash, $salt)
这有助于防止攻击者在知道密码哈希时发现密码;存储普通散列的问题是它容易受到彩虹表攻击,普通字符串已经映射到它们的散列,因此可以通过散列搜索原始字符串


编辑:请参阅Jay Blanchard的评论,了解使用PHP 5.5版内置函数的最新方法。

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

其他答案说明的要点是,您希望在PHP中创建哈希,而不是在MySQL中。原因是,如果您在MySQL中创建哈希,那么PHP需要向MySQL发送明文密码,而这只是攻击者可以利用的另一个向量

然后将密码另存为任何其他字符串。散列密码有多种方法,通常您希望存储散列密码和salt

例如:

$salt = bin2hex(random_bytes(16));
$passwordHash = sha1('123456' . $salt);
然后,您的查询将显示如下内容:

INSERT INTO ... (..., password, salt) VALUES (..., $passwordHash, $salt)
这有助于防止攻击者在知道密码哈希时发现密码;存储普通散列的问题是它容易受到彩虹表攻击,普通字符串已经映射到它们的散列,因此可以通过散列搜索原始字符串


编辑:请参阅Jay Blanchard的评论,了解使用PHP 5.5版内置函数的最新方法。

您将插入3列(
email
password
name
),但只有2个占位符,并且仅绑定2个值-这将导致执行
$psswd=hash($\u POST[“passd]”)失败和其他几乎相同。
回显“查询错误”这对你没有帮助
mysqli\u错误($con)
will.@OP您确定要使用
b
“在这里”吗?这些是字符串而不是blob,如果您的列是blob类型,您以后的查询可能会失败。请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,您可以使用
密码\u散列()
。您将插入3列(
电子邮件
密码
名称
),但只有2个占位符,仅绑定2个值-这将导致执行
$psswd=hash($\u POST[“passd”])失败和其他几乎相同。
回显“查询错误”这对你没有帮助
mysqli\u错误($con)
will.@OP您确定要使用
b
“在这里”吗?这些是字符串而不是blob,如果您的列是blob类型,您以后的查询可能会失败。请使用PHP来处理密码安全性。如果你使用的PHP版本低于5.5,你可以使用
密码\u hash()
。你能在这里给全世界一个解释吗?提前谢谢;-)你能在这里给世界一个解释吗?提前谢谢;-)问题是,他们为什么要取代它;-)问题是,他们为什么要取代它;-)这是一个尝试这个答案。我注意到了编辑,但给出一个解释将是有益的;-)这是一个尝试这个答案。我注意到了编辑,但给出一个解释将是有益的;-)除了这不起作用之外,md5现在被认为是不安全的,不应该被用作密码的散列。你真的不应该使用它。请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,您可以使用
密码\u散列()
。除此之外,md5现在被认为是不安全的,不应该用作密码散列。您真的不应该使用。请使用PH值