1

当散列两个随机字符串时,我平均会在 100,000 个中得到 2 个冲突。这是预期的吗?

所有这些字符串都产生相同的哈希(使用任何盐和任何工作因子):

base64_decode('/g=');
base64_decode('/gB/==');
base64_decode('/gBQyVY/0dzg');
base64_decode('/gBQyoK71jVY/JZP0dzg=');
base64_decode('/gBQyoK71jVY/J2ea4q9mAZP0dzg==');
base64_decode('/gBQyoK71jVY/J7QuBNJuFdxyf2eTBCs42chkx6ZvpJYszpUcJk8/HXa4q9mAZP0dzg=');

这些只是示例,尝试从中心添加和删除字符,您会得到更多匹配项。这是用于查找它们的 php 代码:

set_time_limit(60*10);
$salt = '$2a$04$usesomesillystringforsalt$';
for($i=0; $i < 100000; $i++){
    $one = openssl_random_pseudo_bytes(rand(1,111));
    $two = openssl_random_pseudo_bytes(rand(1,111));
    if(crypt($one, $salt)==crypt($two, $salt)){
        echo base64_encode($one).'|'.base64_encode($two)."\n";
    }
}
4

1 回答 1

2

没关系,PHP 不能很好地处理具有空字节的字符串。
PHP crypt 函数不是二进制安全的。

于 2012-02-19T21:42:47.980 回答