Я пытаюсь понять, как получается производный ключ с помощью PBKDF2 с SHA256.
Я запуталась, и мне нужен ясный, простой для понимания пример.
Что у меня есть на данный момент:
Я нашел https://en.wikipedia.org/wiki/PBKDF2 с пример, но с SHA1, со следующими значениями:
ПАРОЛЬ plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd UTF8
СОЛЬ A009C1A485912C6AE630D3E744240B04 HEX
Функция хеширования SHA1
Размер ключа 128
Итерации 1000
Я использовал https://gchq.github.io/CyberChef и могу получить результат 17EB4014C8C461C300E9B61518B9A18B, который соответствует производным байтам ключа в примере из Википедии.
Я работал с https://mkyong.com/java/java-aes-encryption-and-decryption/, в котором есть метод getAESKeyFromPassword, который находится здесь:
// Password derived AES 256 bits secret key
public static SecretKey getAESKeyFromPassword(char[] password, byte[] salt)
throws NoSuchAlgorithmException, InvalidKeySpecException {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
// iterationCount = 65536
// keyLength = 256
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey secret = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
return secret;
}
Я хочу провести такое же расследование, как я проделал со страницей Википедии, SHA1 и CyberChef, но используя SHA256 (заменяя значения в коде Java, чтобы они соответствовали соли, паролю, итерациям). , из примера).
Вот где начинается мое замешательство:
Если бы я использовал CyberChef для работы с теми же значениями, что и выше, но заменил бы на SHA256:
ПАРОЛЬ plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd UTF8
СОЛЬ A009C1A485912C6AE630D3E744240B04 HEX
Функция хеширования SHA256
Размер ключа 128
Итерации 1000
Я ожидаю, что производный ключ будет таким же в CyberChef, что и https://mkyong.com/java/java-aes-encryption-and-decryption/.
Это не так.
Я не могу не думать, что в моем понимании есть изъян.
Может ли кто-нибудь предоставить простой (проработанный) пример PBKDF2 с SHA256, чтобы я мог понять, что происходит. Если производный ключ не должен быть таким же (как в примере с SHA1, объясните, почему).
Секретный ключ Java:
SecretKey secret = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
То же, что и производный ключ?
Кажется, не хватает простых для понимания примеров для подражания.
Спасибо
Майлз.
pln...
, соль: _2 _..., дайджест: SHA256, размер ключа: 128 и итераций: 1000 методgetAESKeyFromPassword()
возвращает шестнадцатеричное кодирование28869B5F31AE29236F164C5CB33E2E3B
, что равно CyberChef результат. Возможно, вам стоит опубликовать полныйgetAESKeyFromPassword()
-звонок. - person user 9014097   schedule 10.10.2020