如何使用JCA / JCE和HSM导出密钥

时间:2014-10-09 15:20:53

标签: java jce hsm

我在HSM中有一个主密钥,我想用一个给定的多样化程序来推导它。 我对JCA / JCE很陌生,而且KeyGenerator,SecretKeyFactory有点丢失......特别是因为所有参数都是字符串。 我想使用AES或HmacSha1。 我似乎需要使用SecretKeyFactory,并提供KeySpecs。但是哪种KeySpecs?

(我看过关于该主题的帖子,但我似乎并未使用HSM。)

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用以下方式派生密钥:

要使用来自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包装器(例如来自SafeNet的jcprov)或其他API,以便您可以更明确地了解其会话管理并提高资源使用效率。