Как я могу создать систему с общим секретным кодом ваучера между 2 независимыми серверами?
Учитывая этот рабочий процесс:
Сервер А
- Пользователь проходит аутентификацию.
- Пользователь покупает случайно сгенерированный уникальный код ваучера, используя общий секрет для использования приложения на сервере B.
Сервер B
- Пользователь проходит аутентификацию.
- Пользователь вводит код ваучера.
- Сервер B проверяет законность кода с использованием общего секрета
- Сервер B предоставляет доступ к приложению.
Мне нужен способ в PHP для реализации функций generateVoucherCode
и validateVoucherCode
, как показано ниже:
Сервер А
$voucher = generateVoucherCode("someSharedSecret");
Сервер B
$isValid = validateVoucherCode($userInputtedCode, "someSharedSecret");
if($isValid) {
// allow access to application
}
4
1 answers
Проверка законности с помощью общего секрета - это то, для чего предназначены HMACs. Вы можете создать HMAC в PHP с помощью hash_hmac
. Ваш рабочий процесс будет следующим:
- Сервер A генерирует одноразовый код (любым удобным для вас способом) и вычисляет его HMAC. Пара код + HMAC предоставляется пользователю в качестве кода ваучера.
- Пользователь представляет ваучер серверу B.
- Сервер 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