我一直在尝试将 HMAC 中间件代码片段转换为 C#。 Node JS 代码非常简单。
const hash = crypto
.createHmac('sha256', 'SHA-Key')
.update(JSON.stringify(req.body))
.digest('hex');
if (hash === req.header('X-HMAC-Sha-256')) {
next();
} else {
res.send(401, 'Not authorized.');
}
我的 C# 代码
public string CalculateSHA256Hash(byte[] key, string requestContent, string senderHash)
{
string hexHash = "";
// Initialize the keyed hash object.
using (HMACSHA256 hmac = new HMACSHA256(key))
{
byte[] requestByteArray = Encoding.UTF8.GetBytes(requestContent);
// Create a FileStream for the source file.
using (MemoryStream inStream = new MemoryStream(requestByteArray))
{
// Read in the storedHash.
inStream.Read(requestByteArray, 0, requestByteArray.Length);
// Compute the hash of the remaining contents of the file.
// The stream is properly positioned at the beginning of the content,
// immediately after the stored hash value.
byte[] computedHash = hmac.ComputeHash(inStream);
hexHash = Convert.ToHexString(computedHash);
}
}
return hexHash;
}
当我运行代码时,我永远不会得到与发送者 HMAC 哈希相同的结果。这与 node.js 中的 Digest Hex 与我的转换 toHexString 有关吗?
回答1
所以我需要深入研究 node.js 代码为这个 HMAC 哈希完成了什么。我发现一旦我了解了 json.stringify() 的作用,实现起来就变得微不足道了。
public string CalculateSHA256Hash(byte[] key, string requestContent)
{
string hexHash = "";
try
{
// Initialize the keyed hash object.
using (HMACSHA256 hmac = new HMACSHA256(key))
{
byte[] requestByteArray = Encoding.UTF8.GetBytes(requestContent);
// Create a FileStream for the source request body.
using (MemoryStream inStream = new MemoryStream(requestByteArray))
{
byte[] computedHash = hmac.ComputeHash(inStream);
hexHash = Convert.ToHexString(computedHash).ToLower();
}
}
}
catch (Exception e)
{
throw;
}
return hexHash;
}
我使用以下内容获得了 json.stringify() 的等价物
//Stringify
strBody = strBody.Replace(" ", "");
strBody = strBody.Replace(Environment.NewLine, "");