我在 HSM 中有一个主 key ,我想用给定的多样化器派生它。 我对 JCA/JCE 很陌生,对 KeyGenerator、SecretKeyFactory 有点迷茫……尤其是因为所有参数都是字符串。 我想使用 AES 或 HmacSha1。 看来我需要使用 SecretKeyFactory,并提供 KeySpecs。但是哪种类型的 KeySpecs?
(我看过关于该主题的帖子,但我似乎没有使用 HSM。)
谢谢。
最佳答案
您可以使用以下方式导出 key :
- 如 Deriving a secret from a master key using JCE/JCA 中所述的基于密码的派生 (PKCS#5)或
- 使用 PKCS11 deriveKey() and encrypt() returning different results for 3DES 中描述的加密从 PKCS#11 模拟
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());
请注意,如果您需要经常进行 key 派生,您可以考虑使用您的提供商的 PCKS#11 Java 包装器(例如来自 SafeNet 的 jcprov
)或其他API,以便您可以更明确地了解其 session 管理并更有效地使用资源。
关于java - 如何使用 JCA/JCE 和 HSM 派生 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26282162/