我正在寻找一种安全的方法来加密和解密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中编写一个应用程序,将它放在机器上并执行它来解密加密的字符串。因此,如果我希望它更安全,我将不得不为每个用户配置不同的配置文件?我理解正确吗?
答案 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)
使用经过良好测试和验收的图书馆也是一个好主意......