我在HSM中有一个主密钥,我想用一个给定的多样化程序来推导它。 我对JCA / JCE很陌生,而且KeyGenerator,SecretKeyFactory有点丢失......特别是因为所有参数都是字符串。 我想使用AES或HmacSha1。 我似乎需要使用SecretKeyFactory,并提供KeySpecs。但是哪种KeySpecs?
(我看过关于该主题的帖子,但我似乎并未使用HSM。)
感谢。
答案 0 :(得分:2)
您可以使用以下方式派生密钥:
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包装器(例如来自SafeNet的jcprov
)或其他API,以便您可以更明确地了解其会话管理并提高资源使用效率。