0

この関数が初めて呼び出されると、現在のタイムスタンプの一部に基づいてハッシュ値が返されます。

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

返される値は、最初に呼び出されたときから 1 ~ 1000 秒の間で変化します。

これが可能かどうかはわかりませんが、元の関数呼び出しのタイムスタンプを保存せずに、文字列値が変化する時間間隔を制御する方法を探しています。たとえば、元の呼び出しから 90 秒後にアクセス キーを無効化 (文字列を変更) したいとします。このようなことを行うアルゴリズムを使用した人はいますか?

ありがとう

編集: 明確にするために-上記の方法は、サードパーティが「パスワードなしのログイン」リンクを作成できるようにする API 呼び出しとして使用されます。これを使用するためにデータを保存したり、二次的な API 呼び出しを行ったりする必要はありません。返されたアクセス キー コードが要求されてから 90 秒間機能し、要求から 90 秒後に機能しないようにしたいだけです。この時点では、使用されている暗号化の種類については気にしていません。特定の時間間隔の後に文字列を無効にする機能について考えているだけです。

4

3 に答える 3

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

このようなものはどうですか (必要なチェックと検証をすべて追加したわけではありません。これは単なる概念実証です。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

暗号化を使用しないのはなぜですか?

有効期限を安全に処理できるようにするこの質問に触発されました。

$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

このような方法では、次の 2 つの関数が必要です。

// 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 に答える