У меня проблемы с преобразованием следующего кода из Perl в PHP. В частности, у меня возникли проблемы с этим разделом, так как я понятия не имею, что здесь происходит:
sub md5sum($) {
my @ib = unpack("C*", shift);
my $encstr = join("", map {sprintf('\%3.3o', $_)} @ib);
my ($out) = split(/ /, `printf '$encstr' | md5sum`);
return $out;
}
Главное, на что я обращаюсь за помощью, это то, что "C*", shift
сделать в распаковке, что происходит в join
часть, и что делает | md5sum
сделать в конце split
В этом разделе ниже, я думаю, у меня тоже проблемы. Мой главный вопрос здесь для пакета php, я указываю H32, или просто H?
$hexchal = pack "H32", $challenge;
$newchal = pack "H32", md5sum($hexchal . $uamsecret);
my $passvar = "";
$passvar = md5sum("\0" . $password . $newchal);
Вот то, что я пробовал в разделе выше, но $ hexchal не совпадают
$hexchal = pack("H32", $challenge);
$newchal = md5($hexchal.$uamsecret);
$passvar = md5("\0".$password.$newchal);
В любом случае, любая помощь будет принята с благодарностью!
Код выглядит немного смущающим для меня, но вот моя интерпретация:
<1> sub md5sum($) {
<2> my @ib = unpack("C*", shift);
<3> my $encstr = join("", map {sprintf('\%3.3o', $_)} @ib);
<4> my ($out) = split(/ /, `printf '$encstr' | md5sum`);
<5> return $out;
}
"C*", shift
на <2> преобразует строку в массив чисел, который затем объединяется для формирования новой строки, выполняя форматирование sprintf для каждого числа. Результирующая строка затем используется в качестве параметра при выполнении командной строки printf '$encstring' | md5sum
и возвращение захватывается и возвращается. Эффективно это возвращается с md5sum (как возвращено командой shell).
в качестве примера вызов функции с именем пользователя в качестве параметра приведет к тому, что командная строка будет построена как printf '\165\163\145\162\156\141\155\145' | md5sum
который дает результат 14c4b06b824ec593239362517f538b29 -
однако, если мы отбросим переданную по каналу md5sum и просто выполним printf '\165\163\145\162\156\141\155\145'
в оболочке мы получаем исходную строку «username».
Мне кажется, что единственная причина для распаковки, объединения и печати — это обеспечить немного больше безопасности, чтобы процессы не содержали исходную строку, если кто-нибудь взломает машину и будет наблюдать за процессами и т. Д.
Разделение на пробел, по-видимому, используется для пропуска завершающего символа, возвращаемого вызовом командной строки, так что вы можете получить md5sum только путем разбиения перезаписанной строки из командной строки на 2 значения, но только захвата первого в возвращенный скаляр $ out переменная.
Я предполагаю, что автор кода не смог использовать модуль CPAN MD5 и поэтому вернулся к использованию команды md5sum из командной строки, но хотел запутать и вызовы командной строки.
Вы должны иметь возможность заменить всю функцию вызовом функции php md5sum, используя только строку в качестве параметра ( http://php.net/manual/en/function.md5.php )
В вашем PHP-коде явно отсутствует вызов pack
, Пытаться:
$hexchal = pack("H32", $challenge);
$newchal = pack("H32", md5($hexchal.$uamsecret));
$passvar = md5("\0".$password.$newchal);
Кроме того, вы можете установить raw_output
параметр PHP md5
функция к TRUE
:
$hexchal = pack("H32", $challenge);
$newchal = md5($hexchal.$uamsecret, TRUE);
$passvar = md5("\0".$password.$newchal);
Вы должны использовать "H32"
в PHP так же, как в Perl. Оно говорит pack
ожидать 16 байтов (32 клева).