2009-06-17 59 views
1

我使用AES加密Java加密API来加密用于识别用户识别Cookie的短文本字符串。JCA和AES应该注意哪些安全性地雷?

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

生成密钥我做与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

由于缺乏MAC而导致的填充字符是一个常见的严重问题。 – CodesInChaos 2014-06-11 10:23:59

+0

您应该明确指定一个模式,而不是只指定“AES”。 – CodesInChaos 2014-06-11 10:25:16

回答

0

你需要熟悉设计一个安全系统,从而超越挑选特定的加密算法的原理。

原则上AES被设计为以最小尺寸(16字节)对数据包进行安全加密。但是您需要关注其在整体安全方案中的使用情况。注意你的总体协议设计。

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

0

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

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

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

相关问题