【问题标题】:Does Bouncy Castle protect secrets from "leaking" in memory/pagefile, and other avenues of attack?Bouncy Castle 是否可以保护机密免于“泄露”内存/页面文件以及其他攻击途径?
【发布时间】:2014-12-05 17:08:16
【问题描述】:
基于this question,我在处理秘密充气城堡时担心以下问题:
- 加密(在内存转储或页面缓存的情况下)
- 固定在内存中
- 能够标记为只读(以防止任何进一步的修改)
- 安全构造,不允许传入常量字符串
- 优化编译器(参见 note in linked article re: ZeroMemory 宏),但它适用于 .NET 和 GIT 构建
问题
- Bouncy Castle 是否使用 .NET 中所需的构造来确保安全地构建它? (SecureString 或等效的直接操作)
- SecureString(或等效)的覆盖范围是否在库中需要的地方始终存在
- 是否必须以某种方式编译 Bouncy Castle 以防止编译器优化生效?
【问题讨论】:
标签:
c#
clr
bouncycastle
compiler-optimization
securestring
【解决方案1】:
无论如何都不是一个明确的答案,但只是想指出,一旦攻击者能够不受限制地读取堆,假设您的应用程序在某些时候需要,您实际上无法以编程方式获得完整的安全性能够访问秘密数据。您所能做的就是尽最大努力减少可能进行附加的时间跨度,并尽最大努力避免在此期间将其提交到任何永久媒体(例如通过固定内存)。
安全字符串在 C# 中无法帮助您解决此问题,因为尽管它以加密方式存储在内存中,但访问它的密钥也存储在内存中,因此只要您有完整的内存转储,攻击者仍然可以访问它。此外,如果在任何时候您需要将数据放入 C# 中的字符串中,您也会遇到麻烦,因为字符串是不可变的并且不能被覆盖。
解决您关于 Bouncy Castle 的具体问题,仅查看它的界面很可能假设攻击者无法转储运行它的机器的内存,因为您通常将一个字节数组传入和传出,而那些不会是安全的。但至少你可以在完成后覆盖字节数组的内容,以减少明文在内存中可用的时间段,而不是仅仅等待它被其他东西覆盖。