我正在为Web应用程序创建登录系统。要在DB中存储密码,我使用sha256加密密码,如下所示:
$salt ="sometext";
$escapedPW="userpass";
$saltedPW = $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);
echo "<center>".$hashedPW."</center>";
在数据库中,我存储用户,用户的密码和用于制作哈希的盐,并验证用户的登录信息。现在我正在使用密码向用户发送电子邮件,但是当用户收到电子邮件时,由于存储在sha256加密密码中,用户会收到一个长字符串,而不是用户所谓的密码知道。
我的问题是,我有什么方法可以向您发送实际的用户密码和非密码加密,也就是说,如果我知道盐,有一些方法可以反向使用sha256。如果不可能,建议您使用何种加密方法来完成加密密钥的反转并通过电子邮件将实际密码发送给用户。
答案 0 :(得分:7)
正如你的问题的评论中所提到的,反转哈希不是一个真正的选择。
然而,你可以做什么,这也是其他人所做的。在您的注册码(例如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)")
一些粗略的示例代码。我希望它有所帮助!
答案 1 :(得分:2)
您绝不应该通过电子邮件发送明文密码。而是发送时间有限的一次性“重置密码”链接,如评论中所示。
你应该不使用@Henrik建议的简单哈希。使用标准的可调工作密码KDF(PBKDF2,bcrypt,scrypt)
如果您可以使用PHP 5.5,请使用standard password hashing functions。有些主机支持PHP 5.5,但您必须查找它们并要求它。
网络上有很多地方可以解释如何正确地执行此操作(例如https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Authentication)以及许多解释如何正确执行此操作的地方。在决定推出自己的身份验证系统之前,请花点时间研究一下。