【问题标题】:Hashing a PHP serialized object VS hashing a string of serialized object散列 PHP 序列化对象 VS 散列序列化对象字符串
【发布时间】:2019-03-23 11:20:06
【问题描述】:

我有这个 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";}'));

【问题讨论】:

    标签: php serialization hash


    【解决方案1】:

    理论上,如果你只使用可见字符是正确的,但 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 !!!
    

    【讨论】:

    • 他可以使用str_replace("\0", "", serialize($c)) 删除不可见的字符。这将使两个哈希值相等。
    • 如果您在制作哈希之前删除它们,问题就不会出现
    猜你喜欢
    • 2012-07-22
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2011-01-26
    相关资源
    最近更新 更多