2013-11-29 9 views
6

Ich habe eine Zeichenfolge in PHP, die in ein Byte-Array konvertiert und Hashed wird.String mit Convert.ToChar (0) Hash-Ergebnis anders als Chr (0) in PHP beim Hash Hash_Hmac

die Zeichenfolge in dem Byte-Array umgewandelt wird wie folgt aussieht:

"g". chr (0). "Kacke";

Ich muß gleichwertig Byte-Array in C#, so dass ich den gleichen Hash bekommen ..

EDIT: Hier ist das vollständige Problem, Hash resultiert, ist nicht das gleiche.

PHP

$api_secret = '5432919427bd18884fc2a6e48b65dfba48fd9a1a46e3468b52fadbc6d6b463425'; 
$data = 'payment_currency=USD&group_orders=0&count=100&nonce=1385689989977529'; 
$endpoint = '/info/orderbook'; 

$signature = hash_hmac('sha512', $endpoint . chr(0) . $data, $api_secret); 

$result = base64_encode($signature); 

C#

var apiSecret = "5432919427bd18884fc2a6e48b65dfba48fd9a1a46e3468b52fadbc6d6b463425"; 
var data = "payment_currency=USD&group_orders=0&count=100&nonce=1385689989977529"; 
var endPoint = "/info/orderbook"; 

System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 

String message = endpPoint + Convert.ToChar(0) + data; 

var hmacsha512 = new HMACSHA512(encoding.GetBytes(message)); 
var result = Convert.ToBase64String(hmacsha512.Hash); 

Ich habe versucht, verschiedene Base64-Kodierung wie:

public static string ByteToString(byte[] buff) 
    { 
     string sbinary = ""; 
     for (int i = 0; i < buff.Length; i++) 
      sbinary += buff[i].ToString("X2"); /* hex format */ 
     return sbinary; 
    } 

aber letztlich das Problem scheint die byteArray zu sein, die wegen gehasht der chr (0) php verwendet.

+0

Ich nehme an, Sie so etwas wie dies wollen: "g" + (char) 0 + "poo".Bedeutet diese Zeichenkette in PHP, dass du "g" mit null und dann mit "poo" verketten willst? –

+0

ja, das ist richtig .. dann muss ich es in eine Byte-Array konvertieren .. aber ich verstehe nicht, wie man die gleiche Art von Zeichenfolge in C# .. die Byte-Array und anschließende Hash ich daraus machen sind unterschiedlich –

+0

I beantwortet, wie dies als Byte-Array zu machen. –

Antwort

3

ich es wieder zu beantworten, weil Sie die ganze Frage geändert haben, so gibt es eine neue Lösung für Ihren ne w Frage.

Erstens wird HMACSHA512 nicht das gleiche Ergebnis wie Ihr PHP-Code geben. By the way, Ihre PHP erzeugten Hash ist:

41028bb90af31dc6e7fa100a8ceb1e220bfedf67ea723292db9a4e1c14f69c73adf30eeba61ab054cdc91c82f6be2f76dd602392be630b5e99b1f86da1460cbe 

Um das gleiche Ergebnis in C# zu machen, habe ich die BillieJeansSHA512 Klasse der Hash gleich wie PHP zu machen. Anstatt encoding.GetBytes zu verwenden, um byte [] in String zu konvertieren, habe ich die Methode ByteToString zur korrekten Konvertierung erstellt.

Ow, der folgende Code ist nicht so einfach wie PHP, aber ich fordere Sie oder irgendjemanden heraus, dies einfacher mit dem gleichen PHP-Hash zu tun! Ich trau dich, ich verdächtige dich! Lassen Sie uns auf den Code gehen:

//These are not default imports, so you need to use it 
using System.Text; 
using System.Security.Cryptography; 

//Before your actual class, you need to make your custom 512 
public class BillieJeansSHA512 : HMAC 
{ 
    public BillieJeansSHA512(byte[] key) 
    { 
     HashName = "System.Security.Cryptography.SHA512CryptoServiceProvider"; 
     HashSizeValue = 512; 
     BlockSizeValue = 128; 
     Key = (byte[])key.Clone(); 
    } 
} 

//Now, there's your actual class 
public class HelloWorld{ 


    //First, use this method to convert byte to String like a boss 
    static string ByteToString(byte[] buff) 
    { 
     string sbinary = ""; 
     for (int i = 0; i < buff.Length; i++) 
      sbinary += buff[i].ToString("x2"); /* hex format */ 
     return sbinary; 
    }  

    //Now let's get it started! 
    public static void Main(String []args){ 
     System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 

     //Your data 
     var apiSecret = "5432919427bd18884fc2a6e48b65dfba48fd9a1a46e3468b52fadbc6d6b463425"; 
     var data = "payment_currency=USD&group_orders=0&count=100&nonce=1385689989977529"; 
     var endPoint = "/info/orderbook"; 

     String message = endPoint + Convert.ToChar(0) + data; 

     //Hash will be stored here 
     String hash = ""; 

     //put your key at your custom 512 
     BillieJeansSHA512 hmacsha512 = new BillieJeansSHA512(encoding.GetBytes(apiSecret)); 
     //hash'em all 
     byte[] result = hmacsha512.ComputeHash(encoding.GetBytes(message)); 

     //convert bytes to string 
     hash = ByteToString(result); 

     //See it :) 
     Console.WriteLine(hash); 

     //Or if you using it at a web-page, this is it. 
     //Response.Write(hash) 

     //Now the easy part, convert it to base64 
     var bytesTo64 = System.Text.Encoding.UTF8.GetBytes(hash); 
     String hash64 = System.Convert.ToBase64String(bytesTo64); 
    } 
} 

... na ja, das ist es. String hash haben den gleichen Hash wie PHP tut:

41028bb90af31dc6e7fa100a8ceb1e220bfedf67ea723292db9a4e1c14f69c73adf30eeba61ab054cdc91c82f6be2f76dd602392be630b5e99b1f86da1460cbe 

und String hash64 denselben codierten base64 Wert hat, dass PHP funktioniert:

NDEwMjhiYjkwYWYzMWRjNmU3ZmExMDBhOGNlYjFlMjIwYmZlZGY2N2VhNzIzMjkyZGI5YTRlMWMxNGY2OWM3M2FkZjMwZWViYTYxYWIwNTRjZGM5MWM4MmY2YmUyZjc2ZGQ2MDIzOTJiZTYzMGI1ZTk5YjFmODZkYTE0NjBjYmU= 
+1

Ich möchte Ihnen aufrichtig danken! Warum musstest du die benutzerdefinierte 512 erstellen? Die Blockgröße ist in PHP anders oder etwas ?? Mann .. ich habe mir die Haare ausgerissen. Vielen Dank! –

+2

Ja! das war hart, ich habe mindestens 3 stunden damit verbracht !! Viel Spaß jetzt :) –

+1

@WagnerLeonardi Du hast gerade meinen Arsch gerettet. Vielen Dank für das Posten. –

0

Sie können die Methode Convert.ToChar(Int32) verwenden, um Unicode-Werte als Zeichen darzustellen.

Verbrauch: "g" + Convert.ToChar(0) + "poo"

1

Er fragte auch, es als byte Array, dann ist es das wichtigste müssen, weil char Byte Konvertierung verwenden:

//Conversion object 
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 

//Your any String text 
String stringText = "g" + Convert.ToChar(0) + "poo"; 

//Convert to the wanted byte array 
byte[] byteArray = encoding.GetBytes(stringText); 

Sie können auch die gleiche Sache in einer einzigen Zeile zu tun wenn Sie bevorzugen :)

byte[] byteArray = new System.Text.UTF8Encoding().GetBytes("g" + Convert.ToChar(0) + "poo"); 
+0

Wenn ich hash, ist das Ergebnis anders als wenn das "g" + Convert.ToChar (0) + "poo" in PHP hashed –

+0

Nun, das ist nicht die gleiche Frage. Ich habe dafür eine neue Antwort gegeben, schau es dir an. –