C# 创建加密的密码并将其存储在sqlite中以用于身份验证
我有一个WinForms应用程序,带有登录表单,我想在SQLite数据库中存储加密的用户名和密码。我看到我可以使用salt和hash,但我不知道如何在代码中加密密码,并在进行身份验证时进行比较C# 创建加密的密码并将其存储在sqlite中以用于身份验证,c#,winforms,saltedhash,C#,Winforms,Saltedhash,我有一个WinForms应用程序,带有登录表单,我想在SQLite数据库中存储加密的用户名和密码。我看到我可以使用salt和hash,但我不知道如何在代码中加密密码,并在进行身份验证时进行比较 有什么帮助吗?您需要将用户名和密码(密码来自一个屏蔽文本框,最好有第二个框用于确认)添加到其中,并根据密码创建一个哈希,然后将明文用户名和密码的附加哈希插入到数据库中。然后,您可以在将来通过将数据库存储的版本与用户输入内容的salt(相同salt!)散列进行比较来验证用户密码 请注意,每个用户都应该有自己
有什么帮助吗?您需要将用户名和密码(密码来自一个屏蔽文本框,最好有第二个框用于确认)添加到其中,并根据密码创建一个哈希,然后将明文用户名和密码的附加哈希插入到数据库中。然后,您可以在将来通过将数据库存储的版本与用户输入内容的salt(相同salt!)散列进行比较来验证用户密码 请注意,每个用户都应该有自己的salt,您可以在用户创建帐户时为该用户随机生成salt。(这比黑客可以发现的全局salt值更安全) 看一看。它几乎涵盖了所有的基础,但是不要像本文推荐的那样使用SHA-1。您需要一个计算代价很高的慢散列函数,如BCrypt或PBKDF2(包含在.NET中)。看见(感谢@CodeInChaos指出这一点) 您可以在System.Security.Cryptography中使用创建密码的附加哈希,即PBKDF2样式
byte[] salt = Guid.NewGuid().ToByteArray[];
Rfc2898DeriveBytes saltedHash = new Rfc2898DeriveBytes("P@$$w0rd", salt, 1000);
一个很好的经验法则是,迭代次数应该会导致哈希操作花费大约一秒钟的时间。您需要获取用户名和密码(密码来自一个屏蔽文本框,最好有第二个框用于确认),然后根据密码创建哈希,然后将明文用户名和密码的附加哈希插入数据库。然后,您可以在将来通过将数据库存储的版本与用户输入内容的salt(相同salt!)散列进行比较来验证用户密码 请注意,每个用户都应该有自己的salt,您可以在用户创建帐户时为该用户随机生成salt。(这比黑客可以发现的全局salt值更安全) 看一看。它几乎涵盖了所有的基础,但是不要像本文推荐的那样使用SHA-1。您需要一个计算代价很高的慢散列函数,如BCrypt或PBKDF2(包含在.NET中)。看见(感谢@CodeInChaos指出这一点) 您可以在System.Security.Cryptography中使用创建密码的附加哈希,即PBKDF2样式
byte[] salt = Guid.NewGuid().ToByteArray[];
Rfc2898DeriveBytes saltedHash = new Rfc2898DeriveBytes("P@$$w0rd", salt, 1000);
一个很好的经验法则是,迭代次数应该会导致哈希操作花费大约一秒钟的时间。您需要将哈希密码和salt存储在数据库中。为每个用户使用一个随机盐(GUID应该可以) 您可以使用以下内容散列您的密码: 记住使用System.Security.Cryptography添加
代码>名称空间
public static string ComputeHash(string passwordPlainText, string saltString)
{
// Convert plain text into a byte array.
byte[] saltBytes = Encoding.UTF8.GetBytes(saltString);
// Convert plain text into a byte array.
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
// Allocate array, which will hold plain text and salt.
byte[] plainTextWithSaltBytes =
new byte[plainTextBytes.Length + saltBytes.Length];
// Copy plain text bytes into resulting array.
for (int i = 0; i < plainTextBytes.Length; i++)
plainTextWithSaltBytes[i] = plainTextBytes[i];
// Append salt bytes to the resulting array.
for (int i = 0; i < saltBytes.Length; i++)
plainTextWithSaltBytes[plainTextBytes.Length + i] = saltBytes[i];
// Because we support multiple hashing algorithms, we must define
// hash object as a common (abstract) base class. We will specify the
// actual hashing algorithm class later during object creation.
HashAlgorithm hash;
hash = new SHA256Managed();
// Compute hash value of our plain text with appended salt.
byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);
// Create array which will hold hash and original salt bytes.
byte[] hashWithSaltBytes = new byte[hashBytes.Length +
saltBytes.Length];
// Copy hash bytes into resulting array.
for (int i = 0; i < hashBytes.Length; i++)
hashWithSaltBytes[i] = hashBytes[i];
// Append salt bytes to the result.
for (int i = 0; i < saltBytes.Length; i++)
hashWithSaltBytes[hashBytes.Length + i] = saltBytes[i];
// Convert result into a base64-encoded string.
string hashValue = Convert.ToBase64String(hashWithSaltBytes);
// Return the result.
return hashValue;
}
publicstaticstringcomputehash(stringpasswordplaintext,stringsaltstring)
{
//将纯文本转换为字节数组。
byte[]saltBytes=Encoding.UTF8.GetBytes(saltString);
//将纯文本转换为字节数组。
字节[]明文字节=Encoding.UTF8.GetBytes(明文);
//分配数组,该数组将包含纯文本和salt。
字节[]带altbytes的明文=
新字节[plainTextBytes.Length+saltBytes.Length];
//将纯文本字节复制到结果数组中。
for(int i=0;i
您可以更改任何其他受支持的哈希算法的SHA256Managed
更新:我想你需要先理解这个概念。我试着解释一下:
在登录之前,您需要在数据库中创建用户。要创建它们,您需要用户名和密码
生成一个随机SALT,Guid.NewGuid().ToString()代码>例如
现在将此盐添加到密码中并对结果进行散列,其意义是提高密码的安全性,以防暴力攻击。(这一步可以通过我之前发布的函数stringcomputehash(stringpasswordplaintext,stringsaltstring)
完成
在数据库中保存用户名(由用户提供)、salt(guid)和密码(计算哈希结果)
使用带有用户数据的表登录
您需要在数据库中存储哈希密码和salt。为每个用户使用随机salt(GUID应该可以)
您可以使用以下内容散列您的密码: