Разница в коде Java для PHP

Мне дали кусок кода, который описывает «алгоритм» для генерации токенов. Этот код написан на Java и работает как есть. Данный Java-код должен оставаться точно таким же, как есть, однако мое требование — использовать тот же «алгоритм», который используется в приложении PHP, и мне трудно получить тот же результат.

Java-код:

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));
}

Это печатает:

LsPw / 5 / 4uKmQfVaU1LRASxG89mgMt7OxX + h7JGRo1ZU =

В конечном итоге и в идеале я хотел бы получить быстрый способ получить тот же результат с помощью PHP-кода, но я стремлюсь понять, что происходит, вместо того, чтобы просто достичь желаемого результата.

Теперь, чтобы попытаться показать, что я, по крайней мере, сделал небольшую домашнюю работу, и я не просто ищу кого-то, кто сделает мою работу за меня, вплоть до преобразования строк в MD5, Мне удалось получить идентичную строку в кодировке base64 SHA256 одиночная строка пропуская средний кусок кода содержащий бит System.arrayCopy:

Java-код:

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:

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

return base64_encode($shaString);
}

Выход Java:

mEkkRlBkwyoWFMsA + V / л.с / m9sD6FdzM6LZHIORtr260 =

Выход PHP:

mEkkRlBkwyoWFMsA + V / л.с / m9sD6FdzM6LZHIORtr260 =

Таким образом, согласно вышесказанному, мои md5 и sha одной строки работают нормально, но это не проблема. Проблема заключается в понимании того, что происходит, когда несколько строк определены и смешиваются в коде Java. Почему это кажется слишком сложным и существует ли простой способ сделать это в PHP?

Может кто-нибудь объяснить, что происходит между поколениями MD5 и SHA256, чтобы я мог перевести его в код PHP? Я попытался прочитать документацию по Java System.arrayCopy, но мне кажется, что я недостаточно опытен / умен, чтобы понять, что там происходит. Если есть простое решение, я буду очень признателен.

1

Решение

Вы будете пнуть себя, когда поймете, насколько просто то, что он на самом деле делает.

<?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 это просто довольно запутанный способ добавления size, date а также md5name, Почему код Java такой сложный, я понятия не имею.

1

Другие решения

Похоже, вы получили ответ о том, как сделать это в PHP. Код Java делает в основном то же самое. Вот что он делает …

// 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
1

По вопросам рекламы [email protected]