存储验证码
Storing verifaction code
我正在构建一个在前端运行反应并在后端运行 Java/Spring 的网络应用程序。
我正在使用 RESTful API 与我的客户通信(客户也将与外部 API 通信)。
我遇到了问题。当用户注册时,我想发送一个电子邮件验证码。我的问题是练习。
- 是否可以发送一个带有验证码的邮件,将验证码存储在数据库中,然后检查验证码是否正确?
- 还是创建一些静态 bean 来保存代码一段时间然后检查它是否正确更好?
我不确定在后端逻辑方面哪个更好。
感谢所有帮助。
将其存储在数据库中是一种非常常见的做法。只需确保偶尔清理过期的令牌(可能是在计时器上,可能是在插入新令牌时)。
您还可以将令牌存储在内存缓存中(想到 EhCahe
)并相应地设置过期时间,但是如果应用程序关闭,这样您将丢失缓存。是的,你可以使缓存持久化,但为什么不走数据库路线呢?
话虽如此,请考虑不要将令牌存储在任何地方,而是将 link 与电子邮件一起作为 URL 参数发送,并将加盐哈希作为附加参数发送。单击 link 后,您可以检查哈希是否匹配,如果匹配,则电子邮件参数未被篡改,因此您可以将其标记为已验证。也许不是五角大楼级别的安全,但可能足以进行电子邮件验证并使一切变得更容易。
在伪代码中:
public String hash(String email) {
MessageDigest digester = MessageDigest.getInstance("SHA-256");
digester.update(email.getBytes(StandardCharsets.UTF_8)));
digester.update("RanDOmComplCatEdSalt647826583745".getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(digester.digest());
}
String email = "dude@example.com";
sendEmailWithLink("/verify?email=" + email + "&hash=" + hash(email));
在进入的路上,您只需执行完全相同的操作来计算并检查哈希是否匹配:
String email = httpRequest.getParameter("email");
String receivedHash = httpRequest.getParameter("hash");
if (hash(email).equals(receivedHash)) {
//the user didn't do anything funny, mark email as valid
}
或者,进一步采用此想法但具有更高的安全性,您可以生成类似 JWT 的内容,其中包含电子邮件并已正确加密。
我正在构建一个在前端运行反应并在后端运行 Java/Spring 的网络应用程序。 我正在使用 RESTful API 与我的客户通信(客户也将与外部 API 通信)。
我遇到了问题。当用户注册时,我想发送一个电子邮件验证码。我的问题是练习。
- 是否可以发送一个带有验证码的邮件,将验证码存储在数据库中,然后检查验证码是否正确?
- 还是创建一些静态 bean 来保存代码一段时间然后检查它是否正确更好?
我不确定在后端逻辑方面哪个更好。
感谢所有帮助。
将其存储在数据库中是一种非常常见的做法。只需确保偶尔清理过期的令牌(可能是在计时器上,可能是在插入新令牌时)。
您还可以将令牌存储在内存缓存中(想到 EhCahe
)并相应地设置过期时间,但是如果应用程序关闭,这样您将丢失缓存。是的,你可以使缓存持久化,但为什么不走数据库路线呢?
话虽如此,请考虑不要将令牌存储在任何地方,而是将 link 与电子邮件一起作为 URL 参数发送,并将加盐哈希作为附加参数发送。单击 link 后,您可以检查哈希是否匹配,如果匹配,则电子邮件参数未被篡改,因此您可以将其标记为已验证。也许不是五角大楼级别的安全,但可能足以进行电子邮件验证并使一切变得更容易。 在伪代码中:
public String hash(String email) {
MessageDigest digester = MessageDigest.getInstance("SHA-256");
digester.update(email.getBytes(StandardCharsets.UTF_8)));
digester.update("RanDOmComplCatEdSalt647826583745".getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(digester.digest());
}
String email = "dude@example.com";
sendEmailWithLink("/verify?email=" + email + "&hash=" + hash(email));
在进入的路上,您只需执行完全相同的操作来计算并检查哈希是否匹配:
String email = httpRequest.getParameter("email");
String receivedHash = httpRequest.getParameter("hash");
if (hash(email).equals(receivedHash)) {
//the user didn't do anything funny, mark email as valid
}
或者,进一步采用此想法但具有更高的安全性,您可以生成类似 JWT 的内容,其中包含电子邮件并已正确加密。