锁定老帖子 主题:邮箱找回密码
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-07
最后修改:2010-04-07
大致思路就是发送邮件→连接邮件里的URL→修改密码 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 是有效的 初步想法这个url有3个参数:用户名,过期时间,数字签名. 数字签名 = MD5(用户名+'$'+过期时间+密钥key) 解析这个url的时候先验证数字签名,在验证过期时间。 这个方法的弊端在于如果谁知道密钥key,就能修改任意用户密码。 为了保证这个密钥key的安全性,密钥key在应用每次启动的时候随机生成。 ,还剩一个问题,就是一个url只能修改一次密码。 这样的话就需要每次修改完这个密码以后,给做一个标记(在内存中保存用户名, 过期时间,数字签名),然后现在每次解析url的时候先验证签名, 然后验证该url是否修改过密码,最后验证过期时间。 内存里的标记在超过过期时间以后是需要清除的。需要做一个定时任务一天清除以下内存里的 过期标记。好象这样就差不多拉。 然后开始开发,开发完以后本机跑的没啥问题。 忽然发现一个问题,生产环境下是多个应用的集群环境,这样的话多个应用随机生成的 密钥key是不一样的。 那这样密钥key的生成后,只有放到数据库比较好拉。 最后的方案: 数字签名 = MD5(用户名+'$'+过期时间+密钥key) 数据库字段(用户名(主键),密钥key,过期时间) url参数(用户名,数字签名) 密钥key的生成:在每一个用户找回密码时候为这个用户生成一个密钥key 然后生成过期时间,生成数字签名,生成url,发送邮件. saveOrUpdate(用户名,密钥key,过期时间) 解析url:首先根据用户名从数据库中查找出密钥key和过期时间,没有则表示该请求 是伪造的或者过期的,然后验证签名,验证过期时间,都验证通过,就可以修改密码, 密码修改完以后,删除数据库中的记录。 还需要加一个定时任务,删除数据库中当前时间大于过期时间的记录。 这样就应该没啥问题拉,欢迎大家拍砖. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-07
我不知道需求是怎样的,但我不太喜欢过期时间这点,万一用户没有及时的打开邮箱收到邮件,在用户体验这块似乎不是很友好。。。。
|
|
返回顶楼 | |
发表时间:2010-04-07
最后修改:2010-04-07
MD5(用户名+密码+salt)就可以了
|
|
返回顶楼 | |
发表时间:2010-04-07
ywlqi 写道 我不知道需求是怎样的,但我不太喜欢过期时间这点,万一用户没有及时的打开邮箱收到邮件,在用户体验这块似乎不是很友好。。。。
关于这个过期时间 可以设置成1天或2天或看需要设置。 如果不设置一个过期时间,那这个链接是能够在很久以后来修改这个密码的,感觉不太安全吧。 |
|
返回顶楼 | |
发表时间:2010-04-07
觉得有个地方可以讨论下:
连续发两次找回密码请求,到底在数据库是生产一条数据还是两条数据? 一条数据貌似比较省事吧. |
|
返回顶楼 | |
发表时间:2010-04-07
JE帐号 写道 觉得有个地方可以讨论下:
连续发两次找回密码请求,到底在数据库是生产一条数据还是两条数据? 一条数据貌似比较省事吧. 恩,这里用的是一条,保存数据库使用saveOrUpdate |
|
返回顶楼 | |
发表时间:2010-04-07
如果用户要找回密码,那他应该会在较短的时间内来完成此事。所以生成一个有时间限制的url保存在cache里来比对比较合适
|
|
返回顶楼 | |
发表时间:2010-04-07
二十一 写道 如果用户要找回密码,那他应该会在较短的时间内来完成此事。所以生成一个有时间限制的url保存在cache里来比对比较合适
前面提到过,我这生产环境是集群环境,使用缓存不行。。。最开始我也是这个思路 |
|
返回顶楼 | |
发表时间:2010-04-07
找回密码,MD5里面的密码哪里来的~?
|
|
返回顶楼 | |
发表时间:2010-04-07
paohui01 写道 二十一 写道 如果用户要找回密码,那他应该会在较短的时间内来完成此事。所以生成一个有时间限制的url保存在cache里来比对比较合适
前面提到过,我这生产环境是集群环境,使用缓存不行。。。最开始我也是这个思路 你的缓存不支持集群吗? |
|
返回顶楼 | |