基于 this question,在处理 Bouncy CaSTLe 的 secret 时,我担心以下问题:
- 加密(在内存转储或页面缓存的情况下)
- 固定在内存中
- 能够标记为只读(以防止任何进一步的修改)
- 通过不允许传入常量字符串来安全构造
- 优化编译器(参见 note in linked article 回复:ZeroMemory 宏),但因为它适用于 .NET 和来自 GIT 的构建
问题
- Bouncy CaSTLe 是否使用 .NET 中所需的构造来确保其安全构建? (SecureString 或等效的直接操作)
- SecureString(或等效物)的覆盖范围是否在库中需要的地方持续存在
- Bouncy CaSTLe 是否必须以特定方式编译以防止编译器优化生效?
最佳答案
无论如何都不是一个明确的答案,只是想指出,一旦攻击者能够不受限制地读取堆,那么假设您的应用程序在某个时候需要能够访问 secret 数据。您所能做的就是尽最大努力减少可以附加的时间跨度,并尽量避免在这段时间内将其提交给任何永久媒体(例如通过固定内存)。
安全字符串在 C# 中无法帮助您解决这个问题,因为尽管它以加密方式存储在内存中,但访问它的 key 也存储在内存中,因此只要您有完整的内存转储,攻击者仍然可以访问它。此外,如果在任何时候您需要将数据放入 C# 中的字符串中,您也会遇到麻烦,因为字符串是不可变的并且不能被覆盖。
解决您关于 Bouncy CaSTLe 的具体问题只是查看它的界面很可能假设攻击者无法转储运行它的机器的内存,因为您通常将一个字节数组传入和传出,而那些不会安全。但至少您可以在使用完字节数组后覆盖它的内容,以减少内存中可用明文的时间,而不是仅仅等待它被其他内容覆盖。
关于c# - Bouncy CaSTLe 是否保护内存/页面文件中的 "leaking"和其他攻击途径的 secret ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27321131/