【问题标题】:How to keep private keys in secured memory如何将私钥保存在安全内存中
【发布时间】:2011-09-10 13:00:05
【问题描述】:

我有一个私钥,我使用用户的密码解密,但我需要经常使用这个私钥,我不想将它解密在内存中。

我想到的一个方案是用一个随机生成的一次性密码对私钥进行加密,每次使用都要更换密码,但一次性密码仍然保存在内存中。

我想到的另一个选择是使用 OpenSSL 内存 BIO。据我了解,它可以保护其中的数据(我不知道它是如何做到的,但这是我听说的)。

你觉得哪个更好?有没有更好的选择? 谢谢! :-)

附言 我正在使用本机 C++ 和 OpenSSL。

【问题讨论】:

  • 除非您拥有专用的安全硬件,否则无法以某种方式将密钥保存在内存中。您肯定会想要研究各种安全内存 API,这些 API 可以让您访问不可分页的内存并保证覆盖。为密钥添加另一层加密是可能的,但它本身很容易受到攻击……这实际上取决于您的威胁模型。
  • 为什么需要多次输入密码?是要重新认证吗?真的需要认证吗?
  • @Kerrek:你知道 OpenSSL 的 BIO 是不是这样安全的内存 API 吗?
  • @Preet:我需要使用该私钥实时解密数据,所以我需要将私钥保存在内存中。
  • 您想抵抗哪些可能的攻击?

标签: c++ security cryptography openssl


【解决方案1】:

根据定义,您正在寻找Security though obscurity 的方法。在这种情况下,用户对设备的控制权比您多。秘密必须在某些时候以纯文本形式存在,攻击者(用户)可以附加调试器并查看此值。这个问题永远不会有解决方案,它不是可以确保安全的东西。

【讨论】:

  • 感谢您的回答。我没有通过默默无闻来寻找一些安全性,但我无法得到更好的东西,所以这就是我在这里问的原因:-)。您的回答加深了我的悲哀怀疑,即没有任何软件可以解决这个问题...感谢您的回答!
【解决方案2】:

您可能过度设计了应用程序的安全部分。事实上,您的应用程序可以在任何时间点从内存中换出,这意味着可以在您甚至能够从内存中删除未加密版本之前将密钥写入磁盘。

正如有人建议的那样,您通常有一些其他具有记忆功能的设备来存储您使用的密钥。由于它是一个外部设备并且没有映射到进程内存中,因此交换或转储不会获得密钥。有便宜和昂贵的变体。我探索过使用的一个是 nCipher HSM(硬件安全模块),它执行所有板载操作。您的密钥已在 HSM 的内存中解锁,但所有加密操作都发生在设备上。他们甚至可以让您将编译后的代码放入 HSM 以在安全的环境中运行。然而,这些都相当昂贵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2015-03-17
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多