使用DPAPI保护加密密钥:明显的漏洞?

时间:2010-03-05 14:26:40

标签: .net security encryption dpapi

我有一个基于Windows.Forms的.NET桌面应用程序,它将特权信息存储在磁盘上的文件中(不使用.NET配置文件),使用MS的CryptoAPI使用对称加密算法(如TripleDES)进行加密。此文件必须通过多个程序运行/机器电源循环读取/写入,即每次使用相同的Key / IV。这里显而易见的问题是如何保护密钥(以及可能的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保护密钥的重点?你会怎么做?
  • 我应该只使用DPAPI来加密我的文件吗?因此,不需要Key / IV存储。
  • 我注意到非对称加密存在CspParameters。这本质上是比对称更好的选择吗? (在我的场景中,不是对称的,不是不对称的),

谢谢!

2 个答案:

答案 0 :(得分:3)

如果攻击者能够设置断点,那么你已经输了。
攻击者可以在解密数据并读取明文后简单地设置一个断点。

你害怕什么样的攻击者?

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

答案 1 :(得分:2)

DPAPI的目标是保护持久数据免遭窥探和篡改,它无法保护应用程序内存中的秘密数据。