我应该用JCA和AES注意哪些安全地雷?

时间:2009-06-17 22:06:05

标签: java encryption aes

我正在使用带有AES的Java Cryptography API加密短文本字符串,以便用户识别cookie。

我的理解是,与密钥的大小相比,当使用少量文本时,某些加密算法是不安全的。我需要知道什么才能确保我不会让数据不安全?我是否需要确保要加密的字符串比密钥长?还有其他地雷吗?

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

3 个答案:

答案 0 :(得分:0)

您需要熟悉设计安全系统的原则,这不仅仅是选择特定的加密算法。

原则上,AES旨在以最小的大小(16字节)安全加密数据包。但是你需要注意它在整体安全方案中的用法。注意您的整体协议设计。

例如我以前听过一些在线游戏(找不到引用抱歉),它加密了所有数据。问题是,它没有包括任何“种子”。因此,特别是做某事的命令,例如给予玩家额外的生命,每次都是相同的(加密)字节序列。因此,播放器可以复制该数据包,并将其重新发送到服务器多次,而无需知道数据包中包含的未加密数据。

答案 1 :(得分:0)

虽然短消息需要填充,但问题并未说明要使用的填充。填充的选择可能会影响某些密码的安全性。

此外,问题中未指定密码模式。简而言之,随机“消息”,例如随机选择的用户标识符,ECB模式是安全的,并且具有密码不需要初始化向量的优点。但是,对于大于16字节的消息,使用ECB模式可以显示明文中的模式,并且易受重放攻击。

使用其他模式(CBC是常见的)将需要为每条消息使用不同的初始化向量。显然,解密将需要IV,这通常会导致它与密文一起传递。

答案 2 :(得分:-1)

您可以从Top 25 Most Dangerous Software Errors的此列表开始,该列表专门针对安全错误。