使用标准JDK在Java中生成安全的随机AES key 的推荐方法是什么?
在其他帖子中,我发现了这一点,但是使用SecretKeyFactory
可能是一个更好的主意:
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
SecureRandom random = new SecureRandom(); // cryptograph. secure random
keyGen.init(random);
SecretKey secretKey = keyGen.generateKey();
如果答案中包含对为什么这是生成随 secret 钥的一种好方法的解释,那将是很好的。谢谢!
最佳答案
我将使用您建议的代码,但略作简化:
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // for example
SecretKey secretKey = keyGen.generateKey();
让提供者选择计划如何获得随机性-不要定义可能不如提供者已经选择的东西更好的东西。
此代码示例假定(as Maarten points out below)您已经配置了
java.security
文件,以便在列表顶部包含首选提供程序。如果要手动指定提供程序,只需调用KeyGenerator.getInstance("AES", "providerName");
即可。对于真正安全的 key ,您需要使用hardware security module(HSM)来生成和保护 key 。 HSM制造商通常会提供JCE提供程序,该提供程序将使用上面的代码为您完成所有 key 生成。