Codeigniter哈希值不会在循环中更改

时间:2013-12-19 16:55:05

标签: php codeigniter hash

我正在尝试使用codeigniter安全类生成一个唯一的长代码,我可以使用它来安全地更新在线数据库:

http://mydomain.com/myproject/index.php/my_controller/index/***3d51693c8c4***..

我注意到当我使用:

为循环中的单个记录创建哈希时
$hash= $this->security->get_csrf_hash();

相同的哈希不断生成。我需要为循环中的每条记录生成一个唯一的哈希/安全代码。我在http://ellislab.com/codeigniter%20/user-guide/libraries/security.html中没有看到任何讨论如何执行此操作的内容。

在CI中执行此操作的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

如果它是您想要生成的唯一代码,为什么不自己使用内置的php函数构建一个?

<?php

for ($i = 0; $i <= 1000; $i++) {
   $hash = uniqid(md5(time()), true);
   var_dump($hash);
}

?>

示例输出:http://pastebin.com/eSWaLhUt

正如您所看到的,无论您在循环中迭代的速度有多快,它都是独一无二的。

答案 1 :(得分:1)

uniqid方法将提供唯一的安全代码(请务必使用more_entropy参数,但这不是特别安全,因此根据您使用它的内容考虑使用{{1 }}

uniqid docs

mt_rand docs

答案 2 :(得分:1)

我更喜欢使用操作系统来生成唯一值。这个解决方案只是一个* nix解决方案,但是我最喜欢的一个

/** 
 * A Linux-dependent password generator.  This seems to be about 1000x better than
 * typical PHP-based password generation, and from what I hear, /dev/urandom should
 * be secure enough for temporary passwords.
 *
 * Lifted from:
 * http://stackoverflow.com/questions/6101956/generating-a-random-password-in-php
 */
static public function generatePassword($iLength=0)
{   
    $rFp = fopen('/dev/urandom', 'r');
    if(!$rFp)
        throw new RuntimeException("Can't access /dev/urandom to get random data.");

    // 1024 bytes should be enough
    $sRandom = fread($rFp, 1024);
    fclose($rFp);

    return substr(trim(base64_encode(md5($sRandom, true)), '='), $iLength * -1);
}