这是Spring Security中的错误。它像这样计算MD5
:
Hex.enpre(digest.digest(data.getBytes()));
使用0参数版本,
getBytes使用默认编码将Unipre字符编码为字节。默认编码有所不同,但显然在您的服务器上,该编码不能包含中文字符。
绝对不应依赖默认编码。它通常不是UTF,因此不能包含所有Unipre字符。另外,由于它不是固定的,因此当您从一台服务器移动到另一台服务器时,它可能会破坏令牌。Spring应该设置一个显式的UTF编码,例如
getBytes("UTF-8")。这不是让我记住的唯一记住属性:
它使用的是MD5,这是一种哈希算法,已经过了很长时间,而且越来越容易受到攻击。它甚至都没有使用HMAC-MD5来缓解这种情况(HMAC正是为此目的而设计的)
所有不受支持的字符都被默默压缩为同一字符,
?
这意味着用户的哈希值你好
将与用户的哈希值相同☃☃
。因此,从理论上讲,可以通过创建另一个用户名中具有不支持字符的用户,然后以其用户名中包含不支持字符的任何受害者用户身份登录(或问号本身!)。 cookie,以在新用户的哈希中包含受害者用户名。(实际上,(a)散列中“密码”字段的存在使事情变得复杂,尽管这也容易受到Unipre字符挤压的影响;(b)幸运的是,cookie本身也使用默认编码被错误地解码,从而防止了首先是将任意Unipre字符放入检查器)。它把字符串扔在一起而没有任何分隔符,所以当组件中有冒号时会发生怪异。您可能真的不能直接对它进行太多攻击,但是它很笨拙,解决它的尝试光荣地失败了。
我不会信任此代码来保护我的Web应用程序。在高调的安全性库中看到这种情况令人失望。



