我想将 iaik.pkcs.pkcs11.objects.GenericSecretKey(AES) 转换为 java.security 密钥。
1 回答
这可能是不可能的,但让我们仍然探索一些可能性。
请注意,是否完全支持这些可能性取决于令牌类型和软件/提供商,但您当然可以尝试。
直接使用引用可能是不可能的,因为您必须能够使用 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
问题中的方法(如果可用)。然而,这回避了这个问题。