生成唯一密钥

24

如何生成一个不容易被猜到的唯一密钥?

我想为帐户激活和推荐目的创建一个唯一的密钥,其中包括一个校验和,以帮助防止用户轻易地猜测其他用户的激活或推荐密钥。

另外,在PHP中是否可以创建自己的会话密钥?如果可以,如何使其唯一?

非常感谢任何帮助。


关于问题中唯一键的重复:唯一键生成 - hakre
7个回答

58

不要过于复杂化它:

$key = md5(microtime().rand());

2
这将使同时开始的会话/注册获得相同的密钥。在难以调试的情况下可能会使事情过于复杂化。 - hakre
17
欢迎来到多线程Web服务器环境和多核处理器的世界。 - hakre
即使是两个不同的输入值也可能导致哈希冲突。概率约为1/750,000 - 不建议这样做。 - SISYN
@DanL 我不知道你从哪里得出那个概率的,但我认为是错误的。要得到1/750000的概率,需要大约10^38个唯一哈希值,才有2^128种可能性。 - PhoneixS
1
为什么不添加会话ID以防止任何可能的冲突? - Scott Flack
显示剩余2条评论

12
你可以使用uniqid来生成唯一的ID。查看PHP实现UUID(通用唯一标识符)生成的注释。


1
请注意,评论中提供的大多数建议都不能保证是唯一的,因为伪随机数生成器和哈希函数都不会返回唯一值。 - Gumbo

7

这是我在php中使用的唯一键:

$activation = md5(uniqid(rand(), true));

3

1

其他答案已经涵盖了有关创建(伪)唯一ID的主题,因此我只介绍如何设置自己的会话ID:

PHP中的会话ID会自动生成,但您可以设置自己的会话ID。请参阅 session_id() 如何操作。

例如,它的工作原理如下:

$mySessionId = generate_my_session_id();
$oldId = session_id($mySessionId);
session_start(); // session must start _after_ setting the id.

0
我使用这个脚本来随机生成密码,你可以稍作修改使其很好地满足你的需求。
function generatePassword ($length) {
    $possible = "0123456789abcdfghjkmnpqrstvwxyzABCDEFGHIJKLMNOPQRESTUVWXYZ_"; // allowed chars in the password
     if ($length == "" OR !is_numeric($lengh)){
      $length = 8; 
     }

     srand(make_seed());

     $i = 0; 
     $password = "";    
     while ($i < $length) { 
      $char = substr($possible, rand(0, strlen($possible)-1), 1);
      if (!strstr($password, $char)) { 
       $password .= $char;
       $i++;
       }
      }
     return $password;
}

对于您自己的会话密钥,它非常简单

start_session();
$_SESSION['NewSessionVariable']=$VariableToSet;

不知道,有很多种方法可以做到,人们可能会争论什么更好lol :D。 - rackemup420
我不会在需要安全性的应用程序中使用此算法,因为随机数生成函数通常不能很好地产生良好的随机值。对于这种情况,请使用哈希函数,如md5或更好的sha2。 - Jonny Dee

0

你可以使用我之前写的这个函数。

   function generateToken($type = null) {
  if($type) {
    return '<input type="hidden" name="token_id" value="'.$_SESSION['token_id'].'">';
  } else {
    if(!isset($_SESSION['token_id'])) {
      $token_id = md5(substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10));
      $_SESSION['token_id'] = $token_id;
      return $_SESSION['token_id'];
    }
    return $_SESSION['token_id'];
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接