[英]Generating random IV for AES in Java
我正在为Android中的PBE实现和AES加密引擎,我发现了两种方法来实现IV的创建,我想知道哪个更好,更安全,以获得IvParameterSpec
:
方法#1:
SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
方法#2:
AlgorithmParameters params = cipher.getParameters();
byte[] iv2 = params.getParameterSpec(IvParameterSpec.class).getIV();
ivParams = new IvParameterSpec(iv2);
我使用方法#1 ,因为Java API为Cipher.init()
API指定了以下内容, Cipher.init()
采用加密/解密模式和密钥:
如果此密码实例需要指定密钥无法提供的任何算法参数或随机值,则应使用此密码的基础实现生成所需参数( 使用其提供程序 或 随机值 )。
(强调我的)。
因此,当选择方法2时, 不清楚不同提供商将做什么。 看看Android源代码,似乎至少有些版本(包括版本21?) 不会创建随机IV - 随机IV创建似乎被注释掉了。
方法1也更透明,在我看来 - 眼睛更容易。
请注意,通常最好使用new SecureRandom()
并让系统确定哪个RNG最佳。 "SHA1PRNG"
定义不明确,可能因实现而异,并且已知具有实现弱点, 尤其是在Android上。
所以最终结果应该是这样的:
SecureRandom randomSecureRandom = new SecureRandom();
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
请注意,GCM模式最适合使用12字节IV而不是16字节IV - AES的块大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.