通过一定的哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较短小的数据,这段小数据就是大数据的哈希值。他最大的特点就是唯一性,一旦大数据发生了变化,哪怕是一个微小的变化,他的哈希值也会发生变化。类似于DNA,既然是DNA,那就保证了没有两个数据的哈希值是完全相同的。
哈希值的作用:哈希值,即HASH值,是通过对文件内容进行加密运算得到的一组二进制值,主要用途是用于文件校验或签名。正是因为这样的特点,它常常用来判断两个文件是否相同。
比如,从网络上下载某个文件,只要把这个文件原来的哈希值同下载后得到的文件的哈希值进行对比,如果相同则表示两个文件完全一致,下载过程没有损坏文件。而如果不一致,则表明下载得到的文件跟原来的文件不同,文件在下载过程中受到了损坏。
using System.Security.Cryptography;
using System.Text;
namespace WebApplicationPwd;
public static class PasswordHelper
{
public static string Encryption(string pwd, string? salt)
{
if (string.IsNullOrEmpty(salt))
{
var pwdBytes = Encoding.ASCII.GetBytes(pwd);
var pwdHashBytes = MD5.HashData(pwdBytes);
return Convert.ToBase64String(pwdHashBytes);
}
else
{
//var pwdBytes = Encoding.ASCII.GetBytes(pwd + salt);
//var pwdHash256Bytes = SHA256.HashData(pwdBytes);
//return Convert.ToBase64String(pwdHash256Bytes);
#region PBKDF2+salt
var saltBytes = Encoding.ASCII.GetBytes(salt);
using var pkdf2 = new Rfc2898DeriveBytes(pwd, saltBytes, 1000);
var pwdHashRfcBytes = pkdf2.GetBytes(32);
return Convert.ToBase64String(pwdHashRfcBytes);
#endregion
#region Bcrypt & Argon2 不需要加盐
// <PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
//return BCrypt.Net.BCrypt.HashPassword(pwd);
#endregion
}
}
public static bool VerifyPassword(string pwd, string hashPwd, string salt)
{
return Encryption(pwd, salt) == hashPwd;
}
public static string CreateSalt()
{
var randomNu = RandomNumberGenerator.GetBytes(32);
return Convert.ToBase64String(randomNu);
}
}