Java 对于JCA和AES,我应该注意哪些安全地雷?

Java 对于JCA和AES,我应该注意哪些安全地雷?,java,encryption,aes,Java,Encryption,Aes,我正在使用Java加密API和AES对短文本字符串进行加密,以用于用户识别cookie 据我所知,与密钥大小相比,一些加密算法在使用少量文本时并不安全。我需要知道什么才能确保我的数据不会不安全?我是否需要确保要加密的字符串比密钥长?还有其他地雷吗 要生成密钥,我将使用encryptionType=“AES”和keySize=128执行以下操作: public SecretKey createKey() throws NoSuchAlgorithmException { KeyGenera

我正在使用Java加密API和AES对短文本字符串进行加密,以用于用户识别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");
}

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

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


例如,我以前听说过一些在线游戏(找不到参考资料,抱歉),它对所有数据进行了加密。问题是,它没有包含任何“种子”。因此,执行某些特定操作的命令,例如给玩家额外的生命,每次都是相同的(加密)字节序列。因此,玩家可以复制该数据包,并多次将其重新发送到服务器,而不必知道该数据包中包含哪些未加密的数据。

您可以从以下列表开始,其中特别提到了安全错误。

虽然短消息需要填充,这个问题没有提到要使用的填充物。填充的选择可能会影响某些密码的安全性

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


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

-1:这是一个很好的列表,CWE是一个伟大的项目,但它与这个问题无关,这是关于短明文加密的具体使用。由于缺少MAC而填充预言符是一个常见且严重的问题。您应该明确指定模式,而不仅仅是指定“AES”。