我正在使用一个函数来获取字符串值的 HMAC SHA-256 哈希。但是当我在 JavaScript 和 PHP 中对值进行哈希处理时,两种语言计算的哈希值相同,这与 C# 的结果不同。
我搜索了谷歌并尝试了一切,但它不会给我正确的结果。也许我只是错过了一些东西。
public static string ToHMAC(this string input, string key)
{
if (string.IsNullOrEmpty(input))
throw new ArgumentNullException("input");
var hasher = new HMACSHA256(Encoding.UTF8.GetBytes(key));
var data = hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
return BitConverter.ToString(data).Replace("-", String.Empty).ToLower();
}
我尝试在控制台应用程序中进行小测试。
class Program
{
static void Main(string[] args)
{
const string input = "testpw1";
const string token = "9e76fa355b5e4bed910f621f6a5fb971";
var phash = input.ToSHA();
Console.WriteLine("Hashed password: " + phash);
Console.WriteLine("Signed password: " + phash.ToHMAC(token));
Console.ReadKey();
}
}
static class Extensions
{
public static string ToSHA(this string input)
{
if (string.IsNullOrEmpty(input))
throw new ArgumentNullException("input");
var hasher = new SHA256Managed();
var data = hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
return BitConverter.ToString(data).Replace("-", String.Empty).ToLower();
}
public static string ToHMAC(this string input, string key)
{
if (string.IsNullOrEmpty(input))
throw new ArgumentNullException("input");
var hasher = new HMACSHA256(Encoding.UTF8.GetBytes(key));
var data = hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
var retval = BitConverter.ToString(data).Replace("-", String.Empty).ToLower();
return retval;
}
}
这正是我在 MVC 应用程序中的做法。但不知何故,这些值与 PHP 和 JavaScript 哈希值相同。我真的不明白我做错了什么。