问题描述
我已经尝试了2天,以解决一个简单的问题。 我有一个简单的Python脚本来加密密码。我想用Java重新编程。
如果我将最多127个字节作为密码传递,则两个脚本的结果相同。但是,如果输入128,则Java输出不匹配。 Python中的函数需要一个字节数组作为密码,而Java则需要一个char数组。
Python:
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
Java:
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,iter,outputKeyLength);
SecretKey hash = secretKeyFactory.generateSecret(keySpec);
System.out.println("hash = " + byteArrayToHex(hash.getEncoded()));
// Output:
// password = [127]: accfb75d59df0c5680ff6ed355f16449203447c839c84eb747b0857001dec922 **match**
// password = [128]: 021d30f53b77d8b32a05d731f18e34e32385fd495fdc2e95ed73b7ab12b2bda9 **wrong**
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)