关于php:如何加密插入MySQL表的密码?

How to encrypt a password that is inserted into a MySQL table?

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$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服务器。


您可以使用hash()函数散列密码:

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

然后修改insert语句,将哈希密码插入数据库:

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

请注意,您的SQL语句容易受到SQL注入的攻击,因为您使用的是未初始化的用户输入。为了提高安全性并保护数据的完整性,请考虑在SQL语句中使用输入之前对其进行转义和验证。实现这一目标的一种方法是通过mysqli_real_escape_string()

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


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

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

其次,您应该避免使用像sha512这样的快速哈希。它不再被认为是安全的。看看这个问题。您基本上希望使用类似bcrypt的自适应哈希函数。


下面是一个如何散列密码的示例:

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

我建议你加上密码。请在此处阅读更多信息:网址:http://www.aspheute.com/english/20040105.asp

还可以阅读"mysqli_real_escape_string"

&和准备好的声明。


首先清理输入数据。$password=filter_input(input_post,'password',filter_sanitize_string);

散列密码字符串

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

更好的密码散列方法是使用新的密码散列API

1
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);


请在进入数据库前转义数据。他们容易受到攻击。

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