首页 > 解决方案 > 什么是 Visual Basic .Net 上的等效 hash_hmac PHP

问题描述

我正在将我在 PHP 上获得的 hash_hmac 代码重写为 VB.Net。我需要在 PHP 和 VB.Net 中生成相同的结果。

这是 PHP 上的 hash_hmac 代码:

$data = urlencode('2019-07-21T15:30:57.465Z');
$data = '_ts='.$data;
$signatureSecretKey = "secrete";
$hash = hash_hmac('sha256',$data,$signatureSecretKey,true);
$signature = base64_encode($hash);
echo $signature;

结果显示:

upLQYFI3pI2m9Pu5fyiobpvCRhTvRmEyxrVDrdJOYG4=

这是我在 VB 上的代码:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim _ts, data, signature, secrete, hash
        secrete = "secret"
        _ts = DateTime.Now.ToString("2019-07-21T15:30:57.465Z")
        data = "_ts=" & HttpUtility.UrlEncode(_ts)
        signature = Encrypt(data, secrete)
        TextBox1.Text = signature
    End Sub

    Public Function Encrypt(Content As String, Secret As String) As String
        Dim kode As New System.Text.ASCIIEncoding()
        Dim getkode As Byte() = kode.GetBytes(Secret)
        Dim cont As Byte() = kode.GetBytes(Content)
        Dim hmcKu As New HMACSHA256(getkode)
        Dim HashCode As Byte() = hmcKu.ComputeHash(cont)
        Return Convert.ToBase64String(HashCode)
    End Function

我的代码结果是:

892q1ArPxIqrX48PQegliVql703V2fcipb5A08F053o=

您可以看到我的 VB 代码与 PHP 生成不同的结果。我几乎尝试了从互联网上获得的所有方法,但结果总是不同。那么,什么是 VB 上 PHP 的等效 hash_hmac 以及获得相同结果的正确方法是什么?请帮忙?

标签: vb.nethash

解决方案


我从 fb 社区找到了解决方案。这是这种情况的确切解决方案:

Imports System.IO
Imports System.Text
Imports System.Security.Cryptography
Imports System.Text.RegularExpressions

Public Class Form1
    Private Shared DES As New TripleDESCryptoServiceProvider
    Private Shared MD5 As New MD5CryptoServiceProvider
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim _ts, data, signature, secrete
        secrete = "secret"
        _ts = DateTime.Now.ToUniversalTime.ToString("yyyy-MM-dd\THH:mm:ss.fff\Z")
        data = "_ts=" & HttpUtility.UrlEncode(_ts)
        Dim reg = New Regex("%[a-f0-9]{2}")
        data = reg.Replace(data, Function(m) m.Value.ToUpperInvariant())
        signature = Encrypt(data, secrete)
        TextBox1.Text = signature
    End Sub

    Public Function Encrypt(Content As String, Secret As String) As String
        Try
            Dim kode As New System.Text.ASCIIEncoding()
            Dim getkode As Byte() = kode.GetBytes(Secret)
            Dim cont As Byte() = kode.GetBytes(Content)
            Dim hmcKu As New HMACSHA256(getkode)
            Dim HashCode As Byte() = hmcKu.ComputeHash(cont)
            Return Convert.ToBase64String(HashCode)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Function
End Class


推荐阅读