我正在尝试使用具有某些属性的SUNpkcs11通过ECDH生成共享机密:
CKA_TOKEN= false
CKA_SENSITIVE=true
CKA_EXTRACTABLE=true"
CKA_ENCRYPT=true"
虽然我的基本密钥的CKA_DERIVE,SENSITIVE等设置为true,但这样做时却出现模板不一致的错误:
Performing ECDH key agreement
java.security.ProviderException: Could not derive key
at sun.security.pkcs11.P11ECDHKeyAgreement.engineGenerateSecret(P11ECDHKeyAgreement.java:144)
at javax.crypto.KeyAgreement.generateSecret(KeyAgreement.java:586)
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_ATTRIBUTE_SENSITIVE
at sun.security.pkcs11.wrapper.PKCS11.C_GetAttributeValue(Native Method)
at sun.security.pkcs11.P11ECDHKeyAgreement.engineGenerateSecret(P11ECDHKeyAgreement.java:139)
虽然ECC密钥是使用HSM预先生成的。
答案 0 :(得分:0)
SunPKCS11 P11ECDHKeyAgreement
类始终希望返回派生共享机密的字节,作为generateSecret()方法的结果。为此,必须将派生的机密标记为不敏感且可提取,否则HSM将拒绝透露原始字节。这就是CKR_ATTRIBUTE_SENSITIVE
错误消息的含义-Java试图访问派生密钥的原始字节,但是将其标记为敏感。
Java KeyAgreement
类确实支持version of generateSecret() that will return a Key
object,但是您必须传递算法字符串"TlsPremasterSecret"
(P11ECDHKeyAgreement类将拒绝任何其他内容)。通常,这将使密钥不再有用,因为当您尝试使用它时,由于算法错误而将其拒绝。 (更不用说此密钥是原始共享密钥,在用作加密密钥之前,应将其真正通过KDF /哈希传递)。
因此,实际上,您唯一的选择是通过在PKCS#11配置文件中添加以下内容,将派生键标记为不敏感且可提取:
attributes(generate,CKO_SECRET_KEY,CKK_GENERIC_SECRET) = {
CKA_SENSITIVE = false
CKA_EXTRACTABLE = true
}