2010-01-28 135 views
2

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

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

步骤如下:

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

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

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

我创造一个独特的令牌的想法:使用散列使用SALT这样的结果无法预测或解密(与MD5问题)

任何帮助或朝正确方向迈出的铅会greatfull算法。

回答

4

我喜欢这种为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.= ""; 
    for($i=0;$i<$length;$i++){ 
     $token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))]; 
    } 
    return $token; 
} 
?> 

在增加超时方面,我建议采取这种照顾在数据库中。添加一个名为“registration_timeout”的列,然后使用mysql的addtime()函数将该列设置为当前时间戳+然而您希望超时时间长。

另请注意,临时电子邮件帐户使用起来微不足道(http://www.mailinator.com,http://www.guerrillamail.com等),所以要求某人注册电子邮件帐户并不意味着什么。更多用户帐户最终可能会在http://www.bugmenot.com

+0

谢谢老兄..给我一个见解。至于电子邮件去。他们正在使用允许的IP地址以任何方式进行控制,并且在加号网站上不公开使用。 – 2010-01-28 23:38:28

+1

您的算法不符合CSPRNG的要求。维基百科页面CSRRNG提供了一个体面的需求解释。 – 2011-05-11 13:36:43

+0

@fsb好的,它解决了OP的问题吗? – rook 2011-05-11 16:52:24