在给定的时间间隔后使密钥无效

时间:2012-09-10 20:56:08

标签: php

第一次调用此函数时,它将根据当前时间戳的一部分返回哈希值。

function getAccessKey(){
    $code = '';
    $curTime = time();
    $code = md5(substr($curTime,0,7)); 
    return $code;
}

返回的值将相对于第一次调用时间在1到1000秒之间变化。

我不知道这是否可行,但我正在寻找一种方法来控制字符串值更改的时间间隔,而不存储原始函数调用的时间戳。例如,我想在原始调用时间90秒后使访问密钥(更改字符串)无效。有没有人使用过类似这样的算法?

由于

编辑:只是为了澄清 - 上述方法将被第三方用作API调用,这将允许他们构建“无密码登录”链接。我不希望他们必须存储任何数据或进行任何辅助API调用才能使用它。我只希望返回的访问密钥代码从请求之后起作用90秒,然后在请求90秒后无法工作。我并不关心此时使用的加密类型,只是考虑在特定时间间隔后使字符串无效的能力。

3 个答案:

答案 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());
}