Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 存储验证码_Java_Spring_Email Validation - Fatal编程技术网

Java 存储验证码

Java 存储验证码,java,spring,email-validation,Java,Spring,Email Validation,我正在构建一个web应用程序,它在前端运行react,在后端运行Java/Spring。 我使用RESTful API与我的客户机通信(客户机也将与外部API通信) 我面临一个问题。当用户注册时,我想发送一个电子邮件验证码。我的问题是关于实践 是否可以发送带有验证码的电子邮件,将代码存储在数据库中,然后检查代码是否正确 还是最好创建一些静态bean来保存代码一段时间,然后检查它是否正确 我不确定在后端逻辑方面哪个更好 非常感谢您的帮助。将其存储在数据库中是一种非常常见的做法。只需确保每隔一段

我正在构建一个web应用程序,它在前端运行react,在后端运行Java/Spring。 我使用RESTful API与我的客户机通信(客户机也将与外部API通信)

我面临一个问题。当用户注册时,我想发送一个电子邮件验证码。我的问题是关于实践

  • 是否可以发送带有验证码的电子邮件,将代码存储在数据库中,然后检查代码是否正确
  • 还是最好创建一些静态bean来保存代码一段时间,然后检查它是否正确
我不确定在后端逻辑方面哪个更好


非常感谢您的帮助。

将其存储在数据库中是一种非常常见的做法。只需确保每隔一段时间清理一次过期的令牌(可能是在计时器上,也可能是在插入新令牌时)。 您还可以将令牌存储在内存缓存中(
EhCahe
),并相应地设置过期时间,但这样一来,如果应用程序关闭,就会丢失缓存。是的,您可以使缓存持久化,但是为什么不使用DB路由呢

考虑到这一点,不要将令牌存储在任何地方,而是将电子邮件作为URL参数发送链接,并将盐渍哈希作为附加参数发送。单击链接后,您可以检查哈希是否匹配,如果匹配,则电子邮件参数未被修改,因此您可以将其标记为已验证。可能不是五角大楼级别的安全,但可能足以进行电子邮件验证,使一切变得更容易。 在伪代码中:

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的东西,其中包含电子邮件并进行适当加密