Рубрики
Uncategorized

Пример генерации и проверки подписи интерфейса API в разработке PHP

Автор оригинала: David Wong.

В этой статье описывается операция генерации подписи и проверки интерфейса PHP API . Для вашей справки приведем следующие сведения:

В процессе разработки мы часто имеем дело с интерфейсом. Иногда мы называем интерфейс веб-сайта других людей, а иногда мы предоставляем интерфейс нашего собственного веб-сайта для других. Но в процессе звонка мы не можем обойтись без проверки подписи.

При разработке проверки подписи, пожалуйста, обратите внимание на следующие моменты:

  • Изменчивость: каждая подпись должна быть разной.
  • Своевременность: ограничение по времени каждого запроса, истечение срока действия и отмена и т.д.
  • Уникальность: каждая подпись уникальна.
  • Целостность: он может проверять входящие данные и предотвращать подделку.

1. Способ генерации знака параметра подписи

Шаг 1: отсортируйте все параметры (обратите внимание на все параметры), кроме самого знака и параметров с пустым значением, и отсортируйте их в порядке возрастания букв имени параметра.

Затем отсортируйте значение параметра 1 на шаге 2 Значение параметра n n (где параметры и значения должны быть исходными значениями параметров передачи и не могут быть обработаны, например “не могут быть преобразованы в”, а затем объединены) в строку.

Шаг 3. соедините ключ аутентификации, назначенный стороне доступа, перед строкой, полученной на шаге 2.

Шаг 2. добавьте ключ ключа проверки (ключевой ключ назначается поставщиком интерфейса стороне доступа к интерфейсу) перед строкой, полученной на предыдущем шаге, а затем вычислите значение MD5, чтобы получить 32-разрядную строку, а затем преобразуйте ее в верхний регистр

Шаг 4: вычислите значение MD5 (32 бита) строки на шаге 3, а затем преобразуйте его в верхний регистр. Полученная строка используется в качестве значения знака.

приведите пример:

Предположим, что передаваемые данные являются/интерфейсом. php ?sign=Значение sign_ & & & & P3 = & (лучший способ-отправить его по почте), где параметр sign соответствует значению sign_-это значение подписи.

Первым шагом является сращивание струны. Сначала удалите сам параметр sign, а затем удалите нулевой параметр P3, оставив & & & amp;, а затем отсортируйте его в порядке возрастания по символу имени параметра, & & &

Второй шаг-соединить имя и значение параметра, чтобы получить метод cancelp1v1p2v2pnvn

Третий шаг-добавить ключ проверки ключа перед строкой, сращенной выше. Мы предполагаем, что это ABC, и получаем новую строку abcmethodecancelp1v1p2v2pnvn

Шаг 4, MD5 используется для вычисления строки. Предположим, что получен ABCDEF, а затем он преобразуется в верхний регистр, чтобы получить ABCDEF, который является значением подписи знака.

Примечание: перед вычислением MD5, пожалуйста, убедитесь, что строковые коды интерфейса и стороны доступа согласованы. Например, кодировка UTF-8 или кодировка GBK используются одинаково. Если методы кодирования несовместимы, вычисленная подпись не сможет быть проверена.

2. Метод проверки подписи:

В соответствии с правилами метода для генерации знака параметра подписи, описанными выше, значение параметра подписи вычисляется и сравнивается с соответствующим значением параметра знака, указанного в параметре. Если он соответствует, проверка будет пройдена. Если нет, то параметр был изменен.

3, Давайте посмотрим на код напрямую

 '[email protected]',
  'sex' => '1',
  'age' => '16',
  'addr' => 'guangzhou',
  'key' => $key,
  'timestamp' => time(),
);

//Get sign
function getSign($secret, $data) {
  //Sort the array values by key
  ksort($data);
  //Form of generated URL
  $params = http_build_query($data);
  //Generate sign
  $sign = md5($params . $secret);
  return $sign;
}

//Data sent plus sign
$data['sign'] = getSign($secret, $data);

/**
 *Verify whether the sign is legal in the background
 * @param [type] $secret [description]
 * @param [type] $data  [description]
 * @return [type]     [description]
 */
function verifySign($secret, $data) {
  //Verify that there is a signature in the parameter
  if (!isset($data['sign']) || !$data['sign']) {
    Echo 'the data signature sent does not exist';
    die();
  }
  if (!isset($data['timestamp']) || !$data['timestamp']) {
    Echo 'the data parameter sent is illegal';
    die();
  }
  //Verification request, 10 minutes invalid
  if (time() - $data['timestamp'] > 600) {
    Echo 'validation failed, please resend the request';
    die();
  }
  $sign = $data['sign'];
  unset($data['sign']);
  ksort($data);
  $params = http_build_query($data);
  //$secret is obtained by querying the API database through key
  $sign2 = md5($params . $secret);
  if ($sign == $sign2) {
    Die ('validation passed ');
  } else {
    Die ("the request is illegal ');
  }
}
?>

Более заинтересованные читатели, интересующиеся контентом, связанным с PHP, могут ознакомиться со специальными разделами этого веб-сайта: Учебник по безопасности программирования PHP, краткое описание навыков фильтрации безопасности PHP, учебник по введению базового синтаксиса PHP, учебник по объектно-ориентированному программированию PHP, краткое описание использования строк PHP (строк), учебник по эксплуатации базы данных PHP + MySQL и краткое описание общих навыков работы с базами данных PHP

Я надеюсь, что эта статья поможет вам в программировании на PHP.