PBKDF2WithHmacSHA256 Влияние длины ключа на длину вывода - PullRequest
1 голос
/ 22 октября 2019

Рассмотрим следующий код Java:

KeySpec spec = new PBEKeySpec("pass".toCharArray(), "salt".getBytes(),
    10000, 512);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
System.out.println(f.generateSecret(spec).getEncoded().length);

Этот код выводит "64". Таким образом, 64 байта, в то время как SHA-256 - это 32-байтовый хэш.

Я знаю, что в качестве длины ключа я указал 512 бит (64 байта).
Однако я бы ожидал , чтосгенерированный ключ (PBKDF2) будет хеширован SHA-256, поэтому вывод всегда должен быть 32 байта, независимо от того, какой размер ключа я использую.

Чего мне не хватает (или почемумои ожидания не верны)?

1 Ответ

1 голос
/ 22 октября 2019

Мы можем записать PBKDF как DK = PBKDF2(PRF, Password, Salt, c, dkLen)

  • PRF - псевдослучайная функция с выходной длиной hlen
  • dkLen - желаемая длина в битах производногоключ
  • 'c' - это число итераций

как рассчитывается;

DK = T1 ‖ T2 ‖ ... ‖ T_{dklen/hlen}

где Ti = F(Password, Salt, c, i) и каждая имеет hlen размеры.

F(Password, Salt, c, i) = U1 ⊕ U2 ⊕ ... ⊕ Uc

и

U1 = PRF(Password, Salt + INT_32_BE(i))
U2 = PRF(Password, U1)
...
Uc = PRF(Password, Uc-1)

Значение dklen может быть не более чем в 2 ^ 32 - 1 раз больше выходного значения внутреннего хеш-кода (PRF).

Как видите, с небольшой модификацией соли с 32-битным кодированным значением i PBKDF2 может выводить несколько hlen выходов.

...