首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring安全身份验证管理漏洞

Spring安全身份验证管理漏洞
EN

Stack Overflow用户
提问于 2012-04-20 05:54:36
回答 2查看 1.2K关注 0票数 9

Spring文档说,记住我是通过在cookie中存储以下信息来实现的-

Base64(用户名+ ":“+ expirationTime + ":”+md5Hex(用户名+ ":“+ expirationTime + ":”密码+ ":“+键”))

我有以下困惑-

  1. 为什么使用不安全的散列(如MD5 )来消化信息,而不是使用SHA-1或SHA-2。对于这么小的一小部分信息来说,它们的表现会不会很重要呢?
  2. 为什么要通过网络传输这些信息呢?为什么不在服务器上维护加密安全的随机数映射和此信息,只将映射密钥作为cookie返回。AFAIK --这是Servlet使用的方法,被认为更安全。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-20 06:27:35

让我们从第二个问题开始,因为这是一个更相关的问题:

第二个问题“为什么要通过网络传输密码.”答:

因为你所描述的只有Simple Hash-Based Token Approach

如果您向下滚动页面Spring安全参考:第10章-记住-我的身份验证,您将看到spring安全性也可以使用另一种记住我的方法:第10.3章持久化令牌方法。这就是你在第二个问题中的建议。

第一个问题:简短地回答“这些问题对这么小的信息有影响吗?”-没有。

因此,如果您想使用Simple Hash-Based Token Approach并且觉得MD5是不安全的,那么您可以子类TokenBasedRememberMeService [javadoc]并重写String makeTokenSignature(long tokenExpiryTime, String username, String password)方法。例如(未经测试)

代码语言:javascript
复制
protected String makeTokenSignature(long tokenExpiryTime, String username, String password) {
    String data = username + ":" + tokenExpiryTime + ":" + password + ":" + getKey();
    MessageDigest digest;
    try {
        digest = MessageDigest.getInstance("SHA-256");
    } catch (NoSuchAlgorithmException e) {
        throw new IllegalStateException("No SHA-256 algorithm available!");
    }

    return new String(Hex.encode(digest.digest(data.getBytes())));
}
票数 10
EN

Stack Overflow用户

发布于 2012-04-21 04:20:15

简单基于哈希的令牌使用的MD5哈希不是该方法的漏洞。

使用MD5散列密码是危险的,因为给定现有密码的散列值,您可以找到另一个哈希值为相同值的密码(使用彩虹表)。

但是,在这种情况下,MD5不是用于散列密码,而是用作MAC。如果您确实使用彩虹表来查找与该哈希冲突的值,那么如何使用该值?

对cookie使用不同的散列函数可能会使您感到更安全,但在这种情况下它并没有提供更多的安全性。

如果您想要更多的安全性,那么您应该使用持久哈希令牌方法。简单哈希令牌以明文形式公开用户名,并容易受到重放攻击。持久令牌避免了这些问题。

无论哪种方式,您都应该通过设置其安全和Http-只读标志来保护您的me me cookie。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10240989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档