Подпись запроса
Каждый запрос к серверу может быть подписан. Подпись запроса увеличивает безопасность использования API и защищает ключевые данные в теле запроса от изменения третьим лицом в процессе выполнения запроса.
Подписью является хэш функции bcrypt с использованием 10 раундов вычислений от склееной строки: значение поля login запроса + значение поля datetime запроса + значение секретного ключа API (не пароль доступа к API!) + дополнительная подстрока для подписи.
При выполнении запроса, содержащего только данные авторизации дополнительная подстрока для подписи равна пустой строке, т.е. "".
При выполнении запроса на проведение платежей и запроса статусов платежей подстрокой подписи является количество платежей, передаваемых в запросе.
Пример
В системе зарегистрирован пользователь, имеющий учетные данные:
логином 3,
паролем 12345678,
ключом API secret_api_key.
Пользователь желает выполнить запрос статусов платежей и подписать его. Формат запроса без подписи:
1 <?xml version='1.0' encoding='utf-8'?>
2 <request>
3 <datetime>2014-10-14T08:44:23.218869+04:00</datetime>
4 <auth>
5 <login>3</login>
6 <password_hash>$2a$10$s6OGhDUNMscGF5k8h.uBfuhpyHVXpgiNrqK5o8x93qnpyoyoGLP3q</password_hash>
7 </auth>
8 <payments>
9 <payment transaction_number="1111"/>
10 <payment transaction_number="2222"/>
11 <payment transaction_number="3333"/>
12 </payments>
13 </request>
Алгоритм действий для получения подписи:
Вычисляется строка для подписи способом, описанным выше. В итоге, строка для подписи имеет вид: 32014-10-14T08:44:23.218869+04:00secret_api_key3, где учтено, что запрос статуса выполняется для 3х платежей, а значит подстрокой подписи будет значение 3.
Вычисляется хэш функции bcrypt с использованием 10 раундов вычислений. Он может быть равен $2a$10$iVMVK7XuKha2PpMKu9/9xOYhgsDlISVuQYbyk/UEzvrXZPYkJihaW. Использованная фраза "может быть равен" указывает на то, что хэш вычисляется с использованием соли, которая должна генерироваться случайно для каждой подписи. Это означает, что хэш будет различным даже для одной и той же подписываемой строки, что повышает защищенность подписи как таковой.
Полученный хэш вставляется в запрос в тег request\sign
После вычисления подписи, приведенный в примере запрос будет иметь вид:
1 <?xml version='1.0' encoding='utf-8'?>
2 <request>
3 <datetime>2014-10-14T08:44:23.218869+04:00</datetime>
4 <auth>
5 <login>3</login>
6 <password_hash>$2a$10$s6OGhDUNMscGF5k8h.uBfuhpyHVXpgiNrqK5o8x93qnpyoyoGLP3q</password_hash>
7 </auth>
8 <sign>$2a$10$iVMVK7XuKha2PpMKu9/9xOYhgsDlISVuQYbyk/UEzvrXZPYkJihaW</sign>
9 <payments>
10 <payment transaction_number="1111"/>
11 <payment transaction_number="2222"/>
12 <payment transaction_number="3333"/>
13 </payments>
14 </request>