2

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

4

4 回答 4

3

为此使用 java.util.UUID。

于 2013-01-29T06:39:50.103 回答
3

你的程序几乎是正确的。不过,您应该注意以下几点:

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 示例,但原理是相同的。

于 2013-01-29T08:27:46.940 回答
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 有点生疏。

于 2013-01-29T06:02:17.997 回答
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?
于 2016-09-06T07:16:34.240 回答