Visual Basic 2010 HMAC SHA1

У меня есть код для преобразования строки в шифрование hmac sha1. Однако я не могу заставить его работать. Вот мой код:

Public Shared Function HashString(ByVal StringToHash As String) As String
    Dim myEncoder As New System.Text.UTF32Encoding
    Dim Key() As Byte = myEncoder.GetBytes("thisismykey")
    Dim Text() As Byte = myEncoder.GetBytes(StringToHash)
    Dim myHMACSHA1 As New System.Security.Cryptography.HMACSHA1(Key)
    Dim HashCode As Byte() = myHMACSHA1.ComputeHash(Text)
    Return Convert.ToBase64String(HashCode)
End Function

Когда я запускаю функцию следующим образом:

TextBox1.Text = HashString("thisismystring")

Я получаю 04p075DKS2Suw9jGQKC5Q7mYjvI= в текстовом поле. Что я должен получить, так это c2bc9dd26b76d5b61a40ac788220eef0b26cb2bb

Кто-нибудь знает, как это решить? Пожалуйста помоги :)


person Rasmus    schedule 22.09.2011    source источник


Ответы (3)


Я нашел решение. Я просто преобразовал байт в строку, сделал его ниже и заменил - ничего. Смотрите мой код ниже :)

    Public Function HashString(ByVal StringToHash As String, ByVal HachKey As String) As String
    Dim myEncoder As New System.Text.UTF8Encoding
    Dim Key() As Byte = myEncoder.GetBytes(HachKey)
    Dim Text() As Byte = myEncoder.GetBytes(StringToHash)
    Dim myHMACSHA1 As New System.Security.Cryptography.HMACSHA1(Key)
    Dim HashCode As Byte() = myHMACSHA1.ComputeHash(Text)
    Dim hash As String = Replace(BitConverter.ToString(HashCode), "-", "")
    Return hash.ToLower
End Function

Пример использования:

TextBox1.Text = HashString("thisismystring", "thisismykey")

Спасибо за вашу помощь :)

person Rasmus    schedule 23.09.2011

Ваш 04p075DKS2Suw9jGQKC5Q7mYjvI= находится в Base64. Ваш c2bc9dd26b76d5b61a40ac788220eef0b26cb2bb находится в шестнадцатеричном формате. Вам нужно преобразовать один в другой формат, чтобы вы могли их правильно сравнить.

ETA: я проверил, они не совпадают, ваш шестнадцатеричный код дает мне wryd0mt21bYaQKx4giDu8LJssrs= в Base64. Я подозреваю, что проблема может заключаться в использовании кодировки UTF32, это очень необычно. UTF8 или UTF16 встречаются гораздо чаще. Сначала попробуйте UTF8.

person rossum    schedule 22.09.2011

коррекция depuis maj EXCEL,

pour faire du mD5, il faut copier coller le code ci-dessous

Option Explicit
Private Const HP_HASHVAL = 2
Private Const HP_HASHSIZE = 4
Private Const PROV_RSA_FULL  As Long = 1
Private Const ALG_CLASS_HASH = 32768
Private Const ALG_TYPE_ANY = 0
Private Const ALG_SID_MD2 = 1
Private Const ALG_SID_MD4 = 2
Private Const ALG_SID_MD5 = 3
Private Const ALG_SID_SHA1 = 4
Private Const CRYPT_NEWKEYSET = &H8
Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000

Enum HashAlgorithm
    MD2 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD2
    MD4 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD4
    MD5 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5
    SHA1 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1
End Enum

Private Declare Function CryptAcquireContext Lib "Advapi32" Alias "CryptAcquireContextA" (ByRef phProv As Long, ByVal pszContainer As String, ByVal pszProvider As String, ByVal dwProvType As Long, ByVal dwFlags As Long) As Long
Private Declare Function CryptReleaseContext Lib "Advapi32" (ByVal hProv As Long, ByVal dwFlags As Long) As Long
Private Declare Function CryptCreateHash Lib "Advapi32" (ByVal hProv As Long, ByVal Algid As Long, ByVal hKey As Long, ByVal dwFlags As Long, ByRef phHash As Long) As Long
Private Declare Function CryptDestroyHash Lib "Advapi32" (ByVal hHash As Long) As Long
Private Declare Function CryptHashData Lib "Advapi32" (ByVal hHash As Long, pbData As Any, ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long
Private Declare Function CryptGetHashParam Lib "Advapi32" (ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, pdwDataLen As Long, ByVal dwFlags As Long) As Long

Public Function HashString(ByVal Str As String, Optional ByVal Algorithm As HashAlgorithm = MD5) As String
On Error Resume Next
Dim hCtx As Long
Dim hHash As Long
Dim lRes As Long
Dim lLen As Long
Dim lIdx As Long
Dim abData() As Byte
lRes = CryptAcquireContext(hCtx, vbNullString, vbNullString, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)
If lRes <> 0 Then
    lRes = CryptCreateHash(hCtx, Algorithm, 0, 0, hHash)
    If lRes <> 0 Then
        lRes = CryptHashData(hHash, ByVal Str, Len(Str), 0)
        If lRes <> 0 Then
            lRes = CryptGetHashParam(hHash, HP_HASHSIZE, lLen, 4, 0)
            If lRes <> 0 Then
                ReDim abData(0 To lLen - 1)
                lRes = CryptGetHashParam(hHash, HP_HASHVAL, abData(0), lLen, 0)
                If lRes <> 0 Then
                    For lIdx = 0 To UBound(abData)
                        HashString = HashString & Right$("0" & Hex$(abData(lIdx)), 2)
                    Next
                End If
            End If
        End If
        CryptDestroyHash hHash
    End If

End If
CryptReleaseContext hCtx, 0
If lRes = 0 Then
    MsgBox Err.LastDllError
End If
End Function
person frixo    schedule 19.11.2012
comment
Добро пожаловать в Stack Overflow! Пожалуйста, используйте английский язык, чтобы все вас поняли. - person bytecode77; 19.11.2012
comment
Да, да.. используйте английский язык. Как ты смеешь. Мы, американцы, чертовски ленивы, чтобы использовать один из многих доступных инструментов для перевода с французского. - person Andy; 04.08.2016
comment
у меня нет проблем с его французским - person Chillzy; 21.01.2018