哈希或加密或两者都存储用户密码? 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());
}
在创建账户(注册)时会为每个用户随机创建一个加密密钥,并将其存储在数据库中以供解密(登录)使用。这是正确的方法吗?如何使用此方法并以安全的方式存储密钥?
我浏览了一些网站和博客,但无法理解将用户数据存储到数据库的正确方法是什么?如果是,应该以何种方式或格式存储?
主要是
我的困惑是我们是否应该只散列密码(存储在数据库中)并在登录时检查从用户密码生成的散列?
大型科技公司如何将密码存储到数据库中?
提前致谢
简而言之:
- 只对它进行散列就足够了,因为散列(正确完成)是不可逆的(在实践中)。
- 不同的公司采用不同的方法,但他们中的大多数不在本地存储散列密码,而是使用一些云解决方案,通常是第三方解决方案。
关于如何加密/散列密码,那里有很多信息。
我一直在开发离线 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());
}
在创建账户(注册)时会为每个用户随机创建一个加密密钥,并将其存储在数据库中以供解密(登录)使用。这是正确的方法吗?如何使用此方法并以安全的方式存储密钥?
我浏览了一些网站和博客,但无法理解将用户数据存储到数据库的正确方法是什么?如果是,应该以何种方式或格式存储?
主要是
我的困惑是我们是否应该只散列密码(存储在数据库中)并在登录时检查从用户密码生成的散列?
大型科技公司如何将密码存储到数据库中?
提前致谢
简而言之:
- 只对它进行散列就足够了,因为散列(正确完成)是不可逆的(在实践中)。
- 不同的公司采用不同的方法,但他们中的大多数不在本地存储散列密码,而是使用一些云解决方案,通常是第三方解决方案。
关于如何加密/散列密码,那里有很多信息。