2013-11-21 3 views
7

Иногда, после того, как человек совершает покупку на устройстве android через IAB, подпись, которую клиент отправляет обратно на сервер, не может быть декодирована base64 из-за «TypeError: Incorrect padding исключение.Ошибка заполнения при подписании подписи base64decoding после покупки в приложении

код сервера выглядит следующим образом, где «подпись» передается на сервер от наших клиентов, которые получили значение из IAB API:

signature_encoded = signature.encode() 
key = RSA.importKey(GOOGLE_PLAY_STORE_KEY_PEM) 
verifier = PKCS1_v1_5.new(key) 
signed_data_hash = SHA.new(signed_data) 
# fails here SOMETIMES 
signature_decoded = base64.urlsafe_b64decode(signature_encoded) 

Длина «подпись» строки, как предполагается, делится на 4, но иногда они входят с длиной 342 и дают эту ошибку заполнения.

Я пытался добавить «==» до конца, и это вызывает нас вокруг исключения, но результат недействителен по сравнению с «signed_data_hash» (т. Е. Verifier.verify (signed_data_hash, signature_decoded) возвращает False).

Я не думаю, что это попытка взлома, так как журналы клиентов, которые мы видим, показывают, что они проходят через наш процесс покупки.

Любая помощь здесь была бы принята с благодарностью! Благодаря!

+0

[Попробуйте некоторые из этих] (http://stackoverflow.com/questions/2941995/python -ignore-wrong-padding-error-when-base64-decoding) – PurityLake

+1

Каковы фактические байты строки подписи? Это может привести к ошибке и, вероятно, байты могут описывать, что это за ошибка. – Claris

+1

Не видя струны, трудно сказать. Во-первых, в зависимости от вызова, API IAB возвращает строку для подписи, а в других случаях возвращает строковый список. Могут быть символы новой строки. Хотя я не думаю, что это связано с проблемой, вам не нужен urlsafe, если данные не были переданы как часть query_string (что я сомневаюсь). Кроме того, это подпись unicode? почему вы используете encode()? Вам нужно decode() для запуска верификатора? Слишком много недостающего кода, чтобы угадать исправление. –

ответ

1

I've tried adding "==" to the end

Звучит неправильно. Вы должны добавить только достаточно, чтобы длина строки была кратной 3. Ознакомьтесь с разделом заполнения здесь: http://en.wikipedia.org/wiki/Base64

Смежные вопросы