JavaScript中crypto.digest('hex')作用解析及C#等效实现咨询
JavaScript
digest('hex') 作用说明及C#等效实现 一、digest('hex') 的作用
你理解的没错,这段JS代码是用SHA1算法生成HMAC,但前面的createHmac和update只是完成了哈希计算,得到的是原始二进制字节数组——这种数据不可读,也不方便在文本场景(比如HTTP头部、日志)中传输或存储。
digest('hex')的核心作用就是:将生成的二进制HMAC哈希值,编码为小写十六进制字符串。每个字节会被转换成两个十六进制字符(比如字节0x1F会变成"1f"),这样得到的字符串既紧凑又易于处理。
二、C# 等效实现
下面是和这段JS代码完全等价的C#实现,关键要保证编码(默认用UTF-8,和JS的默认行为一致)、哈希算法、十六进制编码的大小写都匹配:
using System; using System.Security.Cryptography; using System.Text; public class HmacHelper { public static string ComputeHmacSha1(string requestBody, string secret) { // 将密钥转换为UTF-8字节数组,与JS保持一致 byte[] secretBytes = Encoding.UTF8.GetBytes(secret); using (HMACSHA1 hmacSha1 = new HMACSHA1(secretBytes)) { // 将请求体转换为UTF-8字节数组 byte[] bodyBytes = Encoding.UTF8.GetBytes(requestBody); // 计算HMAC-SHA1哈希值 byte[] hashBytes = hmacSha1.ComputeHash(bodyBytes); // 将二进制哈希转换为小写十六进制字符串 StringBuilder hexBuilder = new StringBuilder(); foreach (byte b in hashBytes) { hexBuilder.Append(b.ToString("x2")); } return hexBuilder.ToString(); } } }
注意事项
- 如果你的
request.body是二进制数据(而非文本),需要直接传入对应的字节数组,而不是用Encoding.UTF8.GetBytes转换。 - JS的
digest('hex')生成的是小写字符串,所以C#中用"x2"格式符(小写),如果需要大写可以换成"X2"。
内容的提问来源于stack exchange,提问作者Aniruddha
相关产品推荐
相关产品推荐

