8

如何轻松地从 Textbox.Text 中添加密码?

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

4

5 回答 5

14

不久前,我们就加密密码时的最佳实践进行了一场精彩的讨论,您可能会在那里找到一些很棒的想法:

加盐密码:最佳实践?

我发现最简单但仍然相当安全的方法之一是使用 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;
于 2010-06-17T15:44:16.737 回答
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);
}
于 2010-06-17T16:48:08.173 回答
2

这是一篇不错的文章另一篇(更适合 ASP.NET 应用程序)。

于 2010-06-17T15:33:01.637 回答
0

没有魔法,盐只是一些随机文本附加到密码以击败字典攻击 - 组成你自己的胡言乱语。

于 2010-06-17T15:37:36.537 回答
0

查看hmac函数,如hmacdm5hmacsha1hmacsha256
还要查看System.Security.Cryptography命名空间。

于 2010-06-17T15:37:45.260 回答