C# 创建加密的密码并将其存储在sqlite中以用于身份验证

C# 创建加密的密码并将其存储在sqlite中以用于身份验证,c#,winforms,saltedhash,C#,Winforms,Saltedhash,我有一个WinForms应用程序,带有登录表单,我想在SQLite数据库中存储加密的用户名和密码。我看到我可以使用salt和hash,但我不知道如何在代码中加密密码,并在进行身份验证时进行比较 有什么帮助吗?您需要将用户名和密码(密码来自一个屏蔽文本框,最好有第二个框用于确认)添加到其中,并根据密码创建一个哈希,然后将明文用户名和密码的附加哈希插入到数据库中。然后,您可以在将来通过将数据库存储的版本与用户输入内容的salt(相同salt!)散列进行比较来验证用户密码 请注意,每个用户都应该有自己

我有一个WinForms应用程序,带有登录表单,我想在SQLite数据库中存储加密的用户名和密码。我看到我可以使用salt和hash,但我不知道如何在代码中加密密码,并在进行身份验证时进行比较


有什么帮助吗?

您需要将用户名和密码(密码来自一个屏蔽文本框,最好有第二个框用于确认)添加到其中,并根据密码创建一个哈希,然后将明文用户名和密码的附加哈希插入到数据库中。然后,您可以在将来通过将数据库存储的版本与用户输入内容的salt(相同salt!)散列进行比较来验证用户密码

请注意,每个用户都应该有自己的salt,您可以在用户创建帐户时为该用户随机生成salt。(这比黑客可以发现的全局salt值更安全)

看一看。它几乎涵盖了所有的基础,但是不要像本文推荐的那样使用SHA-1。您需要一个计算代价很高的慢散列函数,如BCrypt或PBKDF2(包含在.NET中)。看见(感谢@CodeInChaos指出这一点)

您可以在System.Security.Cryptography中使用创建密码的附加哈希,即PBKDF2样式

byte[] salt = Guid.NewGuid().ToByteArray[];
Rfc2898DeriveBytes saltedHash = new Rfc2898DeriveBytes("P@$$w0rd", salt, 1000);

一个很好的经验法则是,迭代次数应该会导致哈希操作花费大约一秒钟的时间。

您需要获取用户名和密码(密码来自一个屏蔽文本框,最好有第二个框用于确认),然后根据密码创建哈希,然后将明文用户名和密码的附加哈希插入数据库。然后,您可以在将来通过将数据库存储的版本与用户输入内容的salt(相同salt!)散列进行比较来验证用户密码

请注意,每个用户都应该有自己的salt,您可以在用户创建帐户时为该用户随机生成salt。(这比黑客可以发现的全局salt值更安全)

看一看。它几乎涵盖了所有的基础,但是不要像本文推荐的那样使用SHA-1。您需要一个计算代价很高的慢散列函数,如BCrypt或PBKDF2(包含在.NET中)。看见(感谢@CodeInChaos指出这一点)

您可以在System.Security.Cryptography中使用创建密码的附加哈希,即PBKDF2样式

byte[] salt = Guid.NewGuid().ToByteArray[];
Rfc2898DeriveBytes saltedHash = new Rfc2898DeriveBytes("P@$$w0rd", salt, 1000);

一个很好的经验法则是,迭代次数应该会导致哈希操作花费大约一秒钟的时间。

您需要将哈希密码和salt存储在数据库中。为每个用户使用一个随机盐(GUID应该可以) 您可以使用以下内容散列您的密码:

记住使用System.Security.Cryptography添加
名称空间

    public static string ComputeHash(string passwordPlainText, string saltString)
    {
        // Convert plain text into a byte array.
        byte[] saltBytes = Encoding.UTF8.GetBytes(saltString);

        // Convert plain text into a byte array.
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

        // Allocate array, which will hold plain text and salt.
        byte[] plainTextWithSaltBytes =
                new byte[plainTextBytes.Length + saltBytes.Length];

        // Copy plain text bytes into resulting array.
        for (int i = 0; i < plainTextBytes.Length; i++)
            plainTextWithSaltBytes[i] = plainTextBytes[i];

        // Append salt bytes to the resulting array.
        for (int i = 0; i < saltBytes.Length; i++)
            plainTextWithSaltBytes[plainTextBytes.Length + i] = saltBytes[i];

        // Because we support multiple hashing algorithms, we must define
        // hash object as a common (abstract) base class. We will specify the
        // actual hashing algorithm class later during object creation.
        HashAlgorithm hash;

        hash = new SHA256Managed();

        // Compute hash value of our plain text with appended salt.
        byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);

        // Create array which will hold hash and original salt bytes.
        byte[] hashWithSaltBytes = new byte[hashBytes.Length +
                                            saltBytes.Length];

        // Copy hash bytes into resulting array.
        for (int i = 0; i < hashBytes.Length; i++)
            hashWithSaltBytes[i] = hashBytes[i];

        // Append salt bytes to the result.
        for (int i = 0; i < saltBytes.Length; i++)
            hashWithSaltBytes[hashBytes.Length + i] = saltBytes[i];

        // Convert result into a base64-encoded string.
        string hashValue = Convert.ToBase64String(hashWithSaltBytes);

        // Return the result.
        return hashValue;
    }
publicstaticstringcomputehash(stringpasswordplaintext,stringsaltstring)
{
//将纯文本转换为字节数组。
byte[]saltBytes=Encoding.UTF8.GetBytes(saltString);
//将纯文本转换为字节数组。
字节[]明文字节=Encoding.UTF8.GetBytes(明文);
//分配数组,该数组将包含纯文本和salt。
字节[]带altbytes的明文=
新字节[plainTextBytes.Length+saltBytes.Length];
//将纯文本字节复制到结果数组中。
for(int i=0;i
您可以更改任何其他受支持的哈希算法的
SHA256Managed

更新:我想你需要先理解这个概念。我试着解释一下:

在登录之前,您需要在数据库中创建用户。要创建它们,您需要用户名和密码

  • 生成一个随机SALT,
    Guid.NewGuid().ToString()例如
  • 现在将此盐添加到密码中并对结果进行散列,其意义是提高密码的安全性,以防暴力攻击。(这一步可以通过我之前发布的函数
    stringcomputehash(stringpasswordplaintext,stringsaltstring)
    完成
  • 在数据库中保存用户名(由用户提供)、salt(guid)和密码(计算哈希结果)
  • 使用带有用户数据的表登录

  • 您需要在数据库中存储哈希密码和salt。为每个用户使用随机salt(GUID应该可以) 您可以使用以下内容散列您的密码: