Estoy tratando de autenticarme para un websocket. En el ejemplo en los documentos dice si mi cliente nonce es:

nonce = 0xf08c98caf1fd82e8cea9825dbff04fd0 

Entonces debería codificarlo usando base64 para obtener:

target = "8IyYyvH9gujOqYJdv/BP0A==".

No estoy segura de lo que estoy haciendo mal, pero me sale lo siguiente:

client_nonce = 0xf08c98caf1fd82e8cea9825dbff04fd0
str_client_nonce = str(client_nonce) 
encoded = b64encode(bytes(str_client_nonce, 'utf-8'))
print(encoded)

>> b'MzE5NzQ0NzM5NTUzODE1NjMyMTAxNjk0MjM1NzExODU0NjI4ODE2'
1
JSStuball 26 feb. 2018 a las 09:56

3 respuestas

La mejor respuesta

Para empezar, 0xf08c98caf1fd82e8cea9825dbff04fd0 es un número en Python (por ejemplo, 0x10 es otra forma de escribir 16). Pero un número no es lo que realmente tiene, tiene la representación hexadecimal de una lista de bytes, también conocida como una cadena hexadecimal.

Entonces cosas que hacer:

  • Deshazte de la 0x, usa una cadena.
  • Decodifica esa cadena en bytes.
  • Codifique esos bytes a base64.

Código:

import base64

nonce_hex = 'f08c98caf1fd82e8cea9825dbff04fd0'
nonce = bytearray.fromhex(nonce_hex)
base64_nonce = base64.encodebytes(nonce)

# -> b'8IyYyvH9gujOqYJdv/BP0A==\n'

El actual nonce es siempre bytes. Se utilizan diferentes métodos para representar / almacenar / transportar esos bytes. Usar cadenas hexadecimales es una forma común. Usar base64 es otro. Ambas cadenas hexadecimales y base64 tienen el mismo propósito: almacenar bytes arbitrarios en forma de cadena para un manejo sencillo. Base64 necesita menos espacio que las cadenas hexadecimales, es por eso que a menudo se prefiere. El código anterior solo convierte una representación de cadena de bytes en otra.

4
heemayl 26 feb. 2018 a las 09:48

str(client_nonce) te da '0xf08 ...' mientras que probablemente lo conviertas directamente a bytes:

client_nonce.to_bytes(2, byteorder='big')
1
kmaork 26 feb. 2018 a las 07:20

Tienes que convertir tu nonce en un bytes directamente. No es la representación de string

A través de https://stackoverflow.com/a/45586011/1562285

b = int2bytes(nonce)
b'\xf0\x8c\x98\xca\xf1\xfd\x82\xe8\xce\xa9\x82]\xbf\xf0O\xd0'
base64.b64encode(b)
b'8IyYyvH9gujOqYJdv/BP0A=='
0
Maarten Fabré 26 feb. 2018 a las 07:10