提问者:小点点

解码哈希sha256加密,知道盐


我正在为Web应用程序制作登录系统。要将密码存储在数据库中,我正在使用sha256加密密码,如下所示:

$salt ="sometext";
$escapedPW="userpass";
$saltedPW =  $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);
echo "<center>".$hashedPW."</center>";

在数据库中,我存储了用户、用户密码和用于散列和验证用户登录的salt。现在,我正在向用户发送包含您的密码的电子邮件,但是当用户收到电子邮件时,由于存储在sha256加密密码中,用户收到的是一个长字符串,而不是用户应该知道的密码。

我的问题是,我可以通过任何方法向您发送实际的用户密码和非密码加密,即,如果我知道盐,有一些方法可以反向执行sha256?如果无法实现,建议您使用哪种加密方法完成加密密钥的反转,并在电子邮件中将实际密码发送给用户。


共2个答案

匿名用户

正如在你的问题的评论中提到的,反转散列并不是一个真正的选择。

然而,你能做的是,其他人也是这样做的。在表单发布的注册代码(例如register.php)中,您可以让php脚本在电子邮件中发送密码,然后对其进行加密并将其存储在数据库中。

我想你有某种注册表单,并且该表单应该将新用户的详细信息发布到另一个(或相同的)php脚本,不是吗?

例如,如果我的表单说类似

在< code>register.php中,我会有这样的代码

<?php
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']); /*cleartext*/
$email    = mysql_real_escape_string($_POST['email']);

mail($email,"New account","Your username \"$username\" and your password is \"$password\"");

$salt ="sometext";
$escapedPW="userpass";
$saltedPW =  $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);

mysql_query("INSERT INTO users (username, password, email) VALUES ($username, $hashedPW, $email)")

一些粗略的示例代码。我希望它有帮助!

匿名用户

你不应该通过电子邮件发送明文密码。相反,按照评论中的建议,发送一个有时间限制的一次性“重置密码”链接。

你不应该像@Henrik建议的那样使用简单的hash。使用标准的可调工作密码KDF (PBKDF2,bcrypt,scrypt)

如果你能使用PHP 5.5,使用标准的密码散列函数。有些主机确实支持PHP 5.5,但是你必须去找他们并索取。

网络上有很多地方解释如何正确地做到这一点(例如 https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Authentication),还有许多地方解释如何错误地做到这一点。在决定推出自己的身份验证系统之前,请花一些时间对此进行研究。