为电子邮件确认创建唯一ID

时间:2013-01-29 05:54:29

标签: java passwords

我需要为电子邮件确认创建一个唯一的ID,因此当客户点击链接时,它会将他们带到页面输入他们的电子邮件,一旦他们输入电子邮件,就会向他们发送一封电子邮件。 电子邮件中包含一个链接,通过进入链接,他们可以更改密码。 它的过程,但我需要你确认我的步骤,首先我生成一个随机数并将其添加到与用户ID相关联的数据库,如果该页面打开然后我允许他们更改密码吗?

4 个答案:

答案 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?