繁体   English   中英

Spring安全认证管理漏洞

[英]Spring security authentication management vulnerability

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

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

我有以下混淆 -

  1. 为什么使用像MD5这样的不安全散列来消化信息而不是使用SHA-1或SHA-2。 对于如此小的信息,这些性能是否会受到重大影响?

  2. 为什么要通过网络传输这些信息? 为什么不在服务器上维护加密安全随机数和此信息的映射,仅将映射密钥作为cookie返回。 AFAIK这是Servlet API使用的方法,被认为更安全。

让我们从第二个问题开始,因为它更相关:

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

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

如果向下滚动页面Spring Security Reference:第10章Remember-Me身份验证,您将看到Spring安全性也可以使用不同的记忆方法: 第10.3章持久性令牌方法 这就是你在第二个问题中提出的建议。


第一个问题 :简短回答“这些信息对于这么小的信息是否会对这些信息造成重大影响?” - 不

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

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())));
}

Simple Hash-Based令牌使用的MD5哈希不是该方法的漏洞。

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

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

对cookie使用不同的哈希函数可能会让您感觉更安全,但在这种情况下它不会提供更多安全性。

如果您想要更高的安全性,那么您应该使用持久哈希令牌方法。 Simple Hash Token以明文形式公开用户名,易受重放攻击。 持久令牌可以避免这些问题。

无论哪种方式,您都应该通过设置其Secure和Http-only标志来保护您记住我的cookie。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM