一、生成 string 对应的 MD5 码
/// <summary>
/// 生成 string 对应的 MD5 码
/// </summary>
/// <param name="s">需要转换的字符串 string<br/>
/// 如果用于远程第三方认证,s = username + DateTime.Now.Ticks.ToString() + 线下传递的Key;<br/>
/// 然后将 hash 值 与 username、DateTime.Now.Ticks.ToString() 共3个参数一起传递给第三方;<br/>
/// 第三方使用相同算法生成 MD5 码进行比较验证,使用 DateTime.Now.Ticks.ToString() 判定是否超时。</param>
/// <returns>转换后的 hash 值:MD5 码</returns>
public static string GetMD5FromString(string s)
{
byte[] data = System.Security.Cryptography.MD5.HashData(System.Text.Encoding.UTF8.GetBytes(s));
System.Text.StringBuilder sBuilder = new();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString().ToUpper();
}
二、 生成 string 对应的 Pbkdf2 码
/// <summary>
/// derive a 256-bit subkey (use HMACSHA256 with 100 iterations)
/// </summary>
/// <param name="password">需要转换的字符串 string<br/>
/// 如果用于远程第三方认证,则为需要认证的 username</param>
/// <param name="salt">盐值,通常为随机数,确保每次生成的 hash 值不同,用于本地密码验证时 salt 与 hash 值同步保存。<br/>
/// 如果用于远程第三方认证,salt = DateTime.Now.Ticks.ToString() + 线下传递的Key;<br/>
/// 然后将 hash 值与 username、DateTime.Now.Ticks.ToString() 共3个参数一起传递给第三方;<br/>
/// 第三方使用相同算法生成 hash 值进行比较验证,使用 DateTime.Now.Ticks.ToString() 判定是否超时。</param>
/// <returns>转换后的 hash 值:Pbkdf2 码</returns>
public static string GetPbkdf2FromString(string password, string salt)
{
string hashed = Convert.ToBase64String(Microsoft.AspNetCore.Cryptography.KeyDerivation.KeyDerivation.Pbkdf2(
password: password,
salt: System.Text.Encoding.UTF8.GetBytes(salt),
prf: Microsoft.AspNetCore.Cryptography.KeyDerivation.KeyDerivationPrf.HMACSHA256,
iterationCount: 100,
numBytesRequested: 256 / 8));
return hashed;
}