public class hash_encrypt
{
private const int SaltSize = 16; // 16 bytes
private const int KeySize = 32; // 32 bytes (256 bits)
private const int Iterations = 100000; // 迭代次数,越高越安全但越慢
private static readonly HashAlgorithmName HashAlgorithm = HashAlgorithmName.SHA256;
// 生成密码哈希和盐
public static (string Hash, string Salt) HashPassword(string password)
{
// 生成随机盐
byte[] salt = new byte[SaltSize];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(salt);
}
// 生成哈希
var pbkdf2 = new Rfc2898DeriveBytes(password, salt, Iterations, HashAlgorithm);
byte[] hash = pbkdf2.GetBytes(KeySize);
// 返回Base64编码的哈希和盐
return (Convert.ToBase64String(hash), Convert.ToBase64String(salt));
}
// 验证密码
public static bool VerifyPassword(string password, string storedHash, string storedSalt)
{
byte[] salt = Convert.FromBase64String(storedSalt);
byte[] hashToCompare = new Rfc2898DeriveBytes(password, salt, Iterations, HashAlgorithm)
.GetBytes(KeySize);
byte[] hash = Convert.FromBase64String(storedHash);
return CryptographicOperations.FixedTimeEquals(hash, hashToCompare);
}
}
C# Base64 加密记录 及 解密 (适用于用户密码)
发布于 22 天前 56 次阅读
Comments NOTHING