1

我正在设计一个使用PKCS#11加密API监视硬件安全模块密码操作的第三方实现的C应用程序。明文密码保护

PKCS#11标准规定(除其他之外)对库可能负责的密码对象(密钥,证书等)的基本访问控制。

要访问一个私有对象,我的应用程序打开一个PKCS#11会话(C_OpenSession),然后用登录名和密码(UTF8字符串)调用PKCS#11 C_Login函数。 然后他们都被硬件设备检查。 如果(登录名,密码)对是有效的,会话将更新为“已认证”,并且我的应用程序可以访问私有对象。

注意私有对象由harware设备主持和“访问私有对象”是指“能够在硬件设备中使用它们”(秘密和私钥永不导出我的应用程序的虚拟地址空间,并且每个密码操作都由硬件设备执行)。

因此,密码材料存储似乎被正确解决;然而,我的申请必须提供密码C_Login功能

注意我的应用程序的加密部分不会由用户启动;此处不能使用密码输入或基于智能卡的身份验证/密码解密。 密码混淆(或纯文本存储...)也不是一个选项。

我可能是错的(我希望如此),但我认为没有最终的解决方案,以防止密码泄露(任何调试器捕捉C_Login通话将很容易地从正确的CPU寄存器取回密码 - 或存储器位置它可能指向)。

所以我不是在寻找一种方式来防止这种一种泄漏(当然,如果有人有一个解决这个问题 - 这是一个非常普遍的一个,我认为(防止由CPU引起的泄漏处理敏感数据) - ,我很乐意阅读它!)。

我的目的是提供一个合理的安全水平(即使密码的明文版本将在我的应用程序的地址空间活着,将在移动(或引用)一个CPU寄存器)。

现在,在我的测试环境中,密码是硬编码的(作为提供给C_Login函数的纯文本参数)。 由于具有高效的实时调试预防是一个棘手的问题(我只有一双手,一些咖啡和GNU编译器),我猜«原因»是有关防止:

  1. 密码通过静态分析偷窃,
  2. 从明文存储器复制密码。

因此,我正在考虑使用基于软件的加密在磁盘上存储密码。 我的应用程序可以访问由专用用户帐户拥有的本地加密密钥。 此密钥将用于加密/解密包含密码的文件(使用软件加密API)。

注意关键就在一个密钥存储(Java密钥存储,MSCPI/CNG密钥存储提供程序等)

它并不能防止密码被泄露主办CPU,但至少需要用户通过操作系统的认证。 然后,我的代码的任何(静态)反向工程不会泄漏密码,只有授权用户才能解密它。

当然,这只是关于报告OS用户管理和身份验证能力的问题。 但是我对这件事很无奈,我想不出其他什么。

也许有人对途径的想法,以防止密码泄露(汇编代码静态分析,未授权的访问主机)时,它必须作为明文参数的函数编程方式提供?

回答

0

也许一些whitebox-crypto产品可以安排你的二进制文件,这样PKCS#11设备的PIN码永远不会在内存中的一个位置,因此调试器很容易访问。