我看到许多通过这种方式生成密钥的示例:

KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(KEY_LEN);
SecretKey secretKey = generator.generateKey();


我怀疑以下内容是否有差异(甚至是概念上的差异):

byte[] material = new byte[KEY_LEN / Byte.SIZE];
SecureRandom.getInstanceStrong().nextBytes(material);
SecretKey secretKey = new SecretKeySpec(material, "AES");


指出这两种方法都是3行,那么选择第一种方法而不是第二种方法是否有实际影响?

谢谢

最佳答案

有许多原因使您想要使用KeyGenerator方法,该方法是专门为此目的而设计的:


可读性:generateKey准确告诉您算法在做什么;
便携性:例如选择其他算法时);
正确性:SecretKeySpec可能无法完全验证密钥;
安全性:您将密钥资料保留在material变量中,可能不需要清除,甚至在不再需要密钥后也可能收集垃圾;
硬件支持:硬件设备通常不支持导入密钥材料;密钥应该在设备本身上生成(使用专门的KeyFactory实现)。


根本没有理由使用第二种方法。如果要使用非常特定的随机数生成器生成密钥,则可以使用one of the specialized init methods,但请注意,这可能与硬件设备不兼容。

09-25 17:24