随机码过度杀伤?

时间:2011-09-22 00:10:44

标签: php

我有一些我正在使用的代码

function genCode ($entropy=1) {
    $truCde = "";
    $indx = 0;
    $leng = 30*$entropy;
    while ($indx < $leng) {
        $code = "";
        $length = 100*$entropy;
        $index = 0;
        while ($index < $length) {
            $code .= rand();
            $index++;
        }
        $index = 0;
        while ($index < $length) {
            $code = sha1($code);
            $index++;
        }
        $truCde .= $code;
        $indx++;
    }
    $finalCode = sha1(rand()) . hash("sha256",$truCde . md5($entropy*rand()));
    $finalCode .= sha1(md5(strlen($finalCode)*$entropy));
    return hash (
        "sha256",
        sha1($finalCode) . sha1(md5($finalCode)) . sha1(sha1($finalCode))
    );
}

生成电子邮件验证的随机代码。是否有代码花费更少的时间来生成随机代码。运行此代码大约需要1-2秒,但我希望减少.7秒,因为脚本的其余部分需要更长的时间。

2 个答案:

答案 0 :(得分:7)

那是大规模的过度杀伤力。重复调用rand()不会使代码“更随机”,也不会使用SHA和MD5哈希的随机组合。这些复杂性都不会改善验证码。

会产生影响的改进是使用mt_rand()而不是rand()。 Mersenne Twister伪RNG比大多数默认rand()实现强得多。 PHP文档提示rand()最多可以在2 15 ,这意味着您只能生成32,768个唯一验证码。

除此之外,单个哈希调用也可以。

sha1(mt_rand())

(你甚至不需要调用哈希函数,因为你的代码的不可预测性将来自随机数生成器,而不是哈希函数。但哈希函数具有创建长十六进制字符串的良好副作用“看起来“更好。”

答案 1 :(得分:2)

如果您只是想生成随机字符串来测试某人有权访问电子邮件地址,或类似的东西,我会抛弃该代码并使用更直接的东西。像下面这样的东西可能会这样做。

function genCode () {
    $chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
    $returnValue = '';
    for ($i = 0; $i < 20; $i++) {
        $returnValue .= $chars[mt_rand(0, 35)];
    }
    return $returnValue;
}

如果需要,您可以对返回值进行散列,但我不知道除了混淆用于提出随机字符串的方案之外还有什么意义。