Как проверить подпись аутентификации GameKit LocalPlayer на внешнем сервере?Python

Программы на Python
Ответить
Anonymous
 Как проверить подпись аутентификации GameKit LocalPlayer на внешнем сервере?

Сообщение Anonymous »

Я пытаюсь реализовать проверку подлинности на стороне сервера для пользователя, аутентифицированного на стороне клиента iOS GameKit, как подробно описано здесь:
https://developer.apple.com/documentati ... guage=objc
Этот API получает идентификатор игрока, метку времени и соль от клиента. Он также отправляет URL-адрес открытых ключей. Сертификат необходимо получить по этому URL-адресу, чтобы извлечь открытый ключ, но кодировка кажется странной, поскольку каждый формат декодирования не удался, но чтение того же сертификата из локального файла работает. В качестве обходного пути я читаю его из файла, загруженного в отдельном задании.
Я написал код для процесса проверки, как показано ниже, но на этапе проверки он всегда терпит неудачу. Есть идеи, в чем я ошибаюсь?

Код: Выделить всё

import struct
import base64
import hashlib
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography import x509
from cryptography.hazmat.primitives import hashes

# GameKit public key URL and other params
public_key_url = "https://static.gc.apple.com/public-key/gc-prod-9.cer"
player_id = 
bundle_id = 
timestamp = 1683019415788
salt = "OnSojw=="

# client-generated signature and payload
client_signature = 

client_payload =player_id.encode('UTF-8') + bundle_id.encode('UTF-8') + struct.pack('>Q',timestamp) + base64.b64decode(salt)

# Download and decode the GameKit public key
# Or read from local cer file
with open("gc-prod-9.cer", "rb") as f:
cert_data = f.read()

# Parse the certificate data
cert = x509.load_der_x509_certificate(cert_data)
# Extract the public key from the certificate
public_key = cert.public_key()

# Hash the client payload with SHA-256
payload_hash = hashlib.sha256(client_payload).digest()

# Verify the client signature using the GameKit public key
signature_bytes = base64.b64decode(client_signature)

try:
public_key.verify(
signature_bytes,
payload_hash,
padding.PKCS1v15(),
hashes.SHA256()
)
print("Client signature verified successfully")
except Exception as e:
print("Client signature verification failed")
print(str(e))
Выбрасывается исключение:
в _rsa_sig_verify
raise InvalidSignature
cryptography.Exceptions.InvalidSignature

Я что-то упустил? Мне нигде не удалось найти актуальный ответ или образец кода.
Я уже просмотрел этот пост SO 10-летней давности, но решение устарело, и, насколько я понимаю, мой код представляет собой просто обновленную версию ответов.

Подробнее здесь: https://stackoverflow.com/questions/761 ... nal-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»