【问题标题】:Hashing User password in Cookie在 Cookie 中散列用户密码
【发布时间】:2013-03-05 08:29:16
【问题描述】:

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

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

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

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

由于我不熟悉散列函数,谁能提供一些关于我应该如何在 Java 中执行的建议?

【问题讨论】:

    标签: authentication hash salt


    【解决方案1】:

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

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

    【讨论】:

    • 是的..使用会话变量很容易..问题是我不想查询数据库进行身份验证
    • 为什么不想查询数据库?是否有为每个请求查询数据库的开销,或者您不想使用数据库?如果您没有将会话管理器配置为使用数据库,则会话变量默认存储在服务器端的进程内存中。实际上,您不需要数据库来处理这种情况。
    【解决方案2】:

    两种方法:

    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

    最好的问候,

    迈克尔

    【讨论】:

    • 谢谢,但我不能使用 Spring,也不能使用 Hibernate.. 对于第 1 节中给出的示例,如果盐是随机生成的,我该如何解密?
    • 嗨!您可以在每次安装时生成盐并将其存储在数据库中 - 在这种情况下,您将能够将其用于 cookie 解密。这里列出了盐生成的示例:stackoverflow.com/questions/2957513/… 如果符合您的要求,您可以接受我的回答。
    【解决方案3】:

    我不是 Java 背景,但你的哈希键不应该暴露在外。

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

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

    【讨论】:

    • 但是userId也有点危险,可以暴露在Url或者cookie中
    • 任何敏感数据都不应以纯文本形式传递
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2013-11-23
    • 2011-01-22
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多