簡體   English   中英

使用 JCA 和 AES 我應該注意哪些安全地雷?

[英]What security landmines should I look out for with JCA and AES?

我正在使用 Java 密碼術 API 和 AES 來加密短文本字符串,用於用戶識別 cookies。

據我了解,與密鑰的大小相比,某些加密算法在用於少量文本時並不安全。 為了確保我的數據不會處於不安全狀態,我需要知道什么? 我是否需要確保要加密的字符串比密鑰長? 還有其他地雷嗎?

要生成密鑰,我使用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");
}

您需要熟悉設計安全系統的原則,而不僅僅是選擇特定的加密算法。

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

例如,我過去聽說過一些在線游戲(抱歉找不到參考資料),它加密了所有數據。 問題是,它不包含任何“種子”。 因此,執行特定操作的命令,例如給玩家額外的生命,每次都是相同的(加密)字節序列。 因此玩家可以復制該數據包,並多次將其重新發送到服務器,而無需知道數據包中包含哪些未加密數據。

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

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

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

您可能會從這份25 大最危險的軟件錯誤列表開始,它專門針對安全錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM