我需要为电子邮件确认创建一个唯一的ID,因此当客户点击链接时,它会将他们带到页面输入他们的电子邮件,一旦他们输入电子邮件,就会向他们发送一封电子邮件。 电子邮件中包含一个链接,通过进入链接,他们可以更改密码。 它的过程,但我需要你确认我的步骤,首先我生成一个随机数并将其添加到与用户ID相关联的数据库,如果该页面打开然后我允许他们更改密码吗?
答案 0 :(得分:3)
为此使用java.util.UUID。
答案 1 :(得分:1)
您的程序几乎是正确的。你应该注意以下几点:
1)使密钥不可预测,以便即使知道代码,也没有人可以创建自己的有效密钥。由于您仍然将密钥存储在数据库中,因此您可以创建“真正随机”密钥,这比使用已知值(如电子邮件和用户ID)要好得多。密码重置功能通常是Web应用程序安全性中最薄弱的环节。
// this (untested) code reads from the OS random source to create a random id
function createRandomKey($length)
{
$buffer = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
$encodedBuffer = base64_encode($buffer);
return substr($encodedBuffer, 0, $length);
}
2)不要直接在数据库中存储这个随机密钥,而是像密码一样处理它并存储哈希值。这有助于攻击者可以读取您的数据库(SQL注入),即使这样他也不会免费获得所有密钥。
3)给每个密钥一个到期日,因此“忘记”密钥不能再使用了。
4)使用后应删除密码重置密钥,因此在密码成功更改后将其从数据库中删除。
编辑:
抱歉,我错过了你问题中的Java标记,我的例子是PHP。不幸的是我不能用Java提供一个例子,但原理是一样的。
答案 2 :(得分:0)
我已经使用PHP了。我通常会创建一些我可以稍后验证的跟踪信息。就像在电子邮件地址或用户ID上使用MD5或SHA1哈希一样。或者,如果你想要,你可以将两者结合起来:
Java脚本:hex_md5(random_number + user_id + something_else);
PHP:md5($email.$userID.$unique_server_key);
这应该为您提供一个唯一的密钥来跟踪它们。将其保存在数据库中以及用于生成它的变量中,以便以后跟踪它。我强烈建议PHP版本,因为它的服务器端将有助于防止恶意用户了解您的令牌生成算法。
JavaScript哈希库: http://pajhome.org.uk/crypt/md5/
编辑: 对不起,我也错了。对于java,您需要使用加密库来生成哈希。试试这段代码(未经测试,我只是输入)
import java.security.*;
.....
string hash = unique_salt_key.concat(user_id).concat(email);
byte[] hashBytes = hash.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] emailCrypt = md.digest(hashBytes);
string emailToken = new String(emailCrypt)
我相信正确使用MD5。我只是使用变量user_id和email,因为它们已经全部保存在您的数据库中。从数据库中使用多个常量是最好的。对不起,如果我的java上有点生锈。
答案 3 :(得分:0)
import java.security.*;
.....
string hash = unique_salt_key.concat(user_id).concat(email);
byte[] hashBytes = hash.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] emailCrypt = md.digest(hashBytes);
string emailToken = new String(emailCrypt)
How to decrypt it again to get user_id and email?