我找到了一个有用的AES256实现来解密字符串,所有工作都很好,除了我必须存储初始化矢量(IV)以进行解码。
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
ivBytes = params.getParameterSpec(IvParameterSpec.class).getIV();
所有(安全)替代方法都可能没有CBC,因为有了CBC,我必须存储一个IV(在我的情况下,我必须共享IV,这实际上是不安全的)。 我在这个平台上读到了一篇文章,关于它可以在没有CBC的情况下编码,但由于字典攻击,这不是一个好主意。
那么,是否有任何替代方法可以使用aes256编码字符串(不存储其他数据,如IV或salt数组)?
答案 0 :(得分:2)
IV
背后的想法是为每次加密使用不同的新随机(具有相同的key
)。
这对于确保密码模式(例如 CTR 或 CBC )的安全性非常重要,如果没有IV
,这些密码模式根本不安全。此外,当使用相同的key
加密相同的message
两次时,它将导致两个不同的密文(因为两个IV
是不同的。)
简而言之,您应始终使用IV
。
通常你只是将它们添加到密文中,然后在加密之前将它们提取出来,这样你就不必单独存储它们。