0

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

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

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

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

谢谢

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

4

3 回答 3

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));
于 2012-09-10T21:10:06.653 回答
0

我想我不明白加密任何东西的必要性。为什么不直接使用:enter code here

function getAccessKey($duration_in_secs) {
    $expiration = time() + $duration_in_secs;
    $_SESSION['access_key_expiry'] = $expiration;
}

然后只需检查您的会话变量以确保当前时间小于到期时间。

于 2012-09-10T21:02:52.650 回答
0

为什么不使用加密?

我受到这个问题的启发,这使得安全地使用到期日期成为可能。

$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/>";

(.......一段时间后,您的 $code 又回来了)

$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());
}
于 2012-09-10T21:37:15.243 回答