散列或加密或两者都存储用户的密码? C# Winforms [关闭]

Posted

技术标签:

【中文标题】散列或加密或两者都存储用户的密码? C# Winforms [关闭]【英文标题】:Hashing or Encrypting or both to store users' password? C# Winforms [closed] 【发布时间】:2021-12-16 03:55:15 【问题描述】:

我一直在开发一个离线 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());
        

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

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

主要是,

    我的困惑是我们是否应该只对密码(存储在数据库中)进行哈希处理,并在登录时检查用户密码生成的哈希?

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

提前致谢

【问题讨论】:

见Difference between Hashing a Password and Encrypting it 不要发明自己的密码存储方式。密码应使用抗暴力和面向未来的算法进行加盐和哈希处理。有很多关于如何正确存储密码的文章,例如参见storing passwords in .net。 【参考方案1】:

简而言之:

    仅对其进行散列就足够了,因为散列(正确完成)是不可逆的(实际上)。 不同的公司采用不同的方法,但大多数公司不会在本地存储散列密码,而是使用一些云解决方案,通常是第三方这样做。

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

【讨论】:

以上是关于散列或加密或两者都存储用户的密码? C# Winforms [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

你为啥要在数据库中存储纯文本或加密(非散列)密码?

Castle ActiveRecord / NHibernate - 密码加密或散列

如何迁移密码哈希?

如何在 MySQL (PhpMyAdmin) 的用户表中“散列”我的密码?

常用加密算法的应用

单向散列加密