首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在给定的时间间隔后使密钥无效

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

Stack Overflow用户
提问于 2012-09-11 04:56:08
回答 3查看 210关注 0票数 0

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

代码语言:javascript
运行
复制
function getAccessKey(){
    $code = '';
    $curTime = time();
    $code = md5(substr($curTime,0,7)); 
    return $code;
}

与第一次调用时相比,返回的值将在1到1000秒之间发生变化。

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

谢谢

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

EN

回答 3

Stack Overflow用户

发布于 2012-09-11 05:02:53

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

代码语言:javascript
运行
复制
function getAccessKey($duration_in_secs) {
    $expiration = time() + $duration_in_secs;
    $_SESSION['access_key_expiry'] = $expiration;
}

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

票数 0
EN

Stack Overflow用户

发布于 2012-09-11 05:10:07

这样如何(我没有添加所有必要的检查和验证,这只是一个概念证明。可以使用任何其他散列函数而不是md5(),它不会改变任何东西):

代码语言:javascript
运行
复制
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));
票数 0
EN

Stack Overflow用户

发布于 2012-09-11 05:37:15

为什么不使用加密呢?

我受到了this question的启发,它可以安全地处理到期日期。

代码语言:javascript
运行
复制
$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将返回)

代码语言:javascript
运行
复制
$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/>";
}

这将输出:

代码语言:javascript
运行
复制
Expiration time = 1347312816
Sharable encrypted code = ioVqtqZud+iexObaGBF418i0gHKHshjsy+mj+oM4KMw=
Decoded time is 1347312816...Code is OK

使用这种方法,您需要两个函数:

代码语言:javascript
运行
复制
// 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());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12359327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档