PKCS11 总是会以相同的顺序找到对象吗?

Will PKCS11 always find objects in the same order?

我观察到 bash 命令和可能是 Python PyKCS11 库中的相应方法似乎总是以相同的顺序查找对象。我的代码依赖于这是真的,但没有在任何地方阅读它,只是观察它。

在终端中:

$ pkcs11-tool --list-objects 
Using slot 0 with a present token (0x0)
Public Key Object; RSA 2048 bits
  label:      bob_key
  ID:         afe438bbe0e0c2784c5385b8fbaa9146c75d704a
  Usage:      encrypt, verify, wrap
Public Key Object; RSA 2048 bits
  label:      alice_key
  ID:         b03a4f6c375e8a8a53bd7a35947511e25cbdc34b
  Usage:      encrypt, verify, wrap

与Python:

objects = session.findObjects([(CKA_CLASS, CKO_PUBLIC_KEY)])
for i, object in enumerate(objects):
    d = object.to_dict()
    print(d['CKA_LABEL'])

输出:

bob_key
alice_key

objectslist 类型并且 objects 中的每个元素都是 <class 'PyKCS11.CK_OBJECT_HANDLE'>

类型

当登录会话 运行 时 session.findObjects([(CKA_CLASS, CKO_PRIVATE_KEY)])总是 是一个列表 具有完全相同的顺序 如上面的表达式?在这种情况下有两个密钥,永远不想看到爱丽丝在鲍勃之前出现。

(本来想写评论的,但是写的有点长。。。)

PKCS#11 不保证 returned 对象句柄的任何特定顺序,因此它取决于特定的实现。

即使您的实现似乎始终给出相同的对象顺序,但也有一些例子表明这可能会意外改变:

  • 密钥续订(密钥不会永远有效,您以后需要生成一些新密钥)

  • 中间件升级(较新的实现可能 return 对象的顺序不同)

  • HSM 固件升级(重大升级可能会改变对象的存储方式和对象枚举顺序)

  • 从备份恢复 HSM(HSM 恢复后对象顺序可以改变)

  • host OS 数据恢复(一些工具在外部文件夹中存储加密的 HSM 对象,对象搜索顺序可能与目录列表顺序相同,可能会在没有警告的情况下更改)

  • HSM 更改(您确定您将在应用程序的整个生命周期内使用同一设备)

一般来说,依赖未定义的行为是一种不好的做法。特别是在安全方面你应该非常小心。

安全起见绝对值得花时间。


我建议对每个必需的对象执行单独的搜索(使用一些强标识符——例如标签)——这样你就可以执行额外的检查(例如强制执行预期的对象类型,确保对象是唯一的等。 ).


一个类似的例子是 Cryptoki 对象句柄的重用。 PKCS#11 声明对象句柄绑定到特定会话(即,如果您在会话 A 中获得对象句柄,则不应在会话 B 中使用它——即使两个会话在同一应用程序中都是 运行)。

有些实现可以跨会话保留同一对象的对象句柄。甚至还有在不同应用程序中保留相同对象句柄的实现(即,如果您在应用程序 A 中获得对象句柄 123,您将在应用程序 B 中为同一对象获得对象句柄 123)。

此行为甚至在相应的开发人员手册中有所描述。但是,如果您询问供应商是否可以依赖它,您会被告知某些设置存在一些特殊情况,您必须执行额外的检查才能 100% 确保它会按预期工作...

祝你项目顺利!