Какова будет эквивалентная версия PHP следующего исходного кода хэширования nodejs md5? - PullRequest
0 голосов
/ 24 мая 2018

Я перехожу с nodejs на PHP и не могу получить аналогичный выходной хэш-дайджест md5 для приведенного ниже фрагмента с тем же вводом. Возможно, что-то мне не хватает.

var md5sum = crypto.createHash('md5');
md5sum.update(new Buffer(str, 'binary'));
md5_result = md5sum.digest('hex');

Спасибозаранее за вашу помощь !!! Кстати, моя версия nodejs - 10.1.0, а версия npm - 5.6.0.И для тех, кто спрашивает, этот эквивалент исходного кода не md5($str), и это не мой код, я просто конвертирую его.Например, для следующего ввода 42b86318d761e13ef90c126c3e060582¤3¤724039¤1 получен дайджест 9860bd2248c069c7b65045917c215596.

Я просто попытался запустить следующий фрагмент на https://www.tutorialspoint.com/execute_nodejs_online.php, с учетом ваших предложений, но они не работают:

const crypto = require('crypto');
var str = "42b86318d761e13ef90c126c3e060582¤3¤724039¤1";
var md5sum = crypto.createHash('md5');
md5sum.update(new Buffer(str, 'binary'));
const md5_result = md5sum.digest('hex');
const md5 = crypto.createHash('md5').update(str).digest('hex');
const expected_digest = "9860bd2248c069c7b65045917c215596";
console.log("original version digest:" + md5_result);
console.log("proposed equivalent digest:" + md5);
console.log("expected digest:" + expected_digest);

На этом сайте я получаю: original version digest:9860bd2248c069c7b65045917c215596 proposed equivalent digest:b8ee918f782fe7135b25c1fa59339094 expected digest:9860bd2248c069c7b65045917c215596

Другие сайты, такие как https://www.katacoda.com/courses/nodejs/playground,https://repl.it/, https://www.jdoodle.com/execute-nodejs-online поддерживают мою заявку (т. Е. Дайджест md5 равен 9860bd2248c069c7b65045917c215596), однако, пока этот сайт http://rextester.com/l/nodejs_online_compiler выводит то, что некоторые из вас получили (то есть b8ee918f782fe7135b25c1fa59339094).Я уже говорил, пожалуйста, помогите мне найти PHP-ЭКВИВАЛЕНТНУЮ версию первого фрагмента кода nodejs.

1 Ответ

0 голосов
/ 24 мая 2018

Вы не должны использовать: new Buffer(str, 'binary') просто:

const md5 = crypto
    .createHash('md5')
    .update(string)
    .digest('hex');

Используя это, вы получите тот же вывод с php md5, linux md5sum и node.

Для вашего ввода: 42b86318d761e13ef90c126c3e060582¤3¤724039¤1 следующие команды будут печатать одинаково:

md5sum

echo -n "42b86318d761e13ef90c126c3e060582¤3¤724039¤1" | md5sum

PHP

echo md5("42b86318d761e13ef90c126c3e060582¤3¤724039¤1");

Узел

require('crypto')
        .createHash('md5')
        .update("42b86318d761e13ef90c126c3e060582¤3¤724039¤1")
        .digest('hex');

Все три будут выводить: b8ee918f782fe7135b25c1fa59339094

ПРИМЕЧАНИЕ:

new Buffer устарело, вместо этого следует использовать Buffer.from.

Другие сайты, такие как https://www.katacoda.com/courses/nodejs/playground,https://repl.it/, https://www.jdoodle.com/execute-nodejs-online поддерживают мою заявку (т. Е. Дайджест md5 равен 9860bd2248c069c7b65045917c215596)

Они не поддерживают вашу заявку , вы выполняете один и тот же код, что неверно, во многих различных средах node.js.Конечно, каждая среда Node.js будет печатать этот вывод для вашего кода, что не делает его правильным.


Поскольку вы не можете изменить код и хотите получить эквивалент PHP, вот оноis:

function utf8_char_code_at($str, $index) {
    $char = mb_substr($str, $index, 1, 'UTF-8');

    if (mb_check_encoding($char, 'UTF-8')) {
        $ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8');
        return hexdec(bin2hex($ret));
    } else {
        return null;
    }
}

function myMD5($str) {

     $tmp = "";

     for($i = 0; $i < mb_strlen($str); $i++)
        $tmp .= bin2hex(chr(utf8_char_code_at($str, $i)));

     return md5(hex2bin($tmp));
}

echo myMD5($string);

utf8_char_code_at взято из: https://stackoverflow.com/a/18499265/1119863

Будет выведено: 9860bd2248c069c7b65045917c215596 То же, что и ваш фрагмент узла.

...