使用标准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 生成。

10-07 16:22