PKCS11,对象引脚
我正在为网络应用制作pkcs11模块。它是证书的远程存储,并提供用于签名数据的API。用于签名的API如下所示: 符号(整数证书ID、字符*密码、无效*数据、整数长度) 在pkcs11模块中,整个存储由一个令牌表示。在C_Initialize部分中,我向服务器进行身份验证。我通过另一个API调用找到对象,一切都很好。问题是,当我调用C_SignInit或C_Sign函数时,我不知道如何获取对象的辅助密码。PKCS11,对象引脚,c,pkcs#11,C,Pkcs#11,我正在为网络应用制作pkcs11模块。它是证书的远程存储,并提供用于签名数据的API。用于签名的API如下所示: 符号(整数证书ID、字符*密码、无效*数据、整数长度) 在pkcs11模块中,整个存储由一个令牌表示。在C_Initialize部分中,我向服务器进行身份验证。我通过另一个API调用找到对象,一切都很好。问题是,当我调用C_SignInit或C_Sign函数时,我不知道如何获取对象的辅助密码。 有人能帮我吗?在PKCS#11中,所有对象都受到用户PIN的保护。他们没有自己的别针。因此
有人能帮我吗?在PKCS#11中,所有对象都受到用户PIN的保护。他们没有自己的别针。因此,没有标准的方法为特定对象请求不同的PIN。如果将保护.pfx或.pvk文件中私钥的密码称为“辅助密码”,则是错误的。这些密码用于保护那些文件(.pfx或.pvk)中的私钥,而不是HSM文件中的私钥。HSM中没有其他密码来保护密钥。如果要调用api函数,必须使用用户或管理员PIN登录。作为Eugene Mayevski,PKCS#11中没有“对象PIN”这样的概念 您可以实现以下模式的某些变体,以获得类似的访问控制模型: 注册密钥对:
C_GenerateKeyPair
生成密钥对,并确保私钥作为仅会话对象生成(即使用CKA_令牌==FALSE
)。另一种方法是以某种方式导入密钥对(此处不再讨论)CKA\u令牌==TRUE
和CKA\u派生==TRUE
),例如使用CKM\u AES\u key\u GEN
)CKM_AES_CBC_ENCRYPT_DATA
和“unblocking key”字节作为输入数据,并使用“派生密钥”作为主密钥,派生新的“wrap key”会话专用密钥对象。新密钥应该是仅会话的对象,并且应该只允许密钥包装(即CKA\u-TOKEN==FALSE
和CKA\u-WRAP==TRUE
)CKA\u令牌==FALSE
和CKA\u UNWRAP==TRUE
)- 使用的AES机制只是示例。如果使用
,则必须将使用过的IV与“key blob”一起存储CKM\u AES\u CBC\u ENCRYPT\u数据
- 注意所有对象属性值(即拒绝所有不需要的内容)。如果您的设备支持一些供应商定义的扩展来控制对象的使用,那么一定要使用它们(例如,强制使用允许的包装/展开/派生机制)
- 记住从内存/会话中擦除/删除密码和临时密钥
- 使用特定于供应商的包装机制,因为它们可能提供更好的保护(如果可能)
- 删除会话对象的一种方便方法是关闭会话
- 如果包装机制不提供“key blob”,则可能需要保护其完整性
链接到2.11规范:因此,如果我有n个不同的私钥,我必须生成n个令牌?不,您可以使用不同的名称创建不同的密钥。你可以通过使用对象ID来使用键。你可以通过搜索键的名称来找到键的对象ID。我想你没有理解我的意思。我不想创建密钥,我希望用户给我PIN,我可以从用户那里获得PIN的唯一功能是CřLogin,或者我错了吗?因此,如果我有n个不同的私钥,我必须生成n个令牌?@OndřejPřikryl不,您可以在令牌上有多个密钥,但它们需要通过CřLogin函数传递的同一个PIN进行保护。