【发布时间】:2023-04-04 02:03:01
【问题描述】:
生成唯一密钥的最佳方法是什么,不容易猜到?
我想为帐户激活和推荐创建一个唯一密钥,其中包括一个校验和,以帮助防止用户轻易猜测其他用户的激活或推荐密钥。
另外,在 PHP 中是否可以创建自己的会话密钥? 如果是这样,您将如何使其与众不同?
非常感谢任何帮助。
【问题讨论】:
-
复制问题的唯一键部分:Unique key generation
标签: php
生成唯一密钥的最佳方法是什么,不容易猜到?
我想为帐户激活和推荐创建一个唯一密钥,其中包括一个校验和,以帮助防止用户轻易猜测其他用户的激活或推荐密钥。
另外,在 PHP 中是否可以创建自己的会话密钥? 如果是这样,您将如何使其与众不同?
非常感谢任何帮助。
【问题讨论】:
标签: php
不要过于复杂:
$key = md5(microtime().rand());
【讨论】:
您可以使用uniqid 生成唯一ID。查看用于 UUID(通用唯一标识符)生成的 PHP 实现的 cmets。
【讨论】:
这是我在 php 中用于 uniq 键的:
$activation = md5(uniqid(rand(), true));
【讨论】:
只需使用 PHP 的内置函数uniqid()。 See PHP manual.
【讨论】:
其他答案已经涵盖了关于创建(伪)唯一ID的主题,所以我只介绍如何设置自己的会话ID:
PHP 中的会话 ID 会自动生成,但您可以设置自己的。看session_id()怎么做。
示例如下:
$mySessionId = generate_my_session_id();
$oldId = session_id($mySessionId);
session_start(); // session must start _after_ setting the id.
【讨论】:
我使用这个脚本来随机生成密码,你改变一些东西,它会很好地满足你的需求。
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;
【讨论】:
你可以使用我以前写的这个函数..
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'];
}
}
【讨论】: