You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:25:18