1

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

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

要生成密钥,我使用encryptionType = "AES"and执行以下操作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");
}
4

3 回答 3

0

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

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

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

于 2009-06-17T22:22:16.353 回答
0

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

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

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

于 2009-06-17T22:33:24.443 回答
-1

您可以从这个25 个最危险的软件错误列表开始,它专门指安全错误。

于 2009-06-17T22:24:46.690 回答