2013-01-22 120 views
1

很多人都是一个共同的主题。我正在使用Spring + Spring Security + Hibernate + MySQL +等构建一个Java应用程序的Web应用程序...忘记密码请求(Java)

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

MySQL表

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

我已经看到了一些职位推荐EXPIRE_DATE场。是不是真的值得吗?

唯一令牌:

我使用与用户名+时间戳参数(+所需盐值),它返回字符串诸如弹簧SHA编码器:92c303b9740da5959418c32d04b6ec6f4ca61637

此方法是否真的为网址生成唯一令牌?还是有更好的方法来做到这一点?

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

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

回答

2

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

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

Spring HSA编码器应该为你的目的工作,但是它的用途主要是编码密码而不是生成唯一的标记。对于独特的标记,你可以看看Java的UUID

,你可以在这里阅读更多

How to generate a random alpha-numeric string?

HTTP URL token standard

+0

感谢您的信息。你和Marc只是给了我需要的到期期限确认。顺便说一下,我已经实现了UUID功能。也感谢链接! – CountD

1

密码更改请求期满,可在情况下,用户的电子邮件的黑客获得控制是有用的,并发现其中的链接。如果用户不再使用该电子邮件帐户与您的系统,至少它会防止他们的密码重置在您的系统中,因为请求可能已过期。很明显,如果他们获得了用于系统的电子邮件帐户的控制权,则过期将不会很好,因为他们可以简单地请求重新设置。无论哪种方式,为您的用户提供额外的安全性是一件相对简单的事情。

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

+0

谢谢回答。我已经添加了到期日期列。你是对的,它会增加一点安全性,我不必每次计算它。关于时间戳,当然是毫秒/纳秒......当我开始更快地点击并且令牌没有同时改变时,我意识到了这一点。现在可以了。 – CountD

+0

As @ myqyl4在他的回答中提到,您也可以使用Java UUID。很可能要么为你工作就好。 UUID是生成唯一标识符的一种非常安全的方式,并且在大约2.52亿年的时间里,System.currentTimeMillis()会溢出并破坏唯一的ID生成器。 ;) –

+0

作为另一种安全措施,它可能有助于在使用密码更改请求后删除它们,或者至少将它们标记为已使用。这将增加额外的安全级别。 –