Как я могу создать систему с общим секретным кодом ваучера между 2 независимыми серверами?


Учитывая этот рабочий процесс:

Сервер А

  1. Пользователь проходит аутентификацию.
  2. Пользователь покупает случайно сгенерированный уникальный код ваучера, используя общий секрет для использования приложения на сервере B.

Сервер B

  1. Пользователь проходит аутентификацию.
  2. Пользователь вводит код ваучера.
  3. Сервер B проверяет законность кода с использованием общего секрета
  4. Сервер B предоставляет доступ к приложению.

Мне нужен способ в PHP для реализации функций generateVoucherCode и validateVoucherCode, как показано ниже:

Сервер А

$voucher = generateVoucherCode("someSharedSecret");

Сервер B

$isValid = validateVoucherCode($userInputtedCode, "someSharedSecret");
if($isValid) {
    // allow access to application
}
Author: GLES, 2013-08-14

1 answers

Проверка законности с помощью общего секрета - это то, для чего предназначены HMACs. Вы можете создать HMAC в PHP с помощью hash_hmac. Ваш рабочий процесс будет следующим:

  1. Сервер A генерирует одноразовый код (любым удобным для вас способом) и вычисляет его HMAC. Пара код + HMAC предоставляется пользователю в качестве кода ваучера.
  2. Пользователь представляет ваучер серверу B.
  3. Сервер B изолирует одноразовый код из ваучера и независимо вычисляет его 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';
}
 1
Author: Jon, 2013-08-13 21:12:42