C# NET中的加密/解密

C# NET中的加密/解密,c#,.net,encryption,C#,.net,Encryption,我正在寻找一种安全的方法来加密和解密Visual Studio项目中的字符串(在C#中)。我发现有本地DES类,但不够安全。你有什么建议吗 更新: 好吧,那么问题是:加密/解密字符串最安全的方法是什么,而不需要太多麻烦(也就是说,必须安装外部工具等,但是外部库也可以)。以及将秘密“密钥”放在何处(编译代码中的值是否足够安全?) 更新#2 如果我使用类似以下代码的内容将加密字符串保存在配置文件中: using System.Security.Cryptography; using System.S

我正在寻找一种安全的方法来加密和解密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中编写一个应用程序,将它放在机器上,然后执行它来解密加密的字符串。所以,如果我想让它更安全,我必须为每个用户提供不同的配置文件?我理解对了吗

它也有。

尝试使用

这取决于您对“足够安全”的定义。你可以用三重DES。Net也有原生的Rijandel类。它足够安全吗

使用经过良好测试和认可的库也是一个好主意


要回答第二个问题,不,将加密密钥存储在可执行文件中,即使是模糊的,也根本不安全。它会让随意窥探的眼睛保持警惕,但不会让那些花一个小时浏览反编译源代码的人看到

仔细考虑一下将加密密钥存储在哪里——这似乎是您的弱点。是的,这是一个很难解决的问题。存储加密密钥最安全的方法不是要求用户键入密码,或要求外部硬件,如密钥fob

如果您要加密的内容仅在单个机器或单个域用户上读取,请考虑。它将加密密钥从您手中拿出来—它使用用户的Windows凭据作为密钥

我在这里的另一个答案中得到了更多的细节:

关于第二次编辑(DataProtectionScope.LocalMachine是否足够好?);总结得很好:

确定范围 DataProtectionScope.CurrentUser 对数据进行加密,以便只有 当前登录的用户可以解密 信息技术切换到 DataProtectionScope.LocalMachine 允许在服务器上运行任何进程 用于解密数据的当前计算机。 这在服务器中可能很有用 场景,其中不存在不受信任的 登录到计算机,但需要 通用工作站使用 LocalMachine加密几乎是免费的 相当于不使用加密 全部(因为任何登录的人都可以 在数据中)


如果我正确地阅读了您的更新,您基本上希望隐藏一些字符串常量,以防系统管理员在程序集周围窥探

没有办法让时间过长的人最终提取字符串常量成为不可能。但你可以激怒他们,希望他们在揭开你的秘密之前放弃尝试

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


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

作为澄清,Rijandel是AES。@Steven Sudit:否。AES是Rijndael,但Rijndael不是AES。(就操作模式而言,AES是一个子集。)有人真的在AES之外使用Rijndael吗?@dtb:这不是一个修辞性问题。@Steven Sudit:如果你的评论是“作为澄清,AES是Rijndael”,我就不会说什么了。:-)在这一点上,DES没有足够的安全来阻止我的妹妹。dtb说了什么。此外,当您找到DES类时,您没有注意到此处的AES、RSA、Rijndael类?对称加密算法(如DES、TripleDES、AES、Rijndael等)的“安全性”主要取决于破解它们所需的时间。在这方面,AES优于DES。但弱点通常是在其他地方,例如保护对称密钥、选择正确的填充或防止。攻击者倾向于攻击最薄弱的地方,而不是你最关注的地方。@erickson:我的观点是:如果你在解密方法中附带对称密钥,我可以立即“破解”DES和AES。实际上,启动反射器并找到密钥要比解密机密数据花费更多的时间。@dtb-对。但我的观点是,如果你正确地实现了你的协议,但选择了DES,你就完蛋了,而如果你选择AES之类的东西,你就安全了。这是讽刺性的否决票吗?“是的,就像我会傻到使用最好的加密库一样,我会用我自己的加密库”我不同意否决票,但可能是因为人们认为.NET附带的内置加密类就足够了。我认为一个经过良好测试和认可的库是一个先决条件,但不能保证生成的应用程序是安全的。正确使用加密算法确实很难做到正确。@dtb:你没有错。最好避免尝试提出新颖的解决方案。如果可能的话,完全避免使用crpyto原语,并坚持使用更高级别的结构。@Steven Sudit:不幸的是,那些更高级别的结构在.NET框架中是缺乏的,我相信在Bouncy Castle中也是如此。看看所有在数据库中存储盐哈希的可怕的国产解决方案,我明白了。因此,基本上,如果我想在配置文件中存储一个安全字符串,我必须为每个登录的用户创建一个不同的文件,或者使用远程服务的密钥?实际上,第二段是密钥。记住:密码系统的目的是