10

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

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

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

我的问题是有什么方法可以向您发送实际的用户密码和非密码加密,即,如果我知道盐,有什么方法可以反转 sha256?如果不可能,建议您使用哪种加密方法来完成加密密钥的反向并通过电子邮件将实际密码发送给用户。

4

2 回答 2

8

正如您问题的评论中提到的,反转哈希并不是一个真正的选择。

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

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

例如,如果我的表格说的是<form method="post" action="register.php">

然后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)")

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

于 2013-09-06T22:40:52.817 回答
4

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

您不应该使用@Henrik 建议的简单哈希。使用标准的可调整工作密码 KDF (PBKDF2,bcrypt,scrypt)

如果您可以使用 PHP 5.5,请使用标准密码散列函数。有些主机确实支持 PHP 5.5,但你必须寻找它们并要求它。

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

于 2013-09-26T19:27:49.403 回答