0

我正在尝试设置一个cookie,以便用户可以自动登录。

我不想在验证 cookie 时向数据库查询会话字符串(基本上,每当调用我的大多数 API 时我都需要这样做,我想让它更快)

我找到的解决方案是在cookie中设置一个哈希,并在验证时尝试解密它,如果解密成功则登录用户。

我想知道我应该使用什么散列方法?我是否只是在我的程序中使用常量盐并使用该盐对用户名进行散列,将散列后的用户名和原始用户名存储在 cookie 中,并尝试在身份验证时将用户名与解密的散列匹配?

由于我不熟悉散列函数,任何人都可以提供一些关于我应该如何在 Java 中执行的建议吗?

4

3 回答 3

1

我建议您使用为每个会话生成的唯一令牌密钥。例如,如果客户端曾经从计算机登录,则此令牌将一直有效,直到密码更改为止。使 cookie 过期并不完全安全……

您还可以使用会话变量进行简单的身份验证。一旦你为一个用户设置了一个会话变量,每次这个用户发送一个带有这个会话 id 的请求;您的会话变量将仅针对此会话 ID 到达。大多数平台也可以使用 DB 为您存储这些变量。

于 2013-03-05T08:56:02.317 回答
0

两种方法:

1)创建自己的身份验证框架。在这种情况下,我建议在 cookie 中放入用户名的加密值(我强烈不建议使用散列;也请不要放入用户密码值)。对于加密,请使用 AES-256 加密和 BouncyCastle:256 位 AES/CBC/PKCS5Padding 和 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

最好的祝福,

迈克尔

于 2013-03-05T09:25:23.563 回答
0

我不是来自 Java 背景,但你的哈希键不应该被暴露。

例如:-在您的情况下,用户名是关键,知道您正在使用什么机制的开发人员之一可以将其分解,因为名称是非常常见且众所周知的。

不知道最好的方法是什么,但我使用了在 UI 中不可见的 UserID(GUID)。

于 2013-03-05T10:00:18.050 回答