Almacenamiento de una clave privada cifrada en un servidor

Estoy planeando construir un pequeño sitio web de billetera electrónica para aprender los conceptos básicos de encriptación y manejo de cuentas, transacciones y saldos en Bitcoin.

Quiero aprender a hacer un sitio web donde la base de datos no contenga datos privados de nadie.

¿Qué algoritmo de cifrado y hash del lado del cliente debo usar? ¿Qué algoritmo o proceso debo usar para garantizar que los datos cifrados y hash de los usuarios estén seguros en el servidor?

Usando brainwallet , el proceso para la creación de la cuenta es este:

  1. El cliente crea una clave privada.
  2. El usuario ingresa un nombre de usuario/contraseña
  3. El cliente cifra la clave privada con una contraseña. El cliente codifica la contraseña y el nombre de usuario. El cliente envía datos al servidor.
  4. El servidor almacena el nombre de usuario/contraseña con hash y la clave privada cifrada en la base de datos.

Ahora, cada vez que un usuario desea realizar una transacción en mi sitio, intento usar Brainwallet para enviar transacciones. El proceso para esto será:

  1. El usuario escribe un nombre de usuario y una contraseña.
  2. El cliente envía un nombre de usuario/contraseña hash al servidor.
  3. El servidor responde con una clave privada cifrada para ese usuario.
  4. El cliente descifra la clave privada con una contraseña.

Como nota al margen: ¿es este un proceso sólido para almacenar y transmitir datos al servidor?

Respuestas (1)

Estoy planeando construir un pequeño sitio web de billetera electrónica para aprender los conceptos básicos de encriptación y manejo de cuentas, transacciones y saldos en Bitcoin.

Este no es realmente el lugar para aprender. Incluso los servicios de Bitcoin más reforzados son atacados con regularidad.

Usando brainwallet, el proceso para la creación de una cuenta es este:

Las "carteras cerebrales" son una forma increíblemente fácil para que los usuarios pierdan todos sus fondos. Sucede todos los días. ¿Crees que tu oración de 8 palabras es lo suficientemente fuerte? Lo más probable es que no lo sea, y hay al menos tres bots que vaciarán la billetera en segundos después de recibir fondos.

Ahora, cada vez que un usuario desea realizar una transacción en mi sitio, intento usar Brainwallet para enviar transacciones.

El código al que hace referencia es solo una interfaz para blockchain.info y la biblioteca bitcoinjs.

Como nota al margen: ¿es este un proceso sólido para almacenar y transmitir datos al servidor?

Blockchain.info usa este método para su billetera web, pero no, es muy inseguro y ofrece muy poca seguridad. Si su servidor está comprometido, las claves aún lo están. Si es malicioso, puede simplemente hacer una puerta trasera a la secuencia de comandos del cliente y nadie lo sabrá. No es seguro, y un servicio que utiliza este tipo de sistema no debería anunciarse como tal.

El código de la billetera cerebral que vinculé no es una billetera cerebral real, es una implementación de javascript de generación de direcciones y creación/firma de transacciones. Creo que la seguridad que se obtiene al almacenar una clave privada cifrada en lugar de una clave privada de texto sin formato es significativa. Al final del día, si un usuario va a usar una billetera web, elegirá blockchain.info sobre cualquier competidor que tenga acceso a su clave privada en texto sin formato.
Blockchain.info tiene acceso a las claves privadas de todos modos, tendrías que ser un tonto para creer lo contrario. Si no son ellos, alguien con root en sus cajas, o alguien en cloudflare, o el conserje en el centro de datos. La criptografía basada en JavaScript no puede y nunca será segura cuando el código que protege los datos se carga desde un servidor posiblemente adversario. Incluso si no hubiera una puerta trasera (no digo que la haya), cualquier cifrado JS es débil y lento, lo que se ve agravado por el hecho de que los usuarios eligen contraseñas incorrectas. Es mejor renunciar al velo de la falsa seguridad y almacenar las claves del lado del servidor.