【问题标题】:Aren't private keys vulnerable in memory?私钥在内存中不是易受攻击的吗?
【发布时间】:2011-08-12 22:29:45
【问题描述】:

我试图了解当我使用受密码保护的私钥生成消息摘要时会发生什么。

我读到here 说受密码保护的私钥只是使用基于密码的对称密钥加密的。

输入正确的密码后,如何在不暴露未受保护的私钥的情况下生成摘要?

【问题讨论】:

  • 它暴露在 RAM 中是的。 (除非您使用特殊的加密硬件,例如 TPM)
  • @CodeInChaos:那么加密它的意义何在?在内存中定位它真的比在磁盘上更难吗?
  • 确实,实际的密钥在某些时候必须在内存中的某个地方。最大的问题是它会在那里多久,还有谁有可能获得它。用液氮冷冻计算机可以在相当长的时间内保持内存内容完好无损,而强制交换到磁盘是另一个问题。好的加密程序应该注意尽快覆盖内存内容。
  • @Kerrek,如果您将评论转换为答案,我会将其标记为已接受。

标签: security public-key-encryption


【解决方案1】:

通常是的,一旦解密,密钥将作为明文存储在系统内存中,直到应用程序或操作系统将其地址标记为可重写。使用 PGP Desktop,可以手动清除缓存的私钥,这是我希望提供更多应用程序的好功能。

【讨论】:

    【解决方案2】:

    是的,它暴露在 RAM 中,除非操作系统支持内存分页保护,并且应用程序使用该功能,否则私钥可以“以明文方式”分页到磁盘。开发工具和主动攻击可以在内存中寻找它。

    这是存在专用硬件加密模块的原因之一。它们在其防篡改内存空间中使用私钥执行操作;应用程序永远无法访问私钥本身,它会将加密操作委托给设备。

    【讨论】:

      【解决方案3】:

      在某些时候,您代码中的加密原语需要访问和使用密钥的实际值。根本没有办法解决这个问题。打个简单的比喻,如果你不知道a,你就无法计算a + b

      因此,有关安全软件设计的大问题归结为敏感信息将在不受保护的状态下持续多长时间。任何形式的密码缓存都是你的敌人,但即使密码和解密的密钥都没有被显式缓存,它们在某些时候仍然在内存中。用液氮冷冻计算机可以在相当长的时间内保持内存内容完好无损,而强制交换到磁盘是另一个问题。

      良好的加密程序应注意尽快覆盖内存内容,并尽量减少敏感信息以可读形式保留的时间。这需要仔细分析哪些信息是关键的(例如用户的密码输入),以及特定于平台的内存管理知识(例如,您可以请求不可分页的内存吗?)。

      这完全取决于您的威胁模型 - 您需要防范哪种攻击?如果一个 rootkit 监控你所有的内存,你可能会遇到麻烦,尽管这个 rootkit 可能只是从键盘上读取用户的密码条目。

      这是一个复杂的问题,对安全硬件设计进行了广泛的研究。一般来说,攻击者对您机器的访问权限越多,她就越有可能读取敏感数据。好的设计只能力求最小化攻击面。

      【讨论】:

      • 硬件加密模块很常见。有些很贵(几千美元),有些非常便宜(一美元)。它们保护密钥,使“您的代码”永远无法访问它。
      【解决方案4】:

      在某些时候,密钥必须在内存中可供加密算法使用。

      有一些有趣的攻击试图从记忆中获取有价值的信息。我读到的一篇文章涉及将设备插入 Firewire 控制器并使用直接内存访问来寻找有趣的东西。

      http://www.hermann-uwe.de/blog/physical-memory-attacks-via-firewire-dma-part-1-overview-and-mitigation

      完全有可能拥有必要权限的程序来读取持有密钥的内存位置,或者使用 DMA 的硬件可以从 RAM 中获取私钥。

      【讨论】:

      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2018-01-19
      • 2019-12-16
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多