Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java org.apache.commons.codec.digest.Crypt导致无效的盐值异常_Java_Apache Commons - Fatal编程技术网

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-如果盐与允许的模式不匹配
由于Base64编码字符串可能包含“=”、“+”,这在regex
[a-zA-Z0-9./]
中是不允许的,因此当生成的
salt
中出现一些无效字符时,您将随机看到错误

解决方案:

  • 只需使用,因为它已经提供了随机盐
  • 或者按照允许的模式生成盐
  • 参考资料:

    好建议。salt“手动”生成的原因不再有效,因此可以使用crypt(字符串键)现在,我没有MAC。有趣的是,MAC不能重现这个问题。你在Mac尝试过多少次了?虽然文档也说:使用THEADRealLoad随机生成了一个盐;对于更安全的盐,考虑使用SoCurrand来生成你自己的盐并调用CRUPT(String,String)。.我有一个服务器在做密码散列,我在一个运行1500个测试用例的客户机上进行测试,我在四个终端上运行了大约十次测试,甚至一次都没有发现问题。不是所有的测试用例都会导致密码散列,但很多都会。Java的
    Base64.getUrlEncoder()
    使用“url安全”字母表,如果您将其应用于12字节的值(而不是13字节),则每次可以获得16个好字符。也就是说,我同意让库为您执行此操作更容易。