哈希或加密或两者都存储用户密码? C# 窗体

Hashing or Encrypting or both to store users' password? C# Winforms

我一直在开发离线 windows 表单应用程序,该应用程序已将登录和注册链接到 SQL 数据库。将用户的密码、电子邮件和用户名存储到本地数据库。

我已经做到了...

public static string Encrypt(string encryptString,string EncryptionKey)
    {              
        byte[] clearBytes = Encoding.Unicode.GetBytes(encryptString);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] {
        0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76
    });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                encryptString = Convert.ToBase64String(ms.ToArray());
            }
        }
        return encryptString;
    }

    private static Random random = new Random();
    public static string RandomString(int length)
    {
        const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%&*+-/";
        return new string(Enumerable.Repeat(chars, length)
          .Select(s => s[random.Next(s.Length)]).ToArray());
    }    

在创建账户(注册)时会为每个用户随机创建一个加密密钥,并将其存储在数据库中以供解密(登录)使用。这是正确的方法吗?如何使用此方法并以安全的方式存储密钥?

我浏览了一些网站和博客,但无法理解将用户数据存储到数据库的正确方法是什么?如果是,应该以何种方式或格式存储?

主要是

  1. 我的困惑是我们是否应该只散列密码(存储在数据库中)并在登录时检查从用户密码生成的散列?

  2. 大型科技公司如何将密码存储到数据库中?

提前致谢

简而言之:

  1. 只对它进行散列就足够了,因为散列(正确完成)是不可逆的(在实践中)。
  2. 不同的公司采用不同的方法,但他们中的大多数不在本地存储散列密码,而是使用一些云解决方案,通常是第三方解决方案。

关于如何加密/散列密码,那里有很多信息。