Мне дали кусок кода, который описывает «алгоритм» для генерации токенов. Этот код написан на 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, но мне кажется, что я недостаточно опытен / умен, чтобы понять, что там происходит. Если есть простое решение, я буду очень признателен.
Вы будете пнуть себя, когда поймете, насколько просто то, что он на самом деле делает.
<?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 такой сложный, я понятия не имею.
Похоже, вы получили ответ о том, как сделать это в 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