Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring安全身份验证管理漏洞_Java_Spring_Security_Spring Security - Fatal编程技术网

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

Java Spring安全身份验证管理漏洞,java,spring,security,spring-security,Java,Spring,Security,Spring Security,Spring文档说,记住我是通过在cookie中存储以下信息来实现的- base64(用户名+”:“+expirationTime+”:“+md5Hex(用户名+”:”+ 过期时间+”:“密码+”:“+密钥)) 我有以下困惑: 为什么要使用像MD5这样的不安全散列来消化信息,而不是使用SHA-1或SHA-2呢。对于这样一小部分信息来说,这些信息对性能的影响是否重要 为什么要通过网络传输这些信息?为什么不在服务器上维护一个加密安全随机数和此信息的映射,只返回映射密钥作为cookie呢。AFAIK这

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

base64(用户名+”:“+expirationTime+”:“+md5Hex(用户名+”:”+ 过期时间+”:“密码+”:“+密钥))

我有以下困惑:

  • 为什么要使用像MD5这样的不安全散列来消化信息,而不是使用SHA-1或SHA-2呢。对于这样一小部分信息来说,这些信息对性能的影响是否重要

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


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

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

    因为您描述的只是
    简单的基于哈希的令牌方法

    如果向下滚动页面,您将看到spring security还可以使用不同的记住我方法:。这就是你在第二个问题中提出的建议


    第一个问题:简短回答“对于这样一小部分信息,这些信息对性能的影响是否重要?”-否

    因此,如果您想使用
    简单的基于哈希的令牌方法
    并认为MD5是不安全的,那么您可以将
    tokenbasedMemberMeservice
    子类化,并覆盖
    String makeTokenSignature(长令牌过期时间、字符串用户名、字符串密码)
    方法。例如(未经测试)


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

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

    然而,在这种情况下,MD5并没有被用来散列密码,而是被用作一个密码。如果您确实使用彩虹表来查找与该哈希冲突的值,那么您如何确切地使用该值

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

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


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

    覆盖makeTokenSignature()看起来是一个不错的方法,因为我认为SHA-2不会被破坏。我想知道在什么情况下需要使用持久性令牌方法,因为持久性方法更安全。不提供有关密码的信息总是比发送加密密码更好。-但这种讨论往往是理论性的无论如何,我更喜欢持久性令牌方法,因为它支持诸如删除此类令牌之类的附加功能。持久性令牌方法肯定更好,但我不确定在这种情况下使用MD5有什么不安全之处,因为它基本上被用作签名。您需要访问散列密码和复制MD5散列的密钥。@ericacm:我想问题不是复制令牌,问题是有人可以从令牌“重新计算”密码。我不确定这怎么可能。(+1)为了清楚地解释持久散列令牌方法的优点——即使是这样,这也只是评论中的一个问题
    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())));
    }