【问题标题】:How to encrypt a password that is inserted into a MySQL table? [duplicate]如何加密插入 MySQL 表的密码? [复制]
【发布时间】:2013-07-21 18:09:44
【问题描述】:

我有一些代码可以注册,但我不知道如何散列密码。我想用sha512。

$con=mysqli_connect("localhost","root","","users");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql="INSERT INTO users (username, password, email)
VALUES
('$_POST[username]','$_POST[password]','$_POST[email]')";

if (!mysqli_query($con,$sql))
{
die('Error: ' . mysqli_error($con));
}
echo "Thank you.";

mysqli_close($con);

我知道我的 mysql 登录没有密码。这是一个本地 mysql 服务器,仅用于测试。

【问题讨论】:

  • 散列不加密。 sha512 是一种散列算法。散列后您的密码将无法检索。
  • @Russell 密码不应被检索,所以这不是问题。在未来的验证尝试中,提供的密码将被散列并与存储的散列匹配。
  • @GeorgeCummins 我同意这不是问题。我更担心使用不正确的术语。也就是说,他不想加密任何东西。这两个词不可互换。
  • 我知道这个问题比较老了,但是因为大多数答案都弄错了(没有盐,只有简单的 sha512),这里有一篇关于如何hash passwords in PHP 的帖子。如果您对密码哈希感兴趣,请查看这篇关于 hashing passwords correctly 的帖子。

标签: php mysql hash sha512


【解决方案1】:

您可以使用hash() 函数对您的密码进行哈希处理:

$hashed_password = hash('sha512', $_POST['password']);

然后修改您的插入语句,将您的散列密码插入数据库:

INSERT INTO users (username, password, email)
VALUES ('$_POST[username]', '$hashed_password', '$_POST[email]');

请注意,您的 SQL 语句容易受到 SQL 注入的影响,因为您使用的是未经处理的用户输入。为了提高安全性并保护数据的完整性,请考虑在 SQL 语句中使用输入之前对输入进行转义和验证。一种方法是通过mysqli_real_escape_string()

$escaped_username = mysqli_real_escape_string( $con, $_POST['username'] );
$escaped_email = mysqli_real_escape_string( $con, $_POST['email'] );

【讨论】:

  • 散列不加密!但是,对sql注入的好调用
  • @Russell 我更新了替换有问题的词。尽管问题标题是:“我想使用 sha512.,但 OP 想要散列
  • 谢谢。在安全方面我有点过于偏执,所以当人们混淆“哈希”和“加密”时,我总是倾向于使用它。我不喜欢这些术语变得混乱,因为它们是非常不同的东西。不幸的是,这么多人在不知道更好的情况下互换使用它们。我希望我没有冒犯:)
  • 哈希有效,谢谢,但现在我在代码的反注入部分遇到错误:警告:mysqli_real_escape_string() 需要 2 个参数,1 个在 C:\wamp\第 10 行 www\users\insert.php 第 10 行: $eusername = mysqli_real_escape_string( $_POST['username'] ); $sql="INSERT INTO users (username, password, email) VALUES ('$eusername','$hpassword','$eemail')";
【解决方案2】:

首先清理您的输入数据。 $password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);

散列你的密码字符串

$hashedPassword = hash('sha512', $password);

对密码进行哈希处理的更好方法是使用新的密码哈希 API

$hashedPassword = password_hash($password, PASSWORD_DEFAULT);

【讨论】:

  • BAD 清理密码的想法。您将丢弃用户可能希望在其密码中实际 HAVE 的任何特殊字符。同样,在 php 中散列后,任何 sql 注入类型的字符都会消失。
  • 你说得很好!
【解决方案3】:

以下是如何对密码进行哈希处理的示例:

<?php
$password = hash('sha512', $_POST[password]);

我建议对密码加盐。在此处阅读更多信息:
http://www.aspheute.com/english/20040105.asp

另请阅读“mysqli_real_escape_string

…和 Prepared Statements

【讨论】:

  • 由于密码散列不当而投反对票。
  • 给定链接中的内容已过时。 SHA1 不再安全。另外,由于问题是关于 PHP,而不是 ASP,我建议将您的链接更新为更相关的,例如:php.net/manual/en/faq.passwords.php
【解决方案4】:

你在这里做的事情有很多问题。

首先,您很容易受到 SQL 注入的攻击,因为您没有清理 SQL 中的输入。

其次,您应该避免为此使用 SHA512 之类的快速哈希。它不再被认为是安全的。看看this question。您基本上想使用像 bcrypt 这样的自适应哈希函数。

【讨论】:

    【解决方案5】:

    请在输入您的数据库之前转义您的数据。他们很容易受到攻击。

    hash('sha512', $_POST['password']);
    

    【讨论】:

    • 由于密码散列不当而投反对票。
    猜你喜欢
    • 2011-07-14
    • 2013-04-15
    • 2011-10-24
    • 2014-10-16
    • 2018-08-10
    • 2012-07-21
    • 2013-05-04
    • 2020-11-30
    • 2021-11-09
    相关资源
    最近更新 更多