【问题标题】:Secure Token Process安全令牌过程
【发布时间】:2010-01-28 07:02:39
【问题描述】:

我目前正在使用 PHP 和 MYSQL 开发网站。这是一个私人网站,因此必须允许使用电子邮件进行注册。简单来说,如果要注册一个新用户,管理员必须进入系统并添加一个要注册的电子邮件地址。

我想做的是在发生这种情况时创建一个令牌或传递值。

步骤如下:

  1. 管理员向系统添加电子邮件
  2. 创建了一个唯一的令牌值(例如 1234567890)
  3. 然后将令牌值发送到用户电子邮件
  4. 用户点击提供的链接并输入他的电子邮件和令牌值
  5. 如果成功 - 允许用户注册
  6. 如果失败! - 重新生成令牌并再次发送到该电子邮件地址

我真正想知道的是,创建令牌的最佳做法是什么,以及我们如何确保每次注册电子邮件时都创建一个唯一的令牌。

为了进一步的安全性,我可以确保每个令牌只存在几个小时。但这是否会阻止未经授权的访问系统,或者这对保护我的网站来说是个坏主意?

我对创建唯一令牌的想法:使用使用 SALT 的哈希算法,因此无法预测或解密结果(MD5 的问题)

对正确方向的任何帮助或引导都会非常有用。

【问题讨论】:

    标签: php security hash passwords


    【解决方案1】:

    我喜欢这种为 PHP 生成加密安全伪随机数生成器或 (CSPRNG) 的方法。是written by Scott

    <?php
       function crypto_rand_secure($min, $max) {
            $range = $max - $min;
            if ($range < 0) return $min; // not so random...
            $log = log($range, 2);
            $bytes = (int) ($log / 8) + 1; // length in bytes
            $bits = (int) $log + 1; // length in bits
            $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
            do {
                $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
                $rnd = $rnd & $filter; // discard irrelevant bits
            } while ($rnd >= $range);
            return $min + $rnd;
    }
    
    function getToken($length=32){
        $token = "";
        $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
        $codeAlphabet.= "0123456789";
        for($i=0;$i<$length;$i++){
            $token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
        }
        return $token;
    }
    ?>
    

    在添加超时方面,我建议在数据库中处理这个问题。添加一个名为 registration_timeout 的列,然后使用 mysql 的 addtime() 函数将此列设置为当前时间戳+无论您希望超时有多长。

    还请记住,临时电子邮件帐户使用起来很简单(http://www.mailinator.comhttp://www.guerrillamail.com 等...),因此要求某人注册电子邮件帐户并不意味着什么。此外,用户帐户可能最终会出现在 http://www.bugmenot.com 上。

    【讨论】:

    • 谢谢老兄..给我一个见解。就电子邮件而言。他们正在以任何方式使用允许的 IP 地址进行控制,此外,该网站不供公众使用。
    • 您的算法不符合 CSPRNG 的要求。维基百科关于 CSRRNG 的页面提供了对要求的体面解释。
    • 这个答案应该被编辑。 @Rook 提出的功能绝不是 CSPRNG。有人可能会争辩说,这个解决方案并没有解决 OP 的问题,因为如果 PRNG 的安全性被定义为通过下一位测试,它不符合安全 PRNG 的要求。像bin2hex(openssl_random_pseudo_bytes(20)) 这样简单的东西应该可以解决@Angel.King.74 在原帖中提出的问题。不过发生碰撞的可能性很小。这应该由应用程序来处理,或者为此添加一个非随机的唯一 ID。
    • @Susam Pal 我同意这已经有几年历史了。
    • openssl 功能完善。满足 CSPRNG 要求的实际解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-11-12
    • 2015-08-17
    • 1970-01-01
    • 2012-08-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多