![](/img/trans.png)
[英]What are the security concerns that I need to look out for with Java Persistence API (JPA)
[英]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.