2009-06-17 28 views
1

我使用AES加密Java加密API來加密用於識別用戶識別Cookie的短文本字符串。JCA和AES應該注意哪些安全性地雷?

我的理解是,與密鑰的大小相比,某些加密算法在使用少量文本時不安全。爲了確保我不會讓我的數據不安全,我需要知道什麼?我需要確保要加密的字符串比密鑰長嗎?還有其他的地雷嗎?

生成密鑰我做與encryptionType = "AES"keySize = 128如下:

public SecretKey createKey() throws NoSuchAlgorithmException { 
    KeyGenerator keyGen = KeyGenerator.getInstance(encryptionType); 
    keyGen.init(keySize); // 192 and 256 bits may not be available 
    return keyGen.generateKey(); 
} 

public String encrypt(Key key, String str) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException { 
    Cipher ecipher = Cipher.getInstance(encryptionType); 
    ecipher.init(Cipher.ENCRYPT_MODE, key); 
    byte[] utf8 = str.getBytes("UTF8"); 
    byte[] enc = ecipher.doFinal(utf8); 
    return new BASE64Encoder().encode(enc); 
} 

public String decrypt(Key key, String str) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException { 
    Cipher dcipher = Cipher.getInstance(encryptionType); 
    dcipher.init(Cipher.DECRYPT_MODE, key); 
    byte[] dec = new BASE64Decoder().decodeBuffer(str); 
    byte[] utf8 = dcipher.doFinal(dec); 
    return new String(utf8, "UTF8"); 
} 
+0

由於缺乏MAC而導致的填充字符是一個常見的嚴重問題。 – CodesInChaos 2014-06-11 10:23:59

+0

您應該明確指定一個模式,而不是隻指定「AES」。 – CodesInChaos 2014-06-11 10:25:16

回答

0

你需要熟悉設計一個安全系統,從而超越挑選特定的加密算法的原理。

原則上AES被設計爲以最小尺寸(16字節)對數據包進行安全加密。但是您需要關注其在整體安全方案中的使用情況。注意你的總體協議設計。

例如我以前聽說過一些在線遊戲(無法找到引用抱歉),它加密了所有的數據。問題是,它沒有包含任何「種子」。因此,特定命令(例如賦予玩家額外生命)的命令每次都是(加密的)字節序列。因此,玩家可以複製該數據包,並多次重新發送到服務器,而無需知道數據包中包含的未加密數據。

0

雖然短消息需要填充,但問題沒有說明要使用的填充。填充的選擇可能會影響某些密碼的安全性。

另外,在問題中沒有指定密碼模式。簡而言之,諸如隨機選擇的用戶標識符的隨機「消息」,ECB模式是安全的,並且具有不需要初始化向量用於密碼的優點。但對於大於16字節的消息,使用ECB模式可以揭示明文中的模式,並且容易受到重播攻擊。

使用其他模式(CBC是常見的)將需要爲每個消息使用不同的初始化向量。顯然,解密將需要IV,並且通常導致它與密文一起傳遞。

相關問題