我有一个基于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是什么吗?
我的问题如下:
谢谢!
答案 0 :(得分:3)
如果攻击者能够设置断点,那么你已经输了。
攻击者可以在解密数据并读取明文后简单地设置一个断点。
你害怕什么样的攻击者?
如果您愿意,可以写if (Debugger.IsAttached) Environment.FailFast()
,但攻击者可以使用Reflexil删除支票。
答案 1 :(得分:2)
DPAPI的目标是保护持久数据免遭窥探和篡改,它无法保护应用程序内存中的秘密数据。