从JavaScript迁移至C# .NET 如何正确实现HMACSHA1加密
问题原因及解决方案
你的C#代码有三处核心错误导致结果不一致,分别是:
- 密钥值错误:JS代码中密钥为
dBV2PdhYMnruSMb,你C#代码中多写了末尾的等号,变成了dBV2PdhYMnruSMb= - 密钥编码方式错误:crypto-js的
HmacSHA1方法默认将传入的密钥字符串按UTF-8编码转为字节数组,你C#代码错误使用Convert.FromBase64String处理密钥,应该直接用UTF-8编码转换密钥 - 结果输出格式错误:JS中
toString()输出的是小写十六进制字符串,你C#代码错误将哈希结果转为Base64格式,应该转为小写十六进制字符串
修正后的C#代码
using System; using System.Security.Cryptography; using System.Text; class Program { static void Main() { string signSession = "application_id=3610&auth_key=aDRceQyTXSYEdJU&nonce=6304033672×tamp=1623098533&user[login]=john@mail.com&user[password]=123456789"; // 密钥和JS保持完全一致,去掉多余的等号 string key = "dBV2PdhYMnruSMb"; byte[] signatureBytes = Encoding.UTF8.GetBytes(signSession); // 密钥直接用UTF-8转字节数组,不要用Base64解码 byte[] keyBytes = Encoding.UTF8.GetBytes(key); using(HMACSHA1 hmac = new HMACSHA1(keyBytes)) { byte[] hashBytes = hmac.ComputeHash(signatureBytes); // 将哈希字节转为小写十六进制字符串,不要转Base64 string hexSignature = BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); Console.WriteLine(hexSignature); } } }
运行上述代码输出结果为467280c4cb82fc97bd04c51d8a846446ad6e82e1,和JS运行结果完全一致。
内容的提问来源于stack exchange,提问作者championq45
相关产品推荐
相关产品推荐

