加密和解密密码的最佳做法?(C#/.NET)

Eyv*_*ind 21 c# encryption

我需要在(最好是文本)文件中存储和加密密码,以后我需要能够解密.密码用于我使用的其他服务,需要以明文形式(通过SSL)发送.这不是我可以改变的.这方面的最佳做法是什么?如何从恶意用户那里获得一定程度的密码保护?

我的平台是带有C#/ .NET 3.5的WinForms.

谢谢.

Rob*_*ean 13

我假设您要加密密码,因为它将在用户计算机上,他们(可能)能够找到并使用它?如果是这样你基本上搞砸了 - 无论你做什么,因为它在用户域中,他们将能够得到它并找出加密并获得加密密码(记住使用Reflector - 它的克隆 - isn "大多数人无法接触"并解密它们并且拥有它.简而言之,您所做的只是模糊密码,而不是保护密码.

我建议的实际上是将其移出用户控件.例如,建立一个与客户端通信的Web服务,并在请求时安全地返回密码.这也允许您在将来需要时更改密码,并为您提供验证合法用户的方法.


Eny*_*yra 7

为什么需要解密密码?通常存储并比较密码的盐渍哈希.如果您加密/解密密码,则再次将密码作为纯文本,这很危险.如果某些用户具有相同的密码,则应该使用哈希值来避免重复哈希.对于salt,您可以使用用户名.

HashAlgorithm hash = new SHA256Managed();
string password = "12345";
string salt = "UserName";

// compute hash of the password prefixing password with the salt
byte[] plainTextBytes = Encoding.UTF8.GetBytes(salt + password);
byte[] hashBytes = hash.ComputeHash(plainTextBytes);

string hashValue = Convert.ToBase64String(hashBytes);
Run Code Online (Sandbox Code Playgroud)

您可以计算密码的盐渍哈希并将其存储在您的文件中.在身份验证期间,您再次从用户条目计算哈希值,并将此哈希值与存储的密码哈希值进行比较.由于从哈希中获取纯文本应该非常困难(从来不是不可能,总是时间问题),因此密码不会再被视为纯文本.

提示:切勿存储或发送未加密的密码.如果您获得新密码,请尽快加密!


Aus*_*tin 6

System.Security程序集中的System.Security.Cryptography.ProtectedData使用一些Windows API来加密数据,只有它知道的密码.

一个可能的用途就是拥有一个实际需要密码操作的Windows服务.用户与之交互的应用程序通过远程处理或WCF调用服务.只要服务使用DataProtectionScope.CurrentUser和服务用户与登录用户不同,密码应该是非常安全的.

这当然假定用户以无限修改服务或运行程序作为服务用户的有限用户身份运行.


Sam*_*rum 2

因为您使用的是 WinForms 和 .Net,所以您的代码将在 MSIL 中可见 - 即使经过混淆,因此您的解密代码是可见的。

您想向谁隐藏密码?应用程序的用户不应该知道密码吗?

我认为您将需要进行一些用户验证,并且我很想将解密密钥放入单独的数据库中,并提供一些其他机制来获取需要身份验证的密钥。这样你就可以从 winforms 应用程序中获取解密代码。

我还建议运行一个单独的服务来定期更改加密解密密钥并更新数据库中的所有密码。