Spring 安全 RememberMe 令牌 case-sensitive?

Are Spring Security RememberMe tokens case-sensitive?

正在生成我的 Spring Security 4.0.1 RememberMe 令牌 我发现此令牌生成代码在令牌解码时失败:

  MessageDigest md5Digest = MessageDigest.getInstance("MD5");
  String md5String = DatatypeConverter.printHexBinary(md5Digest.digest((emailAddress + ":" + expiryTime + ":" + password + ":" + key).getBytes()));
  String token = emailAddress + ":" + expiryTime + ":" + md5String;
  Encoder encoder = Base64.getEncoder();
  String encodedToken = encoder.encodeToString(token.getBytes());

但是这段代码成功了:

  String md5String = DatatypeConverter.printHexBinary(md5Digest.digest((emailAddress + ":" + expiryTime + ":" + password + ":" + key).getBytes())).toLowerCase();

令牌解码器期望 MD5 字符串为小写,即使生成的 MD5 字符串为大写。

这是最初生成的 md5String(在 toLower() 之前):

testLogin: md5String: E34B931F1F6C02C344AB28A8103F6D23

这是显示小写期望值的错误消息:

Invalid remember-me cookie: Cookie token[2] contained signature 'E34B931F1F6C02C344AB28A8103F6D23' but expected 'e34b931f1f6c02c344ab28a8103f6d23'

(我有一个 extractRememberMeCookie 覆盖从 header 伪造 cookie)

有没有不包含 toLower() hack 的更好方法?

这里的问题是 Hex.encode,它使用了所有小写字符。

https://github.com/spring-projects/spring-security/blob/master/crypto/src/main/java/org/springframework/security/crypto/codec/Hex.java