Это, вероятно, невозможно, но давайте рассмотрим некоторые возможности, тем не менее.
Обратите внимание, что это зависит от типа токена и программного обеспечения / провайдера, если эти возможности поддерживаются вообще, но вы можете попробовать.
Прямое использование ссылки, вероятно, невозможно, так как вы должны быть в состоянии использовать операции HSM. Таким образом, даже если вы можете встроить ключ в объект SecretKey
, вы все равно не сможете его использовать. Вам понадобится специальный API для провайдера, чтобы осуществить это. Эй, может быть, оно существует.
Объекты PKCS # 11, включая ключи, обычно хранятся в HSM или другом токене безопасности. Секретные ключи обычно не могут быть легко извлечены.
Вы также можете иногда извлекать ключи, устанавливая атрибут CKA_EXTRACTABLE
в true (и CKA_SENSITIVE
в false во время генерации. Это, конечно, также негативно повлияет на безопасность ключа. Если вы можете получить это сработает (в зависимости от реализации токена PKCS # 11), тогда вы сможете скопировать значение ключа в память.
Вы также можете обернуть ключ с помощью известного вам ключа обертки, и HSM извлекает ключи таким образом.
Должно быть просто вызвать конструктор SecretKeySpec
со значением, как только вы сможете его получить, чтобы преобразовать его в SecretKey
.
Как правило, проще генерировать ключи локально (используя генератор случайных чисел токена HSM, где это требуется и доступно). Затем вы можете импортировать их и установить CKA_SENSITIVE
на true
впоследствии. Конечно, CKA_ALWAYS_SENSITIVE
останется установленным на false
(и CKA_NEVER_EXTRACTABLE
останется установленным на true
), если вы сделаете это.
Безусловно, самый простой и безопасный способ сделать это - сгенерировать ключ, используя предоставленный провайдером KeyGenerator
, исключая метод GenericSecretKey
в вопросе, где он доступен. Тем не менее, это побочный вопрос.