本问题已经有最佳答案,请猛点这里访问。
我有一些代码可以注册,但我不知道如何散列密码。我想用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密码不应该被检索,所以这不是问题。在以后的验证尝试中,提供的密码将被散列并与存储的散列匹配。
@格鲁吉亚人我同意这不是问题。我更担心使用的术语不正确。也就是说,他不想加密任何东西。这两个词不能互换。
我知道这个问题相当古老,但是因为大多数答案都是错误的(没有盐,只有简单的sha512),这里有一篇关于如何在php中散列密码的文章。如果你对密码散列感兴趣的话,请查看这篇关于正确散列密码的文章。
您可以使用hash()函数散列密码:
$hashed_password = hash('sha512', $_POST['password']);
然后修改insert语句,将哈希密码插入数据库:
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注入的良好调用
@拉塞尔,我更新了这个冒犯的词。尽管题目是:"我想使用sha512",但操作人员还是希望散列。
谢谢。在安全性方面,我有点过于偏执,所以当人们混淆"hash"和"encrypt"时,我往往会跳到上面。我不喜欢那些术语混淆,因为它们是非常不同的东西。不幸的是,这么多人在不知道任何更好的情况下互换使用它们。希望我没有冒犯:)
hashing有效,谢谢,但是现在我在代码的反注入部分出错了:警告:mysqli_real_escape_string()只需要2个参数,1个参数在c:wampwwwusersinsert.php的第10行中给出:$eusername=mysqli_real_escape_string($_post['username']);$sql="insert into users(username,password,email)值('$eusername'、'$hpassword'、'$eemail');
@特雷弗,我道歉。mysqli_real_escape_strong希望链接作为第一个参数。我已经更新了答案以反映这一要求。
@乔治库明斯啊哈,我看到你读过我的答案(mysqli_real_escape_string);-)=
@马库斯,你是说你在我之后1分55秒发的那个?是的,我看到了。;)
如果您关心安全性,我会给这个阅读:crackstation.net/hashing-security.htm有一些深入的知识,如果您希望构建一个安全的应用程序,您应该阅读并扩展这些知识。
由于密码散列不正确导致投票被否决。
你在这里做的事情有很多问题。
首先,您容易受到SQL注入的攻击,因为您没有清理SQL中的输入。
其次,您应该避免使用像sha512这样的快速哈希。它不再被认为是安全的。看看这个问题。您基本上希望使用类似bcrypt的自适应哈希函数。
下面是一个如何散列密码的示例:
$password = hash('sha512', $_POST[password]);
我建议你加上密码。请在此处阅读更多信息:网址:http://www.aspheute.com/english/20040105.asp
还可以阅读"mysqli_real_escape_string"
&和准备好的声明。
由于密码散列不正确导致投票被否决。
给定链接中的内容已过时。Sha1不再安全。另外,由于问题是关于php而不是asp,我建议将链接更新到更相关的链接,例如:php.net/manual/en/faq.passwords.php
首先清理输入数据。$password=filter_input(input_post,'password',filter_sanitize_string);
散列密码字符串
$hashedPassword = hash('sha512', $password);
更好的密码散列方法是使用新的密码散列API
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
清理密码的坏主意。您将丢弃用户可能想要在其密码中包含的任何特殊字符。同样,在用PHP散列之后,任何SQL注入类型的字符都将以任何方式消失。
你说得不错!
请在进入数据库前转义数据。他们容易受到攻击。
hash('sha512', $_POST['password']);
由于密码散列不正确导致投票被否决。