散列或加密或两者都存储用户的密码? 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 - 密码加密或散列