.NET中的加密/解密

时间:2010-09-14 15:54:50

标签: c# .net encryption

我正在寻找一种安全的方法来加密和解密Visual Studio项目中的字符串(在C#中)。我发现有原生的DES类,但它不够安全。你有什么建议吗?

更新: 好吧那么,问题是:加密/解密字符串的最安全的方法是什么,没有太多麻烦(也就是说必须安装外部工具等等。虽然外部库很好)。在哪里放置秘密“密钥”(正在编译代码中的值足够安全?)。

更新#2 如果我使用类似此代码的东西将加密字符串保存在配置文件中:

using System.Security.Cryptography;
using System.Security;
byte[] encrypted = ProtectedData.Protect(StrToByteArray("my secret text"), null, DataProtectionScope.LocalMachine);
byte[] derypted = ProtectedData.Unprotect(encrypted , null, DataProtectionScope.LocalMachine);

这足够安全吗?我想用“LocalMachine”参数而不是“User”参数,有人可以在.net中编写一个应用程序,将它放在机器上并执行它来解密加密的字符串。因此,如果我希望它更安全,我将不得不为每个用户配置不同的配置文件?我理解正确吗?

6 个答案:

答案 0 :(得分:7)

要回答第二个问题,不,将加密密钥存储在可执行文件中,甚至是模糊处理,根本不安全。它会保持随意窥探的眼睛,但不是那些有一个小时专门用于穿过你的反应源的人。

仔细考虑存储加密密钥的位置 - 看起来这将是你的弱点。是的,这是一个难以解决的问题。存储加密密钥的最安全方法不是 - 要求用户键入密码,或者需要外部硬件,如密钥卡。

如果您要加密仅在一台计算机上或由单个域用户读取的内容,请考虑Data Protection API (DPAPI)。它使用加密密钥 - 它使用用户的Windows凭据作为密钥。

我在另一个答案中有更多细节:Persistent storage of encrypted data using .Net

关于你的第二次编辑(是DataProtectionScope.LocalMachine还不错?); this MSDN blog entry总结得很好:

  

设定范围   DataProtectionScope.CurrentUser   加密数据,以便只有   当前登录的用户可以解密   它。切换到   DataProtectionScope.LocalMachine   允许任何进程运行   当前机器解密数据。   这在服务器中很有用   场景,没有不受信任的情况   登录到机器,但对于   通用工作站使用   LocalMachine加密差不多   相当于不使用加密   所有(因为任何登录的人都可以获得   在数据)。

答案 1 :(得分:1)

它还有AES

答案 2 :(得分:1)

如果我正确地阅读了你的更新,你基本上想要隐藏一个系统管理员窥探程序集中的一些字符串常量。

没有办法让那些有太多时间的人最终无法提取你的弦。但你可以惹恼他们,希望他们在揭露你的秘密之前放弃尝试。

实现这一目标的一种方法是混淆工具。这些会尽可能地混淆编译的程序集,这使得在使用Reflector对其进行反编译时更难以遵循程序流程。试试吧。如果你的字符串常量仍然不够隐藏,你可以另外发明自己的方案,使其更难找到。

如果您需要更高的安全性,几乎唯一的选择是不向用户提供代码的相关部分。创建一个包含应用程序秘密部分的Web服务,并使用SSL / TLS保护连接。

答案 3 :(得分:0)

尝试使用AesManaged

答案 4 :(得分:0)

这取决于你对足够安全的定义。您可以使用三重DES。 .Net也有本土Rijandel类。它足够安全吗? http://www.obviex.com/samples/Encryption.aspx

答案 5 :(得分:0)

使用经过良好测试和验收的图书馆也是一个好主意......

http://www.bouncycastle.org/csharp/