Java SecretFactory.GenerateCret:将字节[]转换为字符[]
我已经试了两天来解决一个简单的问题。 我有一个加密密码的简单Python脚本。我想用Java重新编程 如果我传递一个最大为127的字节作为密码,那么两个脚本的结果是相同的。但是如果我输入128,则Java中的输出不匹配。 Python中的函数需要一个字节数组作为密码,Java需要一个字符数组 Python:Java SecretFactory.GenerateCret:将字节[]转换为字符[],java,arrays,passwords,sha256,chararray,Java,Arrays,Passwords,Sha256,Chararray,我已经试了两天来解决一个简单的问题。 我有一个加密密码的简单Python脚本。我想用Java重新编程 如果我传递一个最大为127的字节作为密码,那么两个脚本的结果是相同的。但是如果我输入128,则Java中的输出不匹配。 Python中的函数需要一个字节数组作为密码,Java需要一个字符数组 Python: import sys import hashlib import time if __name__ == "__main__": password = byte
import sys
import hashlib
import time
if __name__ == "__main__":
password = bytearray([127])
salt = bytearray([1])
iter = 1;
hash = hashlib.pbkdf2_hmac("sha256", password, salt, iter)
print(f"hash: {hash.hex()}")
# Output:
# password = [127]: accfb75d59df0c5680ff6ed355f16449203447c839c84eb747b0857001dec922
# password = [128]: 4a5fc7df8ca880cd30aeddd03180ba42c86198db706d020e41ecf6472e59e02f
import java.security.spec.KeySpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
public class HelloWorld {
public static String byteArrayToHex(byte[] a) {
StringBuilder sb = new StringBuilder();
for (byte b : a)
sb.append(String.format("%02x", b & 0xff));
return sb.toString();
}
public static void main(String []args) throws Exception{
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
char[] password = new char[]{(char) 127};
byte[] salt = new byte[]{1};
int iter = 1;
int outputKeyLength = 256;
KeySpec keySpec = new PBEKeySpec(password, salt, iter, outputKeyLength);
SecretKey hash = secretKeyFactory.generateSecret(keySpec);
System.out.println("hash = " + byteArrayToHex(hash.getEncoded()));
// Output:
// password = [127]: accfb75d59df0c5680ff6ed355f16449203447c839c84eb747b0857001dec922 **match**
// password = [128]: 021d30f53b77d8b32a05d731f18e34e32385fd495fdc2e95ed73b7ab12b2bda9 **wrong**
}
}
Java:
import sys
import hashlib
import time
if __name__ == "__main__":
password = bytearray([127])
salt = bytearray([1])
iter = 1;
hash = hashlib.pbkdf2_hmac("sha256", password, salt, iter)
print(f"hash: {hash.hex()}")
# Output:
# password = [127]: accfb75d59df0c5680ff6ed355f16449203447c839c84eb747b0857001dec922
# password = [128]: 4a5fc7df8ca880cd30aeddd03180ba42c86198db706d020e41ecf6472e59e02f
import java.security.spec.KeySpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
public class HelloWorld {
public static String byteArrayToHex(byte[] a) {
StringBuilder sb = new StringBuilder();
for (byte b : a)
sb.append(String.format("%02x", b & 0xff));
return sb.toString();
}
public static void main(String []args) throws Exception{
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
char[] password = new char[]{(char) 127};
byte[] salt = new byte[]{1};
int iter = 1;
int outputKeyLength = 256;
KeySpec keySpec = new PBEKeySpec(password, salt, iter, outputKeyLength);
SecretKey hash = secretKeyFactory.generateSecret(keySpec);
System.out.println("hash = " + byteArrayToHex(hash.getEncoded()));
// Output:
// password = [127]: accfb75d59df0c5680ff6ed355f16449203447c839c84eb747b0857001dec922 **match**
// password = [128]: 021d30f53b77d8b32a05d731f18e34e32385fd495fdc2e95ed73b7ab12b2bda9 **wrong**
}
}