2016-03-25 9 views
1

Ich habe ein Stück Code gegeben, der einen "Algorithmus" für die Token-Generierung beschreibt. Dieser Code ist in Java geschrieben und funktioniert so wie er ist. Der angegebene Java-Code muss genau so bleiben wie, aber meine Anforderung ist es, denselben "Algorithmus" innerhalb einer PHP-Anwendung zu verwenden, und es fällt mir schwer, das gleiche Ergebnis zu erhalten.Java zu PHP Code Unterschied

Java-Code:

public static void main(String[] args) 
     throws 
     UnsupportedEncodingException, 
     NoSuchAlgorithmException { 

    // Let's stick to a fixed date for this SO question 
    //DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmm"); 
    //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 
    //String date = dateFormat.format(new Date()); 
    String date = "201603251605"; 
    String name = "some_dummy_data_one"; 
    String size = "some_dummy_data_two"; 

    // MD5 'name' 
    MessageDigest md5 = MessageDigest.getInstance("MD5"); 
    md5.update(name.getBytes()); 
    byte[] md5name = md5.digest(); 

    // What happens here is beyond me - How would one translate this to PHP? 
    byte[] sizeBytes = (size + date).getBytes(); 
    byte[] tokenBytes = new byte[md5name.length + sizeBytes.length]; 

    System.arraycopy(sizeBytes, 0, tokenBytes, 0, sizeBytes.length); 
    System.arraycopy(md5name, 0, tokenBytes, sizeBytes.length, md5name.length); 

    // SHA256 
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); 
    sha256.update(tokenBytes); 
    byte[] tokenHash = sha256.digest(); 

    System.out.println(Base64.getEncoder().encodeToString(tokenHash)); 
} 

Diese Drucke:

LsPw/5/4uKmQfVaU1LRASxG89mgMt7OxX + h7JGRo1ZU =

Letzten Endes und im Idealfall würde ich eine schnelle Art und Weise lieben, nur um das gleiche Ergebnis mit PHP-Code, aber ich habe den Drang zu verstehen, was vor sich geht, anstatt nur das gewünschte Ergebnis zu erreichen.

Jetzt zu versuchen, anzuzeigen, dass ich mindestens ein wenig Hausaufgaben gemacht habe und ich nicht nur jemanden suche, um meine Arbeit für mich zu tun, bis die MD5 Umwandlung der Zeichenfolgen, Ich habe es geschafft, ein zu bekommen identische base64 codiert SHA256 Saite einer Einzelsaite den mittleren Teil des Codes Überspringen die 'System.arraycopy' Bit enthält:

Java-Code:

public static void main(String[] args) 
     throws 
     UnsupportedEncodingException, 
     NoSuchAlgorithmException { 

    String date = "201603251605"; 

    // MD5 'name' 
    MessageDigest md5 = MessageDigest.getInstance("MD5"); 
    md5.update(date.getBytes()); 
    byte[] md5Date = md5.digest(); 

    // SHA256 
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); 
    sha256.update(md5Date); 
    byte[] tokenHash = sha256.digest(); 

    System.out.println(Base64.getEncoder().encodeToString(tokenHash)); 
} 

PHP-Code:

private function generateToken() { 
    $md5Date = md5("201603251605", true);   
    $shaString = hash("sha256", $md5Date, true); 

    return base64_encode($shaString); 
} 

Java Ausgabe:

mEkkRlBkwyoWFMsA + v/hp/m9sD6FdzM6LZHIORtr260 =

PHP Ausgabe:

mEkkRlBkwyoWFMsA + v/hp/m9sD6FdzM6LZHIORtr260 =

Also nach obigem, mein MD5 und sha einer einzelnen Saite funktioniert gut, aber das ist nicht das Problem. Das Problem besteht darin zu verstehen, was passiert, wenn mehrere Zeichenfolgen definiert und im Java-Code zusammengemischt werden. Warum scheint es übermäßig kompliziert zu sein und gibt es eine einfache Möglichkeit, dies in PHP zu tun?

Könnte jemand bitte erklären, was zwischen den Generationen MD5 und SHA256 passiert, damit ich es in PHP-Code übersetzen kann? Ich habe versucht, in der Dokumentation von Java System.arrayCopy nachzulesen, aber ich habe das Gefühl, dass ich nicht erfahren genug bin, um zu verstehen, was dort vor sich geht. Wenn es eine einfache Lösung dafür gibt, würde ich es sehr schätzen.

+0

Verstehen Sie die Frage wirklich nicht. Obwohl du viele Worte hast. Sie scheinen eine Frage zu stellen und sie dann zu lösen. Also, was ist die wirkliche Frage? – KyleK

+2

@KyleK Er möchte einfach wissen, was dieser mittlere Teil des Java-Codes tut. Schau dir seine Inline-Kommentare an. – CodeGodie

+0

@KyleK, es gibt viele Gründe für einen Grund. Reading hilft;) – snh

Antwort

1

Sie treten sich selbst, wenn Sie erkennen, wie einfach es ist, was es tatsächlich macht.

<?php 
$date = "201603251605"; 
$name = "some_dummy_data_one"; 
$size = "some_dummy_data_two"; 

$md5_name = md5($name, true); 

$token_bytes = $size.$date.$md5_name; 

$token_hash = hash("sha256", $token_bytes, true); 

echo base64_encode($token_hash); 

arraycopy ist nur eine ziemlich verwirrend Weise size von Anhängen, date und md5name. Warum der Java-Code so kompliziert ist, weiß ich nicht.

+1

Ich bin OP auf meinem aktuellen Konto - nicht ganz sicher, warum ich in einem neuen Konto angemeldet war. Du hast Recht - und ich habe mir zu Recht eine große Gesichtspalme gegeben. Vielen Dank! – snh

1

Klingt wie du hast die Antwort dafür, wie man es in PHP macht. Der Java-Code macht im Grunde dasselbe. Hier ist, was es macht ...

// This concatenates size+date and the md5 hash, and then creates a SHA-256 hash from that value. 

byte[] sizeBytes = (size + date).getBytes(); //Get byte array of size and date concatenation 
byte[] tokenBytes = new byte[md5name.length + sizeBytes.length]; //Create the right size byte array to fit md5 and size+date 

System.arraycopy(sizeBytes, 0, tokenBytes, 0, sizeBytes.length); // copies the size+date byte array into the first part of the token bytes byte array. 
System.arraycopy(md5name, 0, tokenBytes, sizeBytes.length, md5name.length); //concatenates the md5 hash and size+bytes into the tokenBytes array 

// SHA256 
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");//Get the SHA-256 algorithm instance 
sha256.update(tokenBytes); // give it a value to hash 
byte[] tokenHash = sha256.digest(); // create SHA-256 hash from token bytes 
+0

Danke für die zusätzlichen Informationen Dustin. Sehen Sie vielleicht einen Grund dafür, warum diese Route genommen wurde, anstatt nur die Strings und die MD5 als String zu verketten? Es scheint, als ob der Entwickler aus dem Weg gegangen ist, um es unnötig kompliziert zu machen, IMO. – snh

+0

Wenn ich raten müsste, würde ich irgendwann sagen, dass sie den Hash mit einem sichereren "zufälligen" Wert anstelle einer Größe und Datumszeichenkette säen und dann einen statischen Zeichenfolgenwert für vielleicht Testzwecke benötigen? Wenn sie vorher etwas Sichereres verwenden würden, würden sie Byte-Werte verwenden wollen. Alles, was Sie mit diesem Code benötigen, um den Token-Wert zu lernen, sind Größe, Name und Datum. – Dustin