我想執行一個簡單的加密和解密AES,我試圖使用鹽。這些值將被存儲在數據庫中並從那裏檢索。 (我不能使用散列)我暫時使用靜態鍵和靜態鹽。AES Salting迭代,需要多少?
我的問題是我應該做多少次鹽析迭代?我的意思是我必須將值存儲在數據庫中,並且我看到在2次迭代中(128位密鑰,42位鹽),我得到一個由40個字符組成的152個字符的加密字符串。對於4次迭代,其爲40個字符的364個字符,8次迭代的1536個字符,40個字符和16次迭代,爲40個字符的可笑的19968個字符。
那麼我最佳的迭代次數是多少?
public static String AESencrypt(String value) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGORITHM);
c.init(Cipher.ENCRYPT_MODE, key);
String valueToEnc = null;
String eValue = value;
for (int i = 0; i < ITERATIONS; i++) {
valueToEnc = salt + eValue;
byte[] encValue = c.doFinal(valueToEnc.getBytes());
eValue = new BASE64Encoder().encode(encValue);
}
return eValue;
}
public static String AESdecrypt(String value) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGORITHM);
c.init(Cipher.DECRYPT_MODE, key);
String dValue = null;
String valueToDecrypt = value;
for (int i = 0; i < ITERATIONS; i++) {
byte[] decordedValue = new BASE64Decoder().decodeBuffer(valueToDecrypt);
byte[] decValue = c.doFinal(decordedValue);
dValue = new String(decValue).substring(salt.length());
valueToDecrypt = dValue;
}
return dValue;
}
爲什麼不用原始的'byte []'而不是每次迭代轉換爲base64? base64步驟可能是你的大部分痛苦。它應該在循環之外。 – mpontillo 2013-02-20 17:44:47
請注意,除了給定的答案,您也可以使用getBytes()而不指定字符編碼,使用Sun內部類BASE64Encoder,可能使用「AES」,這將導致ECB模式加密,沒有指定IV。我看不到'generateKey()'中的內容,但也許這是最好的。 – 2013-02-20 20:55:52
你爲什麼這樣做?什麼,*完全*你認爲你實現了嗎?請僅以*標準*方式實現*標準*算法,並且不要做任何事情。這是一個災難的祕訣。 – 2013-02-20 23:31:38