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
objects
是 list
类型并且 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% 确保它会按预期工作...
祝你项目顺利!
我观察到 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
objects
是 list
类型并且 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% 确保它会按预期工作...
祝你项目顺利!