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

如何在C#windows窗体应用程序中轻松设置密码?,c#,.net,winforms,passwords,salt,C#,.net,Winforms,Passwords,Salt,如何从文本框中轻松设置密码 在.NET framework中是否有一些内置的魔法?这里有一个and(它更适合ASP.NET应用程序)。没有魔法,salt只是一些随机文本附加到密码中,以抵抗字典攻击-组成您自己的jibberish。请看一下hmac函数,如,或。 也可以查看名称空间。不久前,我们就添加密码的最佳实践进行了一次很好的讨论,您可能会在这里找到一些很棒的想法: 我发现,尽管仍然相当安全,但最简单的方法之一是使用GUID作为salt。它是随机的,而且足够长。如果包含GUID的字符串格式(

如何从文本框中轻松设置密码


在.NET framework中是否有一些内置的魔法?

这里有一个and(它更适合ASP.NET应用程序)。

没有魔法,salt只是一些随机文本附加到密码中,以抵抗字典攻击-组成您自己的jibberish。请看一下hmac函数,如,或。

也可以查看名称空间。

不久前,我们就添加密码的最佳实践进行了一次很好的讨论,您可能会在这里找到一些很棒的想法:

我发现,尽管仍然相当安全,但最简单的方法之一是使用GUID作为salt。它是随机的,而且足够长。如果包含GUID的字符串格式(字符“{”和“-”,则效果最好,但不必这样做

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

下面是一个可以在C#中使用的快速片段:

或者


我想你要的是用户名和密码

在某些系统中,用户名用作salt(我认为这样做是可以的) 否则,您需要将salt存储在某个位置,并在散列(如果是随机创建的salt)之前检索它,或者使用一个算法为同一用户返回相同的salt(并且仅仅使用普通用户名并不更好)

个人使用以下代码:

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);
}

第二篇文章更好,因为它允许任意大小的盐。第一篇文章建议使用4字节的盐;肯定是小的方式。盐应该是长的。我不是批评你,只是把它放在这里给后代看。:)如果你生成随机盐,记得在你需要的时候保存它们,以便在出去的时候解密。@Adam:好的观点。我最初有一个这样的句子,但显然已经删掉了。我会把它放回去。你可以很容易地使用这个
var salt = Guid.NewGuid().ToString();
var saltedPassword = password + salt;
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);
}