PKCS11,OBJECT PIN

时间:2016-04-05 11:18:39

标签: c pkcs#11

我正在为网络应用制作pkcs11模块。它是证书的远程存储,它提供用于签名数据的API。用于签名的API如下所示: sign(int CertificateId,char * Password,void * data,int lenght)

在pkcs11模块中,整个存储由一个令牌表示。在C_Initialize部分中,我向服务器进行身份验证。我找到了另一个API调用的对象,一切都很好。问题是,当我调用C_SignInit或C_Sign函数时,我不知道如何为我的对象获取二级密码。 任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

在PKCS#11中,所有对象都受到用户PIN的保护。他们没有自己的个人识别码。因此,没有标准方法可以为特定对象请求不同的PIN。

答案 1 :(得分:1)

PKCS#11的想法是拥有1个密码(PIN)来保护整个令牌。位于同一令牌上的密钥的辅助身份验证已完全不在协议之外。如2.01规范中所述:

  

使用受辅助身份验证保护的私钥使用相同的进程和呼叫序列,因为使用仅受登录PIN保护的私钥。事实上,为Cryptoki 2.01版编写的应用程序将使用二级身份验证而无需修改。

这转化为:"二级身份验证不是我们的问题。这些机制必须在我们协议的范围之外实施。

但是,它们描述了当密钥实际位于同一令牌here

时公开多个PIN的技巧

链接到2.11规范:here

答案 2 :(得分:0)

如果您将密码保护.pfx或.pvk文件中的私钥作为“二级密码”,那么您就错了。这些密码用于保护那些文件(.pfx或.pvk)中的私钥,而不是HSM中的私钥。没有其他密码可以保护HSM中的密钥。如果要呼叫api功能,则必须使用用户或管理员密码登录。

答案 3 :(得分:0)

Eugene Mayevski writes在PKCS#11中没有“对象PIN”这样的概念。

您可以实现以下架构的某种变体来获得类似的访问控制模型:

注册密钥对:

  1. 通过C_GenerateKeyPair生成密钥对,并确保将私钥生成为仅会话对象(即CKA_TOKEN==FALSE)。另一种方法是以某种方式导入密钥对(这里不再讨论)。

  2. 生成一个强密码(或使用用户提供的密码)并通过一些KDF运行它以获得“解锁密钥”。将此“解锁密钥”保留在应用程序内存中。

  3. 生成新的持久对称“派生密钥”,其仅允许密钥导出(即CKA_TOKEN==TRUECKA_DERIVE==TRUE),例如使用密钥导出。 CKM_AES_KEY_GEN

  4. 使用例如导出新的“换行密钥”会话密钥对象。具有“解锁密钥”字节的CKM_AES_CBC_ENCRYPT_DATA作为输入多样化数据并使用“派生密钥”作为主密钥。新密钥应该是仅限会话的对象,并且应该只允许密钥换行(即CKA_TOKEN==FALSECKA_WRAP==TRUE)。

  5. 使用“wrap key”将私钥对象从步骤1中包装到“key blob”中。

  6. 存储“密钥blob”(内部令牌或其外部)。

  7. 删除步骤1中的私钥和“换行密钥”。 Nuke密码和“解锁密钥”。 (即使前面的某些步骤失败,也要执行此步骤)

  8. 如果不知道密码,则无法访问私钥。

  9. 使用密钥对:

    1. 通过相同的KDF运行输入密码以获取“解锁密钥”。

    2. 以与密钥注册期间相同的方式导出“换行密钥”,但这次仅用于解包(即CKA_TOKEN==FALSECKA_UNWRAP==TRUE)。

    3. 将“密钥blob”解包到新的仅限会话的私钥对象中。

    4. 删除“换行密钥”。 Nuke密码和“解锁密钥”。 (即使前面的某些步骤失败,也要执行此步骤)

    5. 随意使用密钥对。

    6. 删除私钥。 (即使前面的某些步骤失败,也要执行此步骤)

    7. 擦拭密钥对:

      1. 删除关联的“派生密钥”和“密钥blob”。
      2. 一些额外的(随机)笔记:

        • 使用的AES机制只是示例。如果使用CKM_AES_CBC_ENCRYPT_DATA,则必须将使用过的IV与“key blob”一起存储。

        • 非常关注所有对象属性值(即拒绝所有不需要的东西)。如果您的设备支持某些供应商定义的扩展来控制对象使用,那么请使用它们(例如,强制允许包装/解包/派生机制)。

        • 请记住从内存/会话中擦除/删除密码和临时密钥。

        • 使用供应商特定的包装机制,因为它们可能提供更好的保护(如果可能)。

        • 删除会话对象的便捷方法是关闭会话。

        • 如果包装机制不提供“密钥blob”,您可能希望保护其完整性。

        祝你好运!

        Desclaimer:我不是加密专家,所以请确认我的想法。