Generando cripto Wallets y Cuentas Seguras con Python

En esta publicación revisaremos la seguridad de la billetera Algorand y la interacción de la billetera y la cuenta. Específicamente, analizaremos los pasos y mecanismos involucrados en:

Generar una billetera Generar cuentas en la billetera Generar cuentas fuera de la billetera e importarlas a la billetera Hacer una copia de seguridad de una billetera Hacer una cuenta específica que está dentro de una billetera Recuperar una billetera Recuperar cuentas que se generaron dentro de una billetera Importar cuentas de varias firmas en una billetera

Asegúrese de tener un nodo Algorand TestNet ejecutándose y asegúrese de iniciar el proceso kmd.

objetivo kmd inicio -d (DATOS DIR)

Este puede ser un nodo estándar a través de los binarios en github o puede ser un arranque de contenedor dockerizado desde una instancia de S3.

Además, asegúrese de tener instalado el SDK de Python.

Los desarrolladores (y los usuarios de cifrado en general) generalmente piensan en las direcciones de cifrado como un identificador de longitud fija o arbitraria que tiene una clave secreta correspondiente que se utiliza para activar funciones de gasto desde una dirección. Los desarrolladores (y la audiencia criptográfica general, de nuevo) también probablemente estén familiarizados con el concepto de frases mnemotécnicas que se usan como una prueba de fallas para recuperar una dirección (o más específicamente, para recuperar el acceso a los fondos asociados con una dirección) si El acceso a una dirección de cifrado está restringido, perdido o comprometido. Para un tutorial de seguridad en profundidad, lea esta gran serie de publicaciones de Sharon Halevi.

Las direcciones de Algorand son identificadores únicos para claves públicas. Esto se aplica a pubkeys individuales donde solo hay una pubkey involucrada, así como a direcciones de múltiples firmas donde existe una serie de pubkeys. Estos pubkeys y sus claves privadas correspondientes utilizan firmas de curva elíptica de alta velocidad y alta seguridad Ed25519, que es el esquema de firma EdDSA que usa SHA-512 y Curve25519. No hay intención de sumergirse profundamente en el mundo de la criptografía con esta publicación, pero solo hay un punto de relación: Bitcoin usa el esquema de firma ECDSA.

Ed25519 es interesante porque a diferencia de las firmas ECDSA, este esquema usa algo llamado claves de sesión infalibles que son firmas que se generan de manera determinista. Esto logra pseudoaleatoriedad mediante el hash de una clave secreta a largo plazo junto con el mensaje de entrada. El beneficio aquí es que evita el riesgo de pérdida de claves privadas debido a un generador de números aleatorios defectuoso, que es un riesgo inherente en el esquema de firma ECDSA.

Una dirección envuelve una clave pública Ed25519, que es una matriz de 32 bytes y la representación de cadena se calcula agregando una suma de verificación de 4 bytes (calculada tomando los últimos 4 bytes de un resumen SHA512 / 256 de la clave pública) al público clave, dándonos una matriz de 36 bytes.

Las direcciones de Algorand a menudo (erróneamente) se denominan claves públicas. Tenga esto en cuenta si es un desarrollador porque necesita ser consciente de esta distinción.

El término cuenta y dirección parecen usarse indistintamente, ya que solo hay mucho que puede hacer para aplicar el vocabulario, pero una cuenta de Algorand es técnicamente una dirección en la cadena de bloques que tiene datos específicos de la cadena asociados con ella. Básicamente, este es un saldo mínimo (de 0.1 Algos (100,000 microalgos)) y otras propiedades más complejas, como si la cuenta está en línea y / o ha obtenido recompensas. Las cuentas se pueden generar sin conexión y la red no sabrá de su existencia hasta que tengan un saldo mínimo.

Este es un fragmento de código para generar una cuenta independiente sin conexión.

Las billeteras en la red Algorand se generan mediante un proceso llamado daemon de gestión de claves (kmd). Las billeteras almacenan una colección de cuentas. El proceso kmd almacena una colección de billeteras y gestiona la interacción de las cuentas dentro de las billeteras. Las cuentas / direcciones se pueden generar dentro de la billetera y las cuentas no kmd generadas se pueden importar a una billetera kmd. En la oración anterior dije "cuentas / direcciones" porque las direcciones no necesitan tener un saldo mínimo (la red no necesita saber sobre ellas) para ser administradas o alojadas dentro de una billetera kmd.

La advertencia con esta funcionalidad es que si se restaura una billetera kmd (instanciada en otro dispositivo), esas cuentas generadas no kmd deben importarse nuevamente y no simplemente generarse.

Este fragmento de código muestra los métodos necesarios para crear una billetera y generar una cuenta dentro de esa billetera. Necesitará algunas cuentas en su billetera kmd para interactuar y ejecutar el resto de los fragmentos de código, así que comente el método de eliminación después de ejecutar este código varias veces para tener una cuenta en su billetera kmd.

Para restaurar una billetera kmd necesita el clave de derivación maestra (mdk) de la billetera y posteriormente, necesitas el mnemónico que se puede extraer del mdk.

Una vez que se recupera la billetera mnemónica, puede usar el método mnemonic.to_master_derivation_key () para extraer el mdk y ejecutar create_wallet () usando kmd para crear una instancia de su billetera. La razón por la que el código le muestra cómo extraer el mnemónico del mdk y luego extraer el mdk del mnemónico es que, por razones prácticas y de seguridad, el mnemónico es lo que los usuarios de billeteras utilizan como respaldo.

Ahora echemos un vistazo a cómo importar una cuenta independiente en una billetera kmd. En el siguiente fragmento de código, recorremos todas las billeteras que forman parte de su instancia kmd usando list_wallets () para exponer los metadatos de las billeteras y seleccionar la billetera que está buscando al cambiar la cadena con la que se compara.

if arrayitem.get ("name") == "wallet1":
walletid = arrayitem.get ("id")
descanso

Nuevamente, ejecutamos account.generate_account () como lo hicimos en el primer fragmento de código e importamos la cuenta pasando el private_key y wallethandle al método import_key.

Uno de los parámetros de billetera más importantes que necesitará para trabajar con kmd es el manejador de billetera. Entonces, una vez que recorre sus billeteras y encuentra la billetera kmd con la que está interesado en interactuar, parte de los metadatos de la billetera incluyen el walletid. Este walletid es lo que debe pasarse a init_wallet_handle () para extraer el kmd wallethandle:

walletid = Ninguno
billeteras = kcl.list_wallets ()

para arrayitem en billeteras:
if arrayitem.get ("name") == "wallet1":
walletid = arrayitem.get ("id")
descanso
print ("ID de billetera:", walletid)

wallethandle = kcl.init_wallet_handle (walletid, "testpassword")
print ("Wallet Handle:", wallethandle)

Este identificador de billetera luego se pasa a métodos como import_key () para importar cuentas independientes:

importedaccount = kcl.import_key (wallethandle, private_key)

o generate_key () para generar una cuenta basada en kmd

address = kcl.generate_key (wallethandle)

además de importar cuentas de firma múltiple con import_multisig ()

import_multisig = kcl.import_multisig (wallethandle, msig)

y finalmente, uno que hemos visto varias veces ahora list_keys () para enumerar las cuentas que forman parte de la billetera kmd

cuentas = kcl.list_keys (wallethandle) Este fragmento de código demuestra los métodos necesarios para encontrar una billetera, iniciar la billetera para obtener el wallethandle usando walletid, generar cuentas, crear un objeto multisig (msig) e importar el msig en una billetera kmd usando la billetera

El último fragmento de código que quería demostrar antes de cerrar sesión es hacer una copia de seguridad de una cuenta kmd. Y eso se hace 1) iniciando la billetera para extraer el manejador de billetera 2) exportando la clave privada de la cuenta usando export_key () y 3) derivando la frase de respaldo mnemónica de la clave privada usando from_private_key ().

Todos estos ejemplos de código se pueden encontrar en github y con estos ejemplos debe tener una base sólida para construir con kmd.