生成字节数组的Base64 MD5哈希

时间:2017-12-05 06:24:17

标签: javascript c# hash md5 asciiencoding

我在c#web api中实现了以下安全编码:

string testStr = "test";
ASCIIEncoding encoding = new ASCIIEncoding();    //using System.Text;
byte[] byteData = encoding.GetBytes(testStr);

MD5 md5 = MD5.Create();    //using System.Security.Cryptography;
string hash = md5.ComputeHash(byteData);
string md5Base64 = Convert.ToBase64String(hash);

我在标头中绑定此md5Base64字符串,并在API请求中对其进行比较。当我从C#代码中获取API时,这很好用。现在我需要在javascript中使用它,因此需要js相当于上面的代码。

我尝试了以下但它提供了不同的输出:

var testStr = 'test';
var byteData = testStr.split ('').map(function (c) { return c.charCodeAt (0); });
var hash = MD5(value.join(','));
var md5Base64 = btoa(hash);

此处使用的MD5函数来自https://stackoverflow.com/a/33486055/7519287

请告诉我这里有什么问题。

1 个答案:

答案 0 :(得分:0)

JavaScript代码的问题在于您正在进行不必要的转换:MD5已经接受了一个字符串。此外,还需要在散列后进行更多转换。

如果我们有以下C#代码:

string tmp = "test";
byte[] bTmp = System.Text.Encoding.UTF8.GetBytes(tmp);
byte[] hashed = null;
using (System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider())
{
    hashed = md5.ComputeHash(bTmp);
}

Console.WriteLine(Convert.ToBase64String(hashed));

Fiddle

然后等效的JavaScript代码是:

var tmp = 'test';
var hashed = hex2a(MD5(tmp)); // md5 src: https://stackoverflow.com/a/33486055/7519287

// src: https://stackoverflow.com/a/3745677/3181933
function hex2a(hexx) {
    var hex = hexx.toString();//force conversion
    var str = '';
    for (var i = 0; i < hex.length; i += 2)
        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
    return str;
}

alert(btoa(hashed));

Fiddle

由于MD5返回十六进制字符串,因此必须先将其转换为ASCII,然后才能对其进行base64编码。我想知道你是否需要base64编码? MD5通常表示为十六进制字符串。也许在C#端,而不是Convert.ToBase64String(hashed),您可以使用BitConverter.ToString(hashed).Replace("-", "")来获取MD5哈希的十六进制字符串?然后你就可以在JavaScript中使用MD5(tmp)