我看到许多通过这种方式生成密钥的示例:
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,但请注意,这可能与硬件设备不兼容。