Avatar billede kak Nybegynder
07. november 2012 - 11:18 Der er 14 kommentarer og
1 løsning

HMAC i .Net kontra JavaScript

Jeg skal implementere bruges af HMAC (SHA-256) i forbindelse med betaling via DIBS.

Oprindeligt fandt jeg frem til denne funktion, som jeg brugte:

-----------------------------------------------

Imports System.Security.Cryptography
Partial Class Payment
    Inherits System.Web.UI.Page

    Public Function DoHmac(ByVal textToHash, ByVal key)

          'secret key shared by sender and receiver.

        Dim secretkey As Byte() = New [Byte](63) {}

        Dim result As String = Nothing




        secretkey = System.Text.UTF8Encoding.UTF8.GetBytes(key)



        ' Initialize the keyed hash object.

        Dim myhmacsha256 As New HMACSHA256(secretkey)



        ' Compute the hash of the text.

        Dim bytedText As Byte() = System.Text.UTF8Encoding.UTF8.GetBytes(textToHash)



        Dim hashValue As Byte() = myhmacsha256.ComputeHash(bytedText)



        'Base-64 Encode the results and strip off ending '==', if it exists

        result = Convert.ToBase64String(hashValue).TrimEnd("=".ToCharArray())



        'set response

        Return result

    End Function

End Class

-----------------------------------------------

Problemet var, at DIBS systemet påstod at den værdi jeg fik, ikke var korrekt. Jeg fandt flere .Net online-generatorer på nettet, men de gav alle det samme resultat.

Så fandt jeg et Javascript som kunne gøre det samme, og dette retunerer den værdi, som DIBS også kommer frem til.

Det er jo ok, men jeg får så problemer, når jeg skal validere returværdierne fra DIBS, da Javascriptet kører "for sent" til at jeg kan bruge resultatet derfra.

Mit spørgsmål er, hvor .Net og Javascript ikke danne samme streng, når det nu er samme data og key jeg sender til de to, og de begge skulle bruge SHA-256?

Jeg vil også nævne, at jeg har haft kontakt med DIBS supporten, men det ikke har gjort, at jeg er kommet nærmere en forklaring, eller en løsning.
Avatar billede softspot Forsker
07. november 2012 - 11:33 #1
Er den HMAC som JS genererer også Base64?
Avatar billede kak Nybegynder
07. november 2012 - 11:40 #2
Godt spørgsmål! Det er denne her: code.google.com/p/crypto-js

Den stemmer jo med det, som DIBS forventer. Så hvis den ikke er base64, kan jeg så tilpasse .Net til det?
Avatar billede softspot Forsker
07. november 2012 - 12:01 #3
Jeg vil tro du skal undlade at konvertere til Bas64 i denne linje:

result = Convert.ToBase64String(hashValue).TrimEnd("=".ToCharArray())

Men blot konvertere til en normal streng...
Avatar billede kak Nybegynder
07. november 2012 - 12:34 #4
Så returnerer den blot dette her:

System.Byte[]
Avatar billede softspot Forsker
07. november 2012 - 13:05 #5
Du skal formegentlig foretage en konvertering via encoding á la:

result = System.Text.UTF8Encoding.UTF8.GetString(hashvalue)

Du skal muligvis bruge ASCII i stedet for UTF8...
Avatar billede kak Nybegynder
07. november 2012 - 13:20 #6
Det virker desværre heller ikke. ASCII returnerer dette her:

V??? ????W??)?mqKK?_?J?~?a??

UTF8 er en smule anderledes, men ikke meget.
Avatar billede softspot Forsker
07. november 2012 - 15:29 #7
Hvordan kalder du googles JS-converter?
Avatar billede kak Nybegynder
09. november 2012 - 08:13 #8
Jeg har hentet en js-fil, som ligger lokalt. Jeg kan deværre ikke huske, hvor jeg fandt den.
Avatar billede softspot Forsker
09. november 2012 - 08:22 #9
Jeg tænker nu mere på selve kaldet til den JS-funktion, der producerer koden, dvs. du skal klippe fra din kode og plastre det ind her i tråden :-)

Jeg tænker på, om der evt. kunne være nogle standardinstillinger forbundet med kodegenereringen, som din C#-version skal efterleve for at producere det samme resultat.
Avatar billede kak Nybegynder
09. november 2012 - 09:13 #10
:-)

Den kaldes sådan her:

CryptoJS.HmacSHA256(strHMACvalues, strHMACkey);
Avatar billede softspot Forsker
09. november 2012 - 10:56 #11
Hvad sker der efterfølgende med den hash du får ud af det kald (vis også her, gerne noget kode :-))?

Det funktionskald afleverer, såvidt jeg kan forstå dokumentationen, ikke en Base64-streng, men et WordArray og det er ikke umiddelbart sikkert at .NET's metode afleverer i det samme format...

Du kunne evt. prøve at kalde alert(hash.toString(CryptoJS.enc.Base64)); for at se om koden så matcher den som din oprindelige VB-kode returnerede (den hvor du stadig omsætter til Base64). Hvis det er tilfældet, så er det jo nok det sidste trin i din process der er forskellig.
Avatar billede kak Nybegynder
09. november 2012 - 12:46 #12
Ved at køre....
CryptoJS.HmacSHA256("loremipsumdolor", "123456");
... får jeg dette retur:
0eef8c3db5387034be254372ebaa16361d752a1e3b7d0b2b7e1079323a85b4fb

Det ændrer sig ikke, selvom jeg bruger hash.toString(CryptoJS.enc.Base64)

.Net funktionen returnerer denne her...
Du+MPbU4cDS+JUNy66oWNh11Kh47fQsrfhB5MjqFtPs

Jeg kan selvfølgelig godt se, at den fra JS er hex, mens den fra .Net ikke er. Men jeg har prøvet at konvertere den fra .Net, og det er stadig ikke det samme.
Avatar billede softspot Forsker
09. november 2012 - 13:06 #13
Prøv evt. at kigge lidt på denne tråd på StackOverflow: http://stackoverflow.com/questions/12049395/ignore-zero-in-calculate-hash-by-hmacsha256

Jeg er slet ikke sikker på at dette hjælper dig, men der er da nogle kodeeksempler, som tager udgangspunkt i de samme forudsætninger som dine, så der burde være en chance for, at du kunne finde en løsning med udgangpunkt i SO-tråden...
Avatar billede kak Nybegynder
09. november 2012 - 14:59 #14
Tak for det, jeg prøver at kigge på det! Vil du oprette et svar, så du kan få point!
Avatar billede softspot Forsker
09. november 2012 - 15:05 #15
Velbekomme :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester