1

对于你们大多数人来说,这是一个很常见的话题。我正在用 Java 构建一个 webapp,使用 Spring + Spring Security + Hibernate + MySQL + 等...

我正在实施“重置密码”模块。我已经知道流程并拥有所有表格和相应的控制器。我只是想知道,在到处写代码之前,我是否从右脚开始,然后继续改进它。

MySQL表

PASSWORD_CHANGE_REQUESTS ( 
       TOKEN VARCHAR(126) NOT NULL,
       USERNAME VARCHAR(50) NOT NULL,         
       CREATION_TIME DATETIME NOT NULL,        
       PRIMARY KEY(TOKEN)          
) 

我看到一些帖子推荐了 EXPIRE_DATE 字段。是不是真的值得吗?

唯一令牌:

我正在使用 Spring SHA 编码器,其中用户名 + 时间戳作为参数(+ 所需的盐值),它返回字符串,例如:92c303b9740da5959418c32d04b6ec6f4ca61637

这种方法真的会为 URL生成一个唯一的令牌吗?或者有更好的方法吗?

在 Java 中,时间戳是这样生成的:

 Date date = new Date();
 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy h:mm:ss");
 String timestamp = sdf.format(date);
4

2 回答 2

2

我说将字段 EXPIRE_DATE 添加到数据库。1-为方便起见,您可能需要 EXPIRE_DATE 字段,以便在您根据数据库中的值验证和验证令牌时一举执行选择和检查有效性。2-对于数据库清理,您可以通过运行简单的脚本轻松截断过期记录。

您还可以通过检查当前时间来验证令牌在应用程序层中是否过期,但这似乎更麻烦。此外,数据库清理将取决于某些应用程序逻辑或脚本逻辑来确定记录是否已过期并准备好删除。

Spring HSA 编码器应该可以满足您的目的,但是它的用途主要是对密码进行编码,而不是生成唯一的令牌。对于唯一令牌,您可以查看 Java UUID

你可以在这里阅读更多

如何生成随机的字母数字字符串?

HTTP URL 令牌标准

于 2013-01-22T20:00:50.060 回答
1

如果黑客控制了用户的电子邮件并找到其中一个链接,密码更改请求的过期可能会很有用。如果用户不再在您的系统中使用该电子邮件帐户,至少它会保护他们免于在您的系统中重置密码,因为请求可能已经过期。显然,如果他们控制了用于您的系统的电子邮件帐户,则过期不会有多大好处,因为他们可以简单地再次请求重置。无论哪种方式,为用户提供额外的安全性都是一件相对简单的事情。

在生成唯一令牌方面,我认为您的策略非常好。为了使生成冲突令牌变得更加困难,您可以使用类似的东西System.nanoTime()System.currentTimeMillis()获得更精确的时间。您当前的方法意味着如果在同一秒内调用它,您将获得一个非唯一令牌。虽然这可能很少见,但在毫秒或纳秒内更是如此。

于 2013-01-22T19:30:59.793 回答