我使用函数来获取字符串值的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哈希值相同。我真的不知道自己做错了什么。