0

我需要基于字符串获取一个“随机”数字(0-9),以便可以重新创建它。我的解决方案是使用 SHA512 并取第二个数字,如下所示:

$random = filter_var(hash('sha512', 'STRING COMES HERE'), FILTER_SANITIZE_NUMBER_INT)[1];

我想知道这是否准确且不可预测。我需要这个随机数来决定两个选项。我做了一个测试,看看这些数字是否给了我 50/50 的比率。

$option1 = 0;
$option2 = 0;
$times = 1000000; // amount of iterations

for($i = 0; $i < $times; $i++) {
    $result = filter_var(hash('sha512', rand()), FILTER_SANITIZE_NUMBER_INT)[1];
    if($result < 5) {
        $option1++;
    }
    else {
        $option2++;
    }
}

echo "Option 1: ".($option1/$times * 100)."%";
echo "</p>Option 2: ".($option2/$times * 100)."%";

这就是结果

Option 1: 49.9207%

Option 2: 50.0793%

我需要知道使用这种方法是否安全,即使结果看起来相当准确。

4

1 回答 1

1

加密安全散列函数(SHA 中的“S”代表“安全”)具有其输出与随机输出实际上无法区分的特性。更改输入的单个位平均应该以看起来完全随机的方式翻转输出位的一半。低于此值的任何内容都会引入漏洞。因此,您几乎可以保证得到均匀分布。但是——你所说的“安全”是什么意思?在不知道什么(如果有的话)的情况下,您试图保护它是不可能回答“我需要知道使用这种方法是否安全”的问题。作为一般的经验法则——如果你真的要问,那么答案可能是“不”。

于 2017-08-08T11:51:44.300 回答