我正在使用带有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");
}
答案 0 :(得分:0)
您需要熟悉设计安全系统的原则,这不仅仅是选择特定的加密算法。
原则上,AES旨在以最小的大小(16字节)安全加密数据包。但是你需要注意它在整体安全方案中的用法。注意您的整体协议设计。
例如我以前听过一些在线游戏(找不到引用抱歉),它加密了所有数据。问题是,它没有包括任何“种子”。因此,特别是做某事的命令,例如给予玩家额外的生命,每次都是相同的(加密)字节序列。因此,播放器可以复制该数据包,并将其重新发送到服务器多次,而无需知道数据包中包含的未加密数据。
答案 1 :(得分:0)
虽然短消息需要填充,但问题并未说明要使用的填充。填充的选择可能会影响某些密码的安全性。
此外,问题中未指定密码模式。简而言之,随机“消息”,例如随机选择的用户标识符,ECB模式是安全的,并且具有密码不需要初始化向量的优点。但是,对于大于16字节的消息,使用ECB模式可以显示明文中的模式,并且易受重放攻击。
使用其他模式(CBC是常见的)将需要为每条消息使用不同的初始化向量。显然,解密将需要IV,这通常会导致它与密文一起传递。
答案 2 :(得分:-1)
您可以从Top 25 Most Dangerous Software Errors的此列表开始,该列表专门针对安全错误。