2013-03-05 44 views
0

我想设定一个cookie,使用户可以自动登录。散列用户密码中的Cookie

我不想验证cookie时查询数据库会话字符串(基本上我需要做的,每当我的大部分的API调用,我想使它更快)

我找到了解决办法是设置一个哈希在cookie中,并尝试进行身份验证时对其进行解密,如果解密成功,则在登录用户。

我想知道我应该使用什么散列方法?我只是在我的程序中使用一个常数盐,并将该用户名与该盐一起散列,将哈希用户名和原始用户名存储在cookie中,并尝试在验证后将用户名与解密哈希匹配?

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

回答

1

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

您还可以使用会话变量进行简单身份验证。一旦为用户设置了会话变量,每当此用户使用此会话标识发送请求时,您的会话变量将仅用于此会话ID。大多数平台还可以使用DB为你存储这些变量。

+0

yes ..使用会话变量很简单..问题是我不想查询数据库进行身份验证 – 2013-03-05 15:59:00

+0

为什么你不想查询数据库?是否有为每个请求查询数据库的开销或者您不想使用数据库?如果您未配置会话管理器以使用数据库,则会话变量默认存储在服务器端的进程内存中。事实上,你不需要这种情况下的数据库。 – 2013-03-06 12:04:11

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

最好的问候,

迈克尔

+0

感谢,但我不能使用Spring,Hibernate的也不..在首节给出的示例中,我该如何解密,如果是随机生成的盐? – 2013-03-05 16:14:41

+0

嗨!您可以生成每安装一台盐并将其存储在数据库 - 在这种情况下,你将能够使用它的cookie解密。 的产生盐的例子是列在这里: http://stackoverflow.com/questions/2957513/how-to-use-bouncy-castle-lightweight-api-with-aes-and-pbe 你能接受我的回答它是否符合你的要求。 – Michael 2013-03-06 09:24:38

0

我不来从Java背景,但你的哈希键决不应该被暴露的东西。

例如: - 在你的情况下,UserName是关键,并且知道你正在使用的机制的开发人员之一可以将其分解,因为名称是非常常见和已知的。

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

+0

但用户id是有点儿太危险,它可以在URL公开或饼干 – 2013-03-05 16:01:19

+0

任何灵敏的数据不应该以纯文本传递 – 2013-03-07 02:34:18