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



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

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

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

为此请使用java.util.UUID。

我为此使用了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和电子邮件,因为它们都已保存在您的数据库中。最好使用数据库中的多个常量。对不起,如果我的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)

How to decrypt it again to get user_id and email?

相关内容

  • 没有找到相关文章

最新更新