En el proceso de diseño de una aplicación web que maneja pares de claves públicas / privadas, específicamente una aplicación web de Bitcoin, he pensado mucho sobre cómo manejar de manera segura el almacenamiento de la clave privada, ya que, utilizando un Por analogía bancaria, si alguien tiene acceso a la clave privada de Bitcoin de un usuario, tiene acceso a todos los Bitcoins de ese usuario.
En todos los escenarios, la clave privada se cifrará en una base de datos lo más segura posible, sin acceso directo a Internet, privilegios explícitos de lectura / escritura, etc., pero la parte que estoy tratando de determinar y descubrir. La mejor solución es el engaño de la clave privada. Puedo hacerlo en el lado del cliente, es decir, en el navegador del usuario o en el lado del servidor.
Si lo hago en el lado del servidor, podría asegurarme de que se genere y cifre de manera criptográfica, pero si una persona maliciosa obtiene acceso al servidor, esa persona maliciosa podrá acceder a cualquier clave privada descifrada en la memoria. Podría enviarlo al navegador para que lo guarde en su almacenamiento, pero eso puede generar problemas de ataques de intermediario al poder leer la clave privada en tránsito. Todo el descifrado / cifrado de la clave privada se realizará en el servidor, incluso cuando la clave privada se genere por primera vez.
Si lo hago desde el lado del cliente, no tendría que preocuparme por que una persona maliciosa obtenga la clave privada descifrada de mi servidor como lo estaría descifrando en el navegador, pero debido a que la criptografía Javascript no es tan fuerte como otros métodos Es posible que las claves privadas cifradas no sean tan seguras en el almacenamiento y se puedan comprometer más fácilmente en el caso de robo de datos.
Originalmente me inclinaba a hacer el cifrado / descifrado y la generación de pares de claves en el lado del cliente, pero ahora no estoy tan seguro y para mí parece que ambos tienen preocupaciones válidas. Teniendo en cuenta el estado del navegador moderno y sus avances en la criptografía de Javascript, ¿son los beneficios / riesgos del cifrado / descifrado en el navegador mejores que los beneficios / riesgos de hacerlo en el servidor? Tenga en cuenta que para esta situación, solo considere que la clave privada solo residirá en la memoria del servidor o en el navegador en la memoria / almacenamiento local.