2 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
這里的密碼是一個(gè)(任意)字節(jié)序列,通常與 UTF8 不兼容,因此在 UTF8 解碼過(guò)程中數(shù)據(jù)會(huì)被損壞。一個(gè)可能的解決方案是替換PBEKeySpec
為 BouncyCastle 的PKCS5S2ParametersGenerator
,它期望密碼為字節(jié)數(shù)組(在 中init
):
import java.nio.charset.StandardCharsets;
import org.bouncycastle.crypto.PBEParametersGenerator;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator;
import org.bouncycastle.crypto.params.KeyParameter;
...
byte[] salt = "salt".getBytes(StandardCharsets.UTF_8);
int iterations = 512;
byte[] PASSWORD = new byte[] { (byte)255, (byte)250, (byte)170, (byte)187, (byte)188, (byte)204, (byte)221, (byte)221, (byte)255, (byte)170, (byte)170, (byte)170, (byte)170, (byte)170, (byte)170, (byte)187 };
PBEParametersGenerator generator = new PKCS5S2ParametersGenerator(new SHA256Digest());
generator.init(PASSWORD, salt, iterations);
byte[] keyBytes = ((KeyParameter)generator.generateDerivedParameters(256)).getKey();?
// with bytesToHex from https://stackoverflow.com/a/9855338
System.out.println(bytesToHex(keyBytes).toLowerCase());? // d8aa4772e9648572611fe6dca7f653353de934cdb3b29fab94eb13ba2b198b9f
現(xiàn)在的結(jié)果與 Python 代碼的結(jié)果匹配:
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
salt = b'salt'
iterations = 512
PASSWORD = bytes((255, 250, 170, 187, 188, 204, 221, 221, 255, 170, 170, 170, 170, 170, 170, 187))
key = PBKDF2HMAC(hashes.SHA256(), 32, salt, iterations).derive(PASSWORD)
print(key.hex()) # d8aa4772e9648572611fe6dca7f653353de934cdb3b29fab94eb13ba2b198b9f

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
SHA1
您在 Java 代碼和Python 代碼中使用SHA256
,這就是您得到不同結(jié)果的原因。使用PBKDF2WithHmacSHA256
.
添加回答
舉報(bào)