我在 HSM 中有一个主密钥,我想用给定的分散器派生它。我对 JCA/JCE 很陌生,对 KeyGenerator、SecretKeyFactory 有点迷失……尤其是因为所有参数都是字符串。我想使用 AES 或 HmacSha1。看来我需要使用 SecretKeyFactory,并提供 KeySpecs。但是哪种类型的 KeySpecs?
(我看过关于该主题的帖子,但我似乎没有使用 HSM。)
谢谢。
您可以使用以下方法派生密钥:
C_Derive
使用 PKCS11中所述的加密从 PKCS#11 进行模拟, derivedKey() 和 encrypt() 返回 3DES 的不同结果要从 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(例如jcprov
来自 SafeNet)或其他 API,以便您可以更明确地了解其会话管理并更有效地使用资源用法。