Java org.apache.commons.codec.digest.Crypt导致无效的盐值异常
下面的代码会随机导致Java org.apache.commons.codec.digest.Crypt导致无效的盐值异常,java,apache-commons,Java,Apache Commons,下面的代码会随机导致java.lang.IllegalArgumentException,但并不总是在一台计算机上,而不是在另一台计算机上用于测试。异常的原因是无效的salt值:$6$+E3Vebci/+lhkquntg==。使用SHA512调用Crypt.Crypt()时($6$)。我可以看到地下室有一个模式来检查有效的盐:“^\\$([56])\$(轮数=(\\d+\\$)?([\\\.\\\\/a-zA-Z0-9]{1,16})。*” JDK是openjdk 15.0.1 2020-10-
java.lang.IllegalArgumentException
,但并不总是在一台计算机上,而不是在另一台计算机上用于测试。异常的原因是无效的salt值:$6$+E3Vebci/+lhkquntg==。使用SHA512调用Crypt.Crypt()时($6$
)。我可以看到地下室有一个模式来检查有效的盐:“^\\$([56])\$(轮数=(\\d+\\$)?([\\\.\\\\/a-zA-Z0-9]{1,16})。*”
JDK是openjdk 15.0.1 2020-10-20,commons编解码器是1.15版
我只是想知道为什么这种情况会随机发生在一台Windows 10计算机上,而不是在另一台(macOS Big Sur on M1)上。然后我是否应该以某种方式创建salt以避免出现这种异常?在互联网上搜索时没有发现任何类似的情况
byte bytes[] = new byte[13];
secureRandom.nextBytes(bytes); // java.security.SecureRandom
String saltBytes = new String(Base64.getEncoder().encode(bytes));
String salt = "$6$" + saltBytes;
String hashedPassword = Crypt.crypt(user.getPassword(), salt);
堆栈跟踪在org.apache.commons.codec.digest.Sha2Crypt.Sha2Crypt
的第181行结束
PC是MateBook D Intel Core i7-855OU,Windows 10 Home v 1909 build 18363.1379 精确的算法取决于salt字符串的格式:
- SHA-512盐起价为6美元,最长可达16个字符。
…
盐串的其余部分从集合[a-zA-Z0-9./]中提取,如果遇到“$”符号,则以最大长度切割。
…
抛出:
IllegalArgumentException-如果盐与允许的模式不匹配
[a-zA-Z0-9./]
中是不允许的,因此当生成的salt
中出现一些无效字符时,您将随机看到错误
解决方案:
好建议。salt“手动”生成的原因不再有效,因此可以使用crypt(字符串键)现在,我没有MAC。有趣的是,MAC不能重现这个问题。你在Mac尝试过多少次了?虽然文档也说:使用THEADRealLoad随机生成了一个盐;对于更安全的盐,考虑使用SoCurrand来生成你自己的盐并调用CRUPT(String,String)。.我有一个服务器在做密码散列,我在一个运行1500个测试用例的客户机上进行测试,我在四个终端上运行了大约十次测试,甚至一次都没有发现问题。不是所有的测试用例都会导致密码散列,但很多都会。Java的
Base64.getUrlEncoder()
使用“url安全”字母表,如果您将其应用于12字节的值(而不是13字节),则每次可以获得16个好字符。也就是说,我同意让库为您执行此操作更容易。