2013-02-20 100 views
0

我想執行一個簡單的加密和解密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; 
    } 
+1

爲什麼不用原始的'byte []'而不是每次迭代轉換爲base64? base64步驟可能是你的大部分痛苦。它應該在循環之外。 – mpontillo 2013-02-20 17:44:47

+0

請注意,除了給定的答案,您也可以使用getBytes()而不指定字符編碼,使用Sun內部類BASE64Encoder,可能使用「AES」,這將導致ECB模式加密,沒有指定IV。我看不到'generateKey()'中的內容,但也許這是最好的。 – 2013-02-20 20:55:52

+0

你爲什麼這樣做?什麼,*完全*你認爲你實現了嗎?請僅以*標準*方式實現*標準*算法,並且不要做任何事情。這是一個災難的祕訣。 – 2013-02-20 23:31:38

回答

5

鹽分用於密碼來派生密鑰。它不用於密文,即使它是基於64編碼。醃製是用來使攻擊者難以使用蠻力或彩虹桌找到密碼。它通常由PBKDF使用,如PBKDF2,bcrypt或scrypt。

就你的情況而言,無論你加密多少;如果攻擊者嘗試密鑰,解密密文並找到base 64,攻擊者就會知道他找到了密鑰,並且可以簡單地再次執行迭代次數。

一般來說,對事物進行多次加密是沒有意義的;分組密碼本身應該包含足夠數量的「回合」。

+0

所以你的意思是我可以放棄base 64 encoding和salting,並且應該只使用AES中的o/p進行存儲? – chettyharish 2013-02-21 14:15:37

+0

您只需要base64將密文存儲爲字符串(字符)。 AES不需要鹽析。也就是說,正如所指出的那樣,您的實現似乎缺少其他必要的功能以被視爲安全。 – 2013-02-21 16:38:29

+0

你能給我一個鏈接,我可以理解這樣的東西嗎? – chettyharish 2013-02-21 17:33:47