【发布时间】:2014-10-09 15:20:53
【问题描述】:
我在 HSM 中有一个主密钥,我想用给定的分散器派生它。 我对 JCA/JCE 很陌生,对 KeyGenerator、SecretKeyFactory 有点迷茫……尤其是因为所有参数都是字符串。 我想使用 AES 或 HmacSha1。 看来我需要使用 SecretKeyFactory,并提供 KeySpecs。但是哪种类型的 KeySpecs?
(我看过有关该主题的帖子,但似乎没有使用 HSM。)
谢谢。
【问题讨论】:
我在 HSM 中有一个主密钥,我想用给定的分散器派生它。 我对 JCA/JCE 很陌生,对 KeyGenerator、SecretKeyFactory 有点迷茫……尤其是因为所有参数都是字符串。 我想使用 AES 或 HmacSha1。 看来我需要使用 SecretKeyFactory,并提供 KeySpecs。但是哪种类型的 KeySpecs?
(我看过有关该主题的帖子,但似乎没有使用 HSM。)
谢谢。
【问题讨论】:
您可以使用以下方法派生密钥:
C_Derive
要从 JCA/JCE API 使用 HSM,您需要将相应的提供程序添加到 JCA/JCE API,然后指定 provider 参数以请求该特定提供程序实现。
例如:
int slot = 0;
Provider provider = new au.com.safenet.crypto.provider.SAFENETProvider(slot);
Security.addProvider(provider);
final String PROVIDER = provider.getName(); // "SAFENET", "SAFENET.1", ...
KeyGenerator keyGen = KeyGenerator.getInstance("DESede", PROVIDER);
Key baseKey = keyGen.generateKey();
Cipher desCipher = Cipher.getInstance("DESede/CBC/PKCS5Padding", PROVIDER);
desCipher.init(Cipher.ENCRYPT_MODE, baseKey);
byte[] derived = desCipher.doFinal("diversification data".getBytes());
注意,如果您需要经常进行密钥派生,您可以考虑使用您的提供商的 PCKS#11 包装器用于 Java(例如来自 SafeNet 的 jcprov)或其他 API,以便您可以更明确的会话管理和更有效的资源使用。
【讨论】: