Хеширование сериализованного объекта PHP VS хэширование строки сериализованного объекта - PullRequest
1 голос
/ 23 марта 2019

У меня есть этот код PHP. Я сериализую класс Foo и получаю вывод 'O: 3: "Foo": 2: {s: 6: "Fooa"; b: 1; s: 6: "Foob"; s: 9: "rogthedog" ;}». Когда я хэширую этот сериализованный вывод, он не совпадает с хэшем самой строки. Разве сериализованный вывод не должен быть строкой, эквивалентной 'O: 3: "Foo": 2: {s: 6: "Fooa"; b: 1; s: 6: "Foob"; s: 9: "rogthedog" ;}? '

<?php
/* Write your PHP code here */
class Foo {
    private $a = TRUE;
    private $b = 'rogthedog';
}


$c = new Foo;
echo(serialize($c));
# This returns 'O:3:"Foo":2:{s:6:"Fooa";b:1;s:6:"Foob";s:9:"rogthedog";}'

echo(hash('sha256', serialize($c)));
# Not the same as!
echo (hash('sha256', 'O:3:"Foo":2:{s:6:"Fooa";b:1;s:6:"Foob";s:9:"rogthedog";}'));

1 Ответ

2 голосов
/ 23 марта 2019

теоретически это правильно, если вы берете только видимые символы, но php также добавляет непереписываемые символы. Я подготовил для вас пример, начиная с вашего кода, который показывает подарок, в котором размещены невидимые символы. затем я восстановил последовательность с этими персонажами и играми пепла

<?php
class Foo {
    private $a = TRUE;
    private $b = 'rogthedog';
}


$c = new Foo;
echo(serialize($c));

# this shows all the characters
echo("\n\n");
$test = str_split(serialize($c));
foreach ($test as $char) {
 echo $char."->".ord($char)." || ";
}

echo(hash('sha256', serialize($c)));
echo("\n\n");


$test2='O:3:"Foo":2:{s:6:"'.chr(0).'Foo'.chr(0).'a";b:1;s:6:"'.chr(0).'Foo'.chr(0).'b";s:9:"rogthedog";}';

echo (hash('sha256', $test2)); // YES !!!
...