4

このワークフローを考えると:

サーバーA

  1. ユーザーが認証します。
  2. ユーザーは、共有シークレットを使用してランダムに生成された一意のバウチャー コードを購入し、サーバー B でアプリケーションを使用します。

サーバー B

  1. ユーザーが認証します。
  2. ユーザーがバウチャー コードを入力します。
  3. サーバー B は、共有シークレットを使用してコードが正当であることを検証します
  4. サーバー B は、アプリケーションへのアクセスを許可します。

以下に示すように、PHPで関数を実装する方法が必要ですgenerateVoucherCodevalidateVoucherCode

サーバーA

$voucher = generateVoucherCode("someSharedSecret");

サーバー B

$isValid = validateVoucherCode($userInputtedCode, "someSharedSecret");
if($isValid) {
    // allow access to application
}
4

1 に答える 1

2

共有シークレットによる正当性の検証は、HMACの目的です。を介して PHP で HMAC を生成できますhash_hmac。ワークフローは次のようになります。

  1. サーバー A は 1 回限りのコードを (任意の方法で) 生成し、その HMAC を計算します。コード + HMAC のペアは、バウチャー コードとしてユーザーに提供されます。
  2. ユーザーがバウチャーをサーバー B に提示します。
  3. サーバー B は、1 回限りのコードをバウチャーから分離し、共有シークレットを使用して独自に HMAC を計算します。計算された HMAC がバウチャーのものと一致する場合、バウチャーは本物です。

バウチャー生成の例:

$secret = '$uper$ecret$tring';
$code = 'a pet unicorn';
$voucher = $code.'/'.hash_hmac('sha512', $code, $secret);

echo 'Your voucher is '.$voucher';

バウチャー確認の例:

$secret = '$uper$ecret$tring';
list ($code, $hmac) = explode('/', $voucher);
$verify_hmac = hash_hmac('sha512', $code, $secret);
if ($hmac === $verify_hmac) {
    echo 'Your voucher can be redeemed for '.$code';
}
else {
    echo 'Invalid voucher, sorry';
}
于 2013-08-13T21:05:52.733 に答える