我正在尝试设置Cookie,以便用户可以自动登录。
我不想在验证cookie时查询数据库的会话字符串(基本上我需要在调用大多数API时这样做,我想让它更快)
我找到的解决方案是在cookie中设置哈希并在验证时尝试解密,如果解密成功则登录用户。
我想知道我应该使用什么样的散列方法?我只是在程序中使用常量salt并使用该盐散列userName,将散列的userName和原始userName存储在cookie中,并尝试在验证时将userName与解密的散列匹配?
由于我不熟悉散列函数,有人可以提供一些关于如何用Java做的建议吗?
答案 0 :(得分:1)
我建议您使用为每个会话生成的唯一令牌密钥。例如,如果客户端从计算机登录后,此标记将一直有效,直到密码更改为止。过期cookie并不完全安全......
您还可以使用会话变量进行简单身份验证。为用户设置会话变量后,每次此用户发送具有此会话ID的请求时;只有这个会话ID才能达到你的会话变量。大多数平台也可以使用DB为您存储这些变量。
答案 1 :(得分:0)
两种方法:
1)创建自己的身份验证框架。在这种情况下,我建议在cookie中加入一个用户名的加密值(我强烈建议不要使用散列;也请不要输入用户密码值)。对于加密,请使用BouncyCastle的AES-256加密: 256bit AES/CBC/PKCS5Padding with Bouncy Castle 如果您的框架成功解密cookie - 用户已通过身份验证。如果您的框架无法解密cookie或用户不存在 - 用户未经过身份验证。
2)请考虑使用Spring Security框架: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html 它是伟大的框架,解决了许多身份验证/授权问题。 您的问题通过“RememberMe”功能解决: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-remember-me
致以最诚挚的问候,
迈克尔
答案 2 :(得分:0)
我不是来自Java背景,但你的哈希键永远不会暴露。
例如: - 在你的情况下,UserName是关键的,其中一个知道你正在使用什么机制的开发人员可以将其分解,因为name是非常常见且已知的。
不知道最好的方法是什么,但我使用了在UI中不可见的UserID(GUID)。