Java Spring安全身份验证管理漏洞
Spring文档说,记住我是通过在cookie中存储以下信息来实现的- base64(用户名+”:“+expirationTime+”:“+md5Hex(用户名+”:”+ 过期时间+”:“密码+”:“+密钥)) 我有以下困惑: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 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())));
}