Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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 pbkdf2-sha256哈希算法问题_Java - Fatal编程技术网

Java pbkdf2-sha256哈希算法问题

Java pbkdf2-sha256哈希算法问题,java,Java,请帮帮我! 我正在尝试使用pbkdf2-sha256算法对密码进行哈希运算。 Password=“user1”,salt=“IFo7KXYswe7Fiu3BoVNOWg=”,hashIterations=“27500”。 我知道结果。它必须类似于“ZnxO94AYiTK7t+OJ1PxTveQ+G82LFWT6VNSTBHZPEUWZGMPjVkauexGH1IqPzWMX1SRVTUMLN/JcM8GC4g==”。 С通过在线加密机()检查结果-匹配 但是,当我自己加密密码时,我会得到不同的

请帮帮我! 我正在尝试使用pbkdf2-sha256算法对密码进行哈希运算。 Password=“user1”,salt=“IFo7KXYswe7Fiu3BoVNOWg=”,hashIterations=“27500”。 我知道结果。它必须类似于“ZnxO94AYiTK7t+OJ1PxTveQ+G82LFWT6VNSTBHZPEUWZGMPjVkauexGH1IqPzWMX1SRVTUMLN/JcM8GC4g==”。 С通过在线加密机()检查结果-匹配

但是,当我自己加密密码时,我会得到不同的结果。也许问题出在编码上。我哪里出错了?谢谢大家!

我的代码:

import org.apache.commons.codec.binary.Hex;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.spec.KeySpec;
import java.util.Base64;

String PASSWORD = "user1";
String SALT = "IFo7KXYswe7Fiu3BoVNOWg==";
int ITERATION_COUNT = 27500;
int KEY_LENGTH = 256;

KeySpec spec = new PBEKeySpec(
        PASSWORD.toCharArray(),
        SALT.getBytes(),
        ITERATION_COUNT,
        KEY_LENGTH
);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
SecretKey secretKey = factory.generateSecret(spec);
byte[] hash = secretKey.getEncoded();

System.out.println("----hashStr----");
System.out.println(new String(hash, StandardCharsets.UTF_8));
System.out.println("----hashStrBase64----");
System.out.println(Base64.getEncoder().encodeToString(hash));
System.out.println("----hexHashString----");
System.out.println(Hex.encodeHexString(hash));
结果:

----hashStr----
=�I ��'��mh�W0y"��H��a�
�y 
----hashStrBase64----
Pe0BSRYglbEn+/htaPxXMA95IozqSJPisGGwChuheSA=
----hexHashString----
3ded0149162095b127fbf86d68fc57300f79228cea4893e2b061b00a1ba17920

问题是SALT.getBytes()

这将获取salt的原始字节值

但是,salt似乎是用Base64编码的(Base64通常会附加
=
-符号,以便长度匹配,这通常可以用于检测Base64)

从您使用的联机加密程序:

输入Base64空salt将生成一个随机的16位salt值

您可以使用它来解码Base64盐:

KeySpec spec=新的PBEKeySpec(
PASSWORD.toCharArray(),
Base64.getDecoder().decode(SALT),
重复计数,
键长
);

问题是
SALT.getBytes()

这将获取salt的原始字节值

但是,salt似乎是用Base64编码的(Base64通常会附加
=
-符号,以便长度匹配,这通常可以用于检测Base64)

从您使用的联机加密程序:

输入Base64空salt将生成一个随机的16位salt值

您可以使用它来解码Base64盐:

KeySpec spec=新的PBEKeySpec(
PASSWORD.toCharArray(),
Base64.getDecoder().decode(SALT),
重复计数,
键长
);

非常感谢-它起作用了非常感谢-它起作用了