Ksh*_*rma 9 java security spring spring-security
Spring文档说,记住我是通过在cookie中存储以下信息来实现的 -
base64(用户名+":"+ expirationTime +":"+ md5Hex(用户名+":"+ expirationTime +":"密码+":"+键))
我有以下混淆 -
为什么使用像MD5这样的不安全散列来消化信息而不是使用SHA-1或SHA-2.对于如此小的信息,这些性能是否会受到重大影响?
为什么要通过网络传输这些信息?为什么不在服务器上维护加密安全随机数和此信息的映射,仅将映射密钥作为cookie返回.AFAIK这是Servlet API使用的方法,被认为更安全.
Ral*_*lph 10
让我们从第二个问题开始,因为它更相关:
第二个问题 "为什么要通过网络传输密码......"答案:
因为你描述的只是 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())));
}
Run Code Online (Sandbox Code Playgroud)
基于简单哈希的令牌使用的MD5哈希不是该方法的漏洞。
使用MD5散列密码很危险,因为给定现有密码的散列值,您可以找到另一个散列为相同值的密码(使用彩虹表)。
但是,在这种情况下,MD5并不用于散列密码,而是用作MAC。如果您确实使用了Rainbow表来查找与该哈希冲突的值,那么您将如何使用该值呢?
对Cookie使用其他哈希函数可能会让您感到更安全,但是在这种情况下,它不再提供任何安全性。
如果需要更高的安全性,则应使用“持久性哈希”令牌方法。简单哈希令牌以明文形式公开用户名,并且容易受到重放攻击。永久令牌避免了这些问题。
无论哪种方式,您都应该通过设置其Secure和Http-only标志来保护您的“记住我” cookie。
| 归档时间: |
|
| 查看次数: |
1150 次 |
| 最近记录: |