2

基于这个问题,我在处理秘密充气城堡时担心以下问题:

  • 加密(在内存转储或页面缓存的情况下)
  • 钉在记忆中
  • 标记为只读的能力(以防止任何进一步的修改)
  • 通过不允许传入常量字符串来安全构造
  • 优化编译器(参见链接文章re: ZeroMemory 宏中的注释),但它适用于 .NET 和 GIT 构建

问题

  • Bouncy Castle 是否使用 .NET 中所需的结构来使其能够安全构建?(SecureString 或等效的直接操作)
  • SecureString(或等效)的覆盖范围是否在库中需要的地方持续存在
  • Bouncy Castle是否必须以某种方式编译以防止编译器优化生效?
4

1 回答 1

1

无论如何都不是一个明确的答案,但只想指出,一旦攻击者能够不受限制地读取堆,假设您的应用程序在某些时候需要能够以编程方式获得完整的安全性,您实际上无法做任何事情访问秘密数据。您所能做的就是尽最大努力减少可能进行附加的时间跨度,并尽最大努力避免在此期间将其提交到任何永久媒体(例如通过固定内存)。

安全字符串在 C# 中对您没有帮助,因为尽管它以加密方式存储在内存中,但访问它的密钥也存储在内存中,因此只要您有完整的内存转储,攻击者仍然可以访问它。此外,如果在任何时候您需要将数据放入 C# 中的字符串中,您也会遇到麻烦,因为字符串是不可变的并且不能被覆盖。

解决你关于 Bouncy Castle 的具体问题,只看它的界面很可能假设攻击者无法转储运行它的机器的内存,因为你通常将一个字节数组传入和传出,而那些不会是安全的。但至少你可以在完成后覆盖字节数组的内容,以减少明文在内存中可用的时间段,而不是仅仅等待它被其他东西覆盖。

于 2014-12-24T08:07:28.300 回答