我正在设计一个C应用程序,使用PKCS#11加密API的第三方实现来监视硬件安全模块的加密操作 .
PKCS#11标准指定(除其他事项外)库可能负责的加密对象的基本访问控制(密钥,证书等) .
要访问私有对象,我的应用程序打开PKCS#11会话( C_OpenSession ),然后使用登录名和密码(UTF8字符串)调用PKCS#11 C_Login 函数 . 然后由硬件设备检查它们 . 如果(登录,密码)对是有效的,则会话更新为“已验证的”,并且我的应用程序可以访问私有对象 .
Note :私有对象由harware设备托管,"accessing the private objects"表示"being able to use them within the hardware device"(密钥和私钥永远不会在我的应用程序的虚拟地址空间中导出,并且每个加密操作都由硬件设备执行) .
因此,加密材料存储似乎得到了妥善解决;但是,我的申请必须 provide the password to the C_Login function .
Note :我的应用程序的加密部分不会由用户启动;这里不能使用键盘输入的密码或基于智能卡的认证/密码解密 . 密码混淆(或明文存储...)也不是一种选择 .
我可能是错的(我希望如此)但我认为没有 ultimate 解决方案来防止密码泄漏(任何调试者捕获 C_Login 调用都会轻易地从正确的CPU寄存器中检索密码 - 或者它可能指向的内存位置) .
所以我不是在寻找防止这种泄漏的方法(当然,如果有人能解决这个问题 - 我认为这是一个非常普遍的问题(防止CPU处理敏感数据引起的泄漏) - ,I很乐意阅读它!) .
我的目