如何在C#windows窗体应用程序中轻松加密密码?

时间:2010-06-17 15:29:47

标签: c# .net winforms passwords salt

如何轻松地从Textbox.Text中填写密码?

.NET框架中是否有一些内置的魔法?

5 个答案:

答案 0 :(得分:10)

前一段时间我们讨论过关于密码的最佳实践,你可能会在那里找到一些好主意:

Salting Your Password: Best Practices?

我发现其中一个最简单但仍然相当安全的,就是使用GUID作为你的盐。它是随机的,足够长。如果您包含GUID的字符串格式(“{”和“ - ”字符),则效果最佳,但您不必这样做。

请记住,盐对于每个盐渍物品必须是唯一的,并且为了最安全,您应该使用加密安全随机数生成器。还要记住,您必须将盐与密码一起存储,否则您将无法根据哈希版本检查纯文本版本!如果您愿意,可以将盐保存为未加密的;我通常将它放在与密码相同的表中的字段中。盐的目的不是保持隐藏,而是让彩虹表很难(希望不可能)及时计算。

这是一个可以在C#中使用的快速代码段:

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buffer = new byte[1024];

rng.GetBytes(buffer);
string salt = BitConverter.ToString(buffer);
var saltedPassword = password + salt;

...或

var salt = Guid.NewGuid().ToString();
var saltedPassword = password + salt;

答案 1 :(得分:4)

我想你要求用户名和密码?

在某些系统中,用户名用作盐。 (我认为这样做是可以的。) 否则你需要将盐存储在某处并在散列之前检索它(在随机创建的盐的情况下)或者有一个算法将为同一个用户返回相同的盐(并且仅仅使用平原不是更好的用户名)。

个人使用以下代码:

byte[] GetSaltedPasswordHash(string username, string password)
{
    byte[] pwdBytes = Encoding.UTF8.GetBytes(password);
    // byte[] salt = BitConverter.GetBytes(userId);
    byte[] salt = Encoding.UTF8.GetBytes(username);
    byte[] saltedPassword = new byte[pwdBytes.Length + salt.Length];

    Buffer.BlockCopy(pwdBytes, 0, saltedPassword, 0, pwdBytes.Length);
    Buffer.BlockCopy(salt, 0, saltedPassword, pwdBytes.Length, salt.Length);

    SHA1 sha = SHA1.Create();

    return sha.ComputeHash(saltedPassword);
}

答案 2 :(得分:2)

这是nice articleanother one(更适合ASP.NET应用程序)。

答案 3 :(得分:0)

没有巫术,盐只是一些随机文字附加到密码以击败字典攻击 - 弥补你自己的乱码。

答案 4 :(得分:0)

查看 hmac 功能,例如hmacdm5hmacsha1hmacsha256
另请查看System.Security.Cryptography命名空间。