如何加密用户的用户ID和密码
本文关键字:用户 ID 密码 何加密 加密 | 更新日期: 2023-09-27 17:58:23
我想在MySql数据库中为我的WinForms项目保存用户ID和密码。我的一个朋友告诉我,这并不安全;我应该加密并保存它。我不知道加密。
我该怎么做?
通常密码根本不存储在数据库中。而是存储密码的散列。例如,您可以查看SHA156类。
网上有很多关于如何散列密码的文章
例如存储密码-做得对!
请注意,您的朋友告诉您加密它,这与在表中存储哈希(使用加密哈希函数计算)不同。
如果你加密并存储它,如果你有密钥,你就可以检索密码。
如果存储密码的安全散列,则可以通过对字符串进行散列并比较表中的散列来判断字符串是否与密码相同。
我做了一次搜索,从另一个SO问题中找到了这个答案,该问题更详细地解释了为什么你应该使用(安全的)哈希而不是加密密码。
最后但同样重要的是,无论是加密还是安全哈希,都要确保使用经过公开测试的库,而不是"自己滚动"。
使用加密时,需要为数据选择算法(加密方法)。在存储用户凭据时,通常会创建并存储信息的哈希,而不是对其进行加密。与加密相比,使用哈希的优点是哈希是不可逆的,因此无法恢复原始数据。
创建哈希的过程是:
- 创建盐值(如下所述)
- 将salt值附加到密码
- 哈希此字符串
- 将salt值和hash值存储在数据库中
然后,当您稍后要验证凭据时:
- 获取用户输入的密码值,并将salt附加到其中
- 对步骤1中的字符串进行哈希
- 将其与数据库中存储的密码进行比较。如果存储的哈希和步骤2中的哈希匹配,则用户输入了正确的密码,否则密码不正确
Hashes and Salts
salt值是每个用户唯一的值,在存储之前会附加到敏感值(如用户名和密码)。salts与哈希一起使用的原因是,更难生成针对数据库的暴力攻击中使用的哈希值列表。
代码示例
生成Salt&Hash
private void EncryptPassword(string userPassword)
{
//Performs hashing using SHA256 algorithum
SHA256Managed hash = new SHA256Managed();
RNGCryptoServiceProvider random = new RNGCryptoServiceProvider();
byte[] saltBytes = new byte[32]; // 32 bytes = 256-bit salt.
//Fill saltBytes with cryptographically strong random values.
random.GetBytes(saltBytes);
//Get a byte representation of the password because the hash function
//works with byte arrays.
byte[] passwordBytes = Encoding.UTF8.GetBytes(userPassword);
byte[] hashInput = new byte[passwordBytes.Length + saltBytes.Length];
//Append the contents of the passwordBytes and hashBytes arrays to create
//the input to the hash function (value to be hashed)
passwordBytes.CopyTo(hashInput, 0);
saltBytes.CopyTo(hashInput, passwordBytes.Length);
//Compute (generate) a hashed representation of the input value.
byte[] hashValue = hash.ComputeHash(hashInput);
//Hashes are often stored as strings in databases.
//Hashes should be stored using Base64 encoding.
string hashString = Convert.ToBase64String(hashValue);
string saltString = Convert.ToBase64String(saltBytes);
//store hashString and saltString in database.
}
对用户进行身份验证
private bool AuthenticateUser(string userName, string password)
{
SHA256 hash = new SHA256Managed();
//Convert hash and salts from Base64/
byte[] storedHash = Convert.FromBase64String("Hash Value from the database");
byte[] storedSalt = Convert.FromBase64String("Salt from Database");
//Append salt to user password and hash the result
byte[] attemptedPasswordBytes = Encoding.UTF8.GetBytes(password);
byte[] hashInput = new byte[attemptedPasswordBytes.Length + storedSalt.Length];
attemptedPasswordBytes.CopyTo(hashInput, 0);
storedSalt.CopyTo(hashInput, attemptedPasswordBytes.Length);
byte[] attemptedHash = hash.ComputeHash(hashInput);
//Check whether the password entered by the user matches the stored hash.
return attemptedHash == storedHash;
}
一个非常简单的解决方案是使用varbinary数据类型,它将以二进制格式存储密码,其他人无法读取。。
如果你想要更多的安全性,那么你需要使用我的sql server本身提供的加密,比如128位加密,你需要创建不对称密钥,然后用加密
您可以使用C#的fronthand加密用户名和密码,并将该值存储在数据库中。检索时,必须对其进行解密才能进行匹配。请查看此链接。