【问题标题】:I'm confuse about KeyGenerator and encoded key in JCE我对 ICE 中的 KeyGenerator 和编码密钥感到困惑
【发布时间】:2011-06-18 14:12:29
【问题描述】:

现在我正在学习密码学,我对 JCE 很感兴趣,但我对 KeyGenerator 类感到困惑。我知道这个类可以为对称算法生成一个密钥,但我不明白为什么我应该使用这个类?因为我可以使用 SecretKeyFactory 自己创建一个密钥并使用它来初始化密码对象,对吧?

喜欢下面这段代码

// Create Key
DESKeySpec desKeySpec = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

// Create Cipher
Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
desCipher.init(Cipher.ENCRYPT_MODE, secretKey);

然后和这段代码比较

KeyGenerator generator = KeyGenerator.getInstance("AES", "BC");

generator.init(192);

Key encryptionKey = generator.generateKey();

它们之间有什么区别?他们做同样的事情吗?

另外,在什么情况下应该选择使用“getEncoded()”方法??

【问题讨论】:

    标签: java security encryption


    【解决方案1】:

    KeyGenerator 是用于生成密钥的便利类。您可以告诉它您将在 Cipher 中使用什么算法,它可以生成与算法匹配的密钥您无需提供任何内容

    您当然可以手动执行此操作,但正如您在问题中所展示的那样,它需要几个步骤(而且您甚至不包括在 byte[] key 中生成关键数据)。

    【讨论】:

      【解决方案2】:

      在某些 JCE 提供程序中,密钥的处理比字节数组更安全,因为密钥用于加密和解密数据,但它们本身永远不会以明文形式存在于内存中。例如,智能卡和 HSM 支持的提供商就是这样工作的。

      当您创建一个字节数组并从中构造键时,您就是将其显式加载到内存中。当您使用 KeyGenerator 时,密钥可能会在安全存储中创建而不存在于内存中,从而消除了一个攻击向量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-27
        • 1970-01-01
        • 2015-11-29
        • 2012-12-17
        • 2018-11-13
        • 2011-12-06
        • 2015-04-28
        相关资源
        最近更新 更多