当第一次调用此函数时,它将根据当前时间戳的一部分返回一个哈希值。
function getAccessKey(){
$code = '';
$curTime = time();
$code = md5(substr($curTime,0,7));
return $code;
}与第一次调用时相比,返回的值将在1到1000秒之间发生变化。
我不知道这是否可能,但我正在寻找一种方法来控制字符串值更改的时间间隔,而不存储原始函数调用的时间戳。例如,我想使访问密钥(更改字符串)从原始调用时间起90秒失效。有没有人用过这样的算法?
谢谢
编辑:只是为了澄清-上面的方法将被第三方作为API调用使用,这将允许他们建立一个“无密码登录”链接。我不希望他们必须存储任何数据或进行任何辅助API调用才能使用它。我只希望返回的访问密钥代码在被请求后90秒内有效,然后在请求后90秒后无法工作。我不关心在这一点上使用的加密类型,只考虑在特定时间间隔后使字符串无效的能力。
发布于 2012-09-11 05:02:53
我想我不明白为什么要加密任何东西。为什么不直接使用:enter code here
function getAccessKey($duration_in_secs) {
$expiration = time() + $duration_in_secs;
$_SESSION['access_key_expiry'] = $expiration;
}然后只需检查您的会话变量,确保当前时间小于过期时间。
发布于 2012-09-11 05:10:07
这样如何(我没有添加所有必要的检查和验证,这只是一个概念证明。可以使用任何其他散列函数而不是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-11 05:37:15
为什么不使用加密呢?
我受到了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/>";(.一段时间后,您的$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());
}https://stackoverflow.com/questions/12359327
复制相似问题