第一次调用此函数时,它将根据当前时间戳的一部分返回哈希值。
function getAccessKey(){
$code = '';
$curTime = time();
$code = md5(substr($curTime,0,7));
return $code;
}
返回的值将相对于第一次调用时间在1到1000秒之间变化。
我不知道这是否可行,但我正在寻找一种方法来控制字符串值更改的时间间隔,而不存储原始函数调用的时间戳。例如,我想在原始调用时间90秒后使访问密钥(更改字符串)无效。有没有人使用过类似这样的算法?
由于
编辑:只是为了澄清 - 上述方法将被第三方用作API调用,这将允许他们构建“无密码登录”链接。我不希望他们必须存储任何数据或进行任何辅助API调用才能使用它。我只希望返回的访问密钥代码从请求之后起作用90秒,然后在请求90秒后无法工作。我并不关心此时使用的加密类型,只是考虑在特定时间间隔后使字符串无效的能力。
答案 0 :(得分:0)
我想我不明白需要加密任何东西。为什么不使用:enter code here
function getAccessKey($duration_in_secs) {
$expiration = time() + $duration_in_secs;
$_SESSION['access_key_expiry'] = $expiration;
}
然后检查你的会话变量以确保当前时间小于到期时间。
答案 1 :(得分:0)
这样的事情怎么样(我没有添加所有必要的检查和验证,它只是一个概念证明。而不是md5()
可以使用任何其他散列函数,它不会改变任何东西) :
function getAccessKey($ttl)
{
$somePrivateKey = 'foobar';
$expirationTime = time() + $ttl;
$code = md5($somePrivateKey . $expirationTime) . base_convert($expirationTime, 10, 16);
return $code;
}
function verifyKey($key)
{
$somePrivateKey = 'foobar';
$hash = substr($key, 0, 32);
$expirationTime = base_convert(substr($key, 32), 16, 10);
return md5($somePrivateKey . $expirationTime) == $hash && time() <= $expirationTime;
}
$key = getAccessKey(90);
var_dump(verifyKey($key));
答案 2 :(得分:0)
为什么不使用加密?
我受到this question的启发,可以安全地处理到期日期。
$time = time() + 90;
$key = "a private password";
echo "Expiration time = {$time}<br/>";
$code = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $time, MCRYPT_MODE_CBC, md5(md5($key))));
echo "Sharable encrypted code = {$code}<br/>";
(.......过了一段时间,你的$代码又回来了)
$time = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($code), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
echo "Decoded time is {$time}...";
if ($time < time()) {
echo "Code has expired<br/>";
} else {
echo "Code is OK<br/>";
}
这将输出:
Expiration time = 1347312816
Sharable encrypted code = ioVqtqZud+iexObaGBF418i0gHKHshjsy+mj+oM4KMw=
Decoded time is 1347312816...Code is OK
使用这种方法,您需要两个功能:
// returns a code valid $duration seconds
function createKey($duration) {
$key = "a private password";
$time = time() + $duration;
$code = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $time, MCRYPT_MODE_CBC, md5(md5($key))));
return $code;
}
// returns true if code is still valid
function checkKey($code)
{
$key = "a private password";
$time = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($code), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
return ($time >= time());
}