2017-05-28 191 views
0

我正在嘗試實現AES自定義密碼加密並希望瞭解下面的代碼。AES自定義密碼密鑰

我不太明白爲什麼當我使用假設產生SecretKey爲256位的「PBKDF2WithHmacSHA256」時,爲什麼需要指定密鑰大小256「PBEKeySpec(password,salt,65536,256)」 。

在使用我的密碼+ salt生成密鑰後,爲什麼我需要將它與SecretKeySpec作爲AES算法關聯。

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); 
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256); 
SecretKey tmp = factory.generateSecret(spec); 
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES"); 
+0

要清楚的是:你問的是基於密碼的加密,其中使用密碼來派生密鑰,然後用它來加密一些其他數據而不是密碼本身,對吧? –

+0

@ ArtjomB。是。我正在嘗試實施基於密碼的加密。而我認爲我還有一個問題是加密這個用於加密數據的「密碼」。 – youcanlearnanything

回答

3

爲什麼有必要指定密鑰大小256

PBKDF2是一個靈活的基於口令的密鑰導出功能。它使用一個底層哈希函數和許多迭代。它可以輸出任意大小的你想要的密鑰。即使在生成AES-128密鑰時使用SHA-256也很常見,因爲與其他散列函數(如MD5和SHA-512)(僅在x64上)相比,SHA-256不會被破壞並且速度相對較慢。慢速是PBKDF的重要因素,因爲它在嘗試強制密碼時會直接影響攻擊者。當然,你也有可調整的迭代計數。

此外,PBKDF2可以輸出比底層散列函數輸出大小更多的密鑰材料。例如,通常要求PBKDF2的輸出包含IV。在你的情況下,輸出應該是384位長。

通常,不建議從PBKDF2請求更多的基礎散列函數。如果你想推導IV,你也應該使用use SHA-512。只要鹽是針對每次加密隨機生成的,並與密文一起存儲,這應該足以實現語義安全性。

因此,要回答你的問題,PBKDF2不知道你想如何使用輸出。你對此負責。你必須知道你在做什麼。有一百萬種不同的方法來解決PBKDF對某些東西進行加密的部分。

爲什麼我需要將它與SecretKeySpec作爲AES算法關聯。

如果你想使用Cipher例如加密與AES的東西,你需要在java.security.Key對象,將解析爲AES在運行時通過。該方法使用Key#getAlgorithm()方法。如果在創建SecretKeySpec時未指定"AES",則將獲得InvalidKeyException

+0

你的意思是如果我想要一個用於加密的AES密鑰,我可以考慮KeyGenerator.getInstance(「HmacSHA256」)通過KeyGenerator.getInstance(「AES」)?和kgen.init(128);我可以指出我是否需要128位或256位密鑰。 – youcanlearnanything

+0

HMAC密鑰與PBKDF2的輸出不同。但由於HMAC和AES不需要密鑰具有任何特定的內部結構,因此可以生成HMAC密鑰並將其用作AES密鑰。問題是,你爲什麼要這樣做?這對您的代碼的可讀性和可理解性非常不利。 –