C#转VB.NET时HMACSHA256加密结果不一致问题排查
VB.NET与C# HMACSHA256结果不一致的原因及修复方案
问题出在字符串中的换行符处理差异:
- C#中字符串字面量里的
\n会被自动解析为换行符(ASCII 10,LF) - VB.NET的字符串字面量中,
\n不会被转义,会被当作两个普通字符(\和n)处理,导致待加密的原始数据和C#不一致,最终哈希结果不同
修复后的VB.NET代码如下:
Imports System Imports System.Security.Cryptography Imports System.Text Public Module Module1 Public Sub Main() ' 使用vbLf表示换行符,和C#的\n保持一致 Dim data As String = "Client-Id:MCH-1634273860130" & vbLf & "Request-Id:425944" & vbLf & "Request-Timestamp:2022-09-06T09:23:00Z" & vbLf & "Request-Target:/checkout/v1/payment" & vbLf & "Digest:9ZhZatgEJvY4c87mSwbknmfWL9+3eS18YV6xnivYIV4=" Console.WriteLine(hmacSHA256(data, "KHUvvn4fm3zXRIip0UWY")) End Sub Function hmacSHA256(ByVal data As String, ByVal key As String) As String Using hmac As HMACSHA256 = New HMACSHA256(Encoding.ASCII.GetBytes(key)) Dim a2 As Byte() = hmac.ComputeHash(Encoding.ASCII.GetBytes(data)) Dim a3 As String = Convert.ToBase64String(a2).Replace("+", "-").Replace("/", "_").Replace("=", "") Return a3 End Using End Function End Module
如果是动态生成的字符串场景,也可以通过替换实现:
Dim originalStr As String = "Client-Id:MCH-1634273860130\nRequest-Id:425944\nRequest-Timestamp:2022-09-06T09:23:00Z\nRequest-Target:/checkout/v1/payment\nDigest:9ZhZatgEJvY4c87mSwbknmfWL9+3eS18YV6xnivYIV4=" Dim data As String = originalStr.Replace("\n", vbLf)
修改后,VB.NET的待加密数据将和C#完全一致,生成的HMACSHA256结果会与C#、PHP实现匹配。
内容的提问来源于stack exchange,提问作者cloudrider
相关产品推荐
相关产品推荐

