1

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

请问有什么帮助吗?

4

2 回答 2

6

您将需要获取用户名和密码(来自屏蔽文本框的密码,最好使用第二个框进行确认)对其进行加盐,并从密码创建哈希,然后将明文用户名和密码的加盐哈希插入到数据库。然后,您可以通过将数据库存储的版本与用户输入的加盐(相同的盐!)哈希值进行比较来验证用户密码。

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

看看这篇文章。它几乎涵盖了所有基础,但不要按照文章中的建议使用 SHA-1。您需要一个计算量很大的慢速散列函数,例如 BCrypt 或 PBKDF2(包含在 .NET 中)。请参阅“什么是密码的良好散列函数”。(感谢@CodeInChaos 指出这一点)。

您可以使用System.Security.Cryptography 中的Rfc2898DeriveBytes来创建密码的加盐哈希,PBKDF2 样式。

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

一个好的经验法则是迭代次数应该使散列操作花费大约一秒钟。

于 2012-06-28T11:25:03.230 回答
0

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

记得添加using 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;
    }

您可以更改SHA256Managed任何其他支持的哈希算法。

更新:我认为您需要先了解这个概念。我将尝试解释它:

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

  1. 例如,生成一个随机 SALT Guid.NewGuid().ToString();
  2. 现在你将这个盐添加到你的密码中并对结果进行哈希处理,这意味着增加你的密码对暴力攻击的安全性。(这一步可以用string ComputeHash(string passwordPlainText, string saltString)我之前贴的函数来完成。
  3. 将用户名(由用户提供)、salt(guid)和密码(computeHash 的结果)保存在数据库中。
  4. 使用带有用户数据的表登录!
于 2012-06-28T11:37:45.933 回答