.net - 使用 DPAPI : Obvious hole? 保护加密 key

标签 .net security encryption dpapi

我有一个基于 Windows.Forms 的 .NET 桌面应用程序,它将特权信息存储在磁盘上的文件中(不使用 .NET 配置文件),使用对称加密算法(例如使用 MS 的 CryptoAPI 的 TripleDES)进行加密。该文件必须在多个程序运行/机器电源循环中读取/写入,也就是每次都使用相同的 key /IV。这里明显的问题是如何保护 key (可能还有 IV),这里的几个问题只是简单地说“使用 DPAPI”并给出一个往返加密/解密的简单示例。

我已经知道如何使用 DPAPI,但使用它来保护要馈送到另一个加密方案的 key /IV 似乎存在一个明显的问题。考虑以下代码:

TripleDESCryptoServiceProvider^ cryptoprov = gcnew TripleDESCryptoServiceProvider;
cryptoprov->Key = ProtectedData::Unprotect(encryptedKey, salt, DataProtectionScope::CurrentUser);
cryptoprov->IV  = ProtectedData::Unprotect(encryptedIV,  salt, DataProtectionScope::CurrentUser);

由于您必须分配一个 SymmetricAlgorithm 派生类的 Key 和 IV,攻击者不能在这一点上设置一个断点,并轻松找出 Key/IV 是什么吗?

我的问题如下:
  • 我是否错过了使用 DPAPI 保护 key 的要点?你会怎么做?
  • 我应该只使用 DPAPI 来加密我的文件吗?因此,不需要 key /IV 存储。
  • 我注意到存在用于非对称加密的 CspParameters。这本质上是比对称更好的选择吗? (在我的场景中,完全不对称与不对称)

  • 谢谢!

    最佳答案

    如果攻击者能够设置断点,你就已经输了。
    攻击者只需在数据解密后设置断点,读取明文即可。

    你害怕什么样的攻击者?

    如果你愿意,你可以写if (Debugger.IsAttached) Environment.FailFast() ,但攻击者可以使用 Reflexil 删除检查。

    关于.net - 使用 DPAPI : Obvious hole? 保护加密 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2387353/

    相关文章:

    c# - System.Collections.Generic.List 中的某项在什么情况下不会被删除成功?

    c# - 如何将 unicode 实体转换为 unicode 文本 c#

    .net - 我什么时候需要 .NET 中的 SecureString?

    jsp - 如何让我的 jsp Web 应用程序从安全 (HTTPS) 协议(protocol)切换到非安全 (HTTP) 协议(protocol)?

    android - 如何让 Eclipse 识别 Android 项目中的加密算法

    java - 如何检查字符串是否加密?

    c# - 如何将一个巨大的文件拆分成单词?

    c# - ConfigurationPropertyCollection 是否需要是静态的?

    ruby-on-rails - 使用 constantize 在 ruby​​ 中远程执行代码

    c# - 在写入/读取 c# mongodb 时加密/解密属性