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.
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
@KyleK Er möchte einfach wissen, was dieser mittlere Teil des Java-Codes tut. Schau dir seine Inline-Kommentare an. – CodeGodie
@KyleK, es gibt viele Gründe für einen Grund. Reading hilft;) – snh