Как получить ключ с помощью JCA/JCE и с помощью HSM
У меня есть главный ключ в HSM, и я хочу получить его с заданным диверсификатором. Я новичок в JCA/JCE, и немного потерян с KeyGenerator, SecretKeyFactory, ... тем более, что все параметры являются строками. Я хочу использовать AES или HmacSha1. Кажется, мне нужно использовать SecretKeyFactory и предоставить KeySpecs. Но какой тип KeySpecs?
(Я видел пост на эту тему, но мне кажется, что HSM не использовался.)
Благодарю.
1 ответ
Вы можете получить ключ, используя:
- деривация на основе пароля (PKCS#5), как описано в разделе "Получение секрета из мастер-ключа с использованием JCE/JCA" или
- подражать
C_Derive
из PKCS#11 с использованием шифрования, как описано в PKCS11 DeriveKey() и encrypt(), возвращая различные результаты для 3DES
Чтобы использовать HSM из API-интерфейсов JCA/JCE, необходимо добавить соответствующего поставщика в API-интерфейсы JCA/JCE, а затем указать 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, чтобы вы могли быть более понятными в отношении управления сессиями и более эффективно использовать ресурсы.