在 C# 中验证 SHA512 哈希密码
Verify SHA512 Hashed Password in C#
我用 C# 设计了一个注册页面,所有用户都必须输入他们的密码,然后程序会在使用 SHA512 哈希方法将密码保存到数据库之前对其进行哈希处理。
现在,我想用数据库中保存的密码验证登录页面上输入的密码。
下面的代码是我用来散列密码的方法。
现在如何验证在登录页面输入的密码???
byte[] infos = System.Text.Encoding.ASCII.GetBytes(txtPassword.Text);
infos = new System.Security.Cryptography.SHA512Managed().ComputeHash(infos);
String hash = System.Text.Encoding.ASCII.GetString(infos);
写这样的代码怎么样:
using System;
using System.Text;
using System.Security.Cryptography;
using CodeShare.Cryptography;
namespace CodeShare.Cryptography
{
public static class SHA
{
public static string GenerateSHA512String(string inputString)
{
SHA512 sha512 = SHA512Managed.Create();
byte[] bytes = Encoding.UTF8.GetBytes(inputString);
byte[] hash = sha512.ComputeHash(bytes);
return GetStringFromHash(hash);
}
private static string GetStringFromHash(byte[] hash)
{
StringBuilder result = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
result.Append(hash[i].ToString("X2"));
}
return result.ToString();
}
}
}
示例:
public void UsageExample()
{
Console.WriteLine(SHA.GenerateSHA512String("abc"));
//returns DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F
}
Sha* 哈希系列不适合安全地存储密码,因为它们速度太快而且 brute-forced 太容易了。您应该切换到专用的 password-hash 函数,例如 BCrypt、Argon2 或 PBKDF2,它们应用盐并使用 key-stretching.
通过 Nuget 可以获得一个很好的 BCrypt 库:https://www.nuget.org/packages/BCrypt.Net-Next/
它的用法非常直接:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
string hashToStoreInDb = BCrypt.HashPassword(password);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from existingHashFromDb.
bool isPasswordCorrect = BCrypt.Verify(password, existingHashFromDb);
我用 C# 设计了一个注册页面,所有用户都必须输入他们的密码,然后程序会在使用 SHA512 哈希方法将密码保存到数据库之前对其进行哈希处理。
现在,我想用数据库中保存的密码验证登录页面上输入的密码。
下面的代码是我用来散列密码的方法。
现在如何验证在登录页面输入的密码???
byte[] infos = System.Text.Encoding.ASCII.GetBytes(txtPassword.Text);
infos = new System.Security.Cryptography.SHA512Managed().ComputeHash(infos);
String hash = System.Text.Encoding.ASCII.GetString(infos);
写这样的代码怎么样:
using System;
using System.Text;
using System.Security.Cryptography;
using CodeShare.Cryptography;
namespace CodeShare.Cryptography
{
public static class SHA
{
public static string GenerateSHA512String(string inputString)
{
SHA512 sha512 = SHA512Managed.Create();
byte[] bytes = Encoding.UTF8.GetBytes(inputString);
byte[] hash = sha512.ComputeHash(bytes);
return GetStringFromHash(hash);
}
private static string GetStringFromHash(byte[] hash)
{
StringBuilder result = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
result.Append(hash[i].ToString("X2"));
}
return result.ToString();
}
}
}
示例:
public void UsageExample()
{
Console.WriteLine(SHA.GenerateSHA512String("abc"));
//returns DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F
}
Sha* 哈希系列不适合安全地存储密码,因为它们速度太快而且 brute-forced 太容易了。您应该切换到专用的 password-hash 函数,例如 BCrypt、Argon2 或 PBKDF2,它们应用盐并使用 key-stretching.
通过 Nuget 可以获得一个很好的 BCrypt 库:https://www.nuget.org/packages/BCrypt.Net-Next/
它的用法非常直接:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
string hashToStoreInDb = BCrypt.HashPassword(password);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from existingHashFromDb.
bool isPasswordCorrect = BCrypt.Verify(password, existingHashFromDb);