生成字节数组的 Base64 MD5 散列
Generate Base64 MD5 hash of byte array
我在我的 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);
我在header中绑定这个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
函数来自
请告诉我这里有什么问题。
您的 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));
那么等效的 JavaScript 代码是:
var tmp = 'test';
var hashed = hex2a(MD5(tmp)); // md5 src:
// src:
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));
因为 MD5 returns 是一个十六进制字符串,您必须先将其转换为 ASCII,然后才能对其进行 base64 编码。请问需要base64编码吗? MD5 通常表示为十六进制字符串。也许在 C# 方面,您可以使用 BitConverter.ToString(hashed).Replace("-", "")
而不是 Convert.ToBase64String(hashed)
来获取 MD5 哈希的十六进制字符串?然后你可以简单地在 JavaScript.
中使用 MD5(tmp)
我在我的 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);
我在header中绑定这个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
函数来自
请告诉我这里有什么问题。
您的 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));
那么等效的 JavaScript 代码是:
var tmp = 'test';
var hashed = hex2a(MD5(tmp)); // md5 src:
// src:
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));
因为 MD5 returns 是一个十六进制字符串,您必须先将其转换为 ASCII,然后才能对其进行 base64 编码。请问需要base64编码吗? MD5 通常表示为十六进制字符串。也许在 C# 方面,您可以使用 BitConverter.ToString(hashed).Replace("-", "")
而不是 Convert.ToBase64String(hashed)
来获取 MD5 哈希的十六进制字符串?然后你可以简单地在 JavaScript.
MD5(tmp)