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