【问题标题】:Storing verifaction code存储验证码
【发布时间】:2017-09-28 19:16:07
【问题描述】:

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

我遇到了一个问题。当用户注册时,我想发送一个电子邮件验证码。我的问题是关于练习的。

  • 是否可以发送带有验证码的电子邮件,将验证码存入数据库,然后检查验证码是否正确?
  • 还是创建一些静态 bean 来保存代码一段时间然后检查它是否正确更好?

我不确定在后端逻辑方面哪个更好。

感谢所有帮助。

【问题讨论】:

    标签: java spring email-validation


    【解决方案1】:

    将其存储在数据库中是一种非常常见的做法。只需确保不时清理过期的令牌(也许在计时器上,也许在插入新令牌时)。 您还可以将令牌存储在内存缓存中(想到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 的内容,其中包含电子邮件并经过适当加密。

    【讨论】:

      猜你喜欢
      • 2014-10-20
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2022-01-01
      • 2014-02-04
      • 1970-01-01
      相关资源
      最近更新 更多