Hmac
HMAC vs PKDBF2 邁向 HKDF 的第一步
我正在實現一個應用程序,該應用程序必須從密碼派生兩個密鑰,一個用於伺服器身份驗證,一個用於加密。我正在使用 Java、JCA 和 Bouncy Castle。
到目前為止,要從我使用 PBKDF2 的密碼生成密鑰,如下所示:
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512", BC); PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, iterations, keyLength); SecretKey passwordKey = secretKeyFactory.generateSecret(keySpec);
但在我發現的 HKDF 的兩個例子中:
- https://github.com/WhisperSystems/libsignal-protocol-java/blob/master/java/src/main/java/org/whispersystems/libsignal/kdf/HKDF.java
- https://www.javatips.net/api/keywhiz-master/hkdf/src/main/java/keywhiz/hkdf/Hkdf.java
它們以 HmacSHA256 開頭,而不是 PBKDF2。這是為什麼?在這種情況下,這兩種算法的優缺點是什麼?
我認為您沒有得到那些“範例”:它們實現了HKDF。HKDF的全稱是HMAC-based Extract-and-Expand Key Derivation Function。他們不使用PBKDF2,因為他們沒有實現特定的案例,他們實現了算法。
所以使用它是非常好的:
master = PBKDF2(SHA-256, iterations, salt, password, 32) authKey = HKDF(SHA-256, master, "authKey", 32) encKey = HKDF(SHA-256, master, "encKey", 32)
這是虛擬碼,其中配置選項(例如散列函式和輸出大小)也出現在參數中。
請注意,雖然 SHA-256 被指定為配置選項,但 PBKDF2 和 HKDF 都將在下面使用 HMAC-SHA-256(但 HMAC 只有一個配置選項:要使用的雜湊函式,所以這是等效的)。