Cómo obtener de forma segura una segunda contraseña específica para un usuario

4

Le estoy dando a cada uno de mis usuarios una billetera Blocktrail única que está protegida por dos claves API (que el servidor conoce) y una frase de contraseña (única para cada billetera).

Quiero que la frase de contraseña de la billetera no esté disponible para nadie, excepto para el usuario que ha iniciado sesión (sesión persistente), para que nadie, ni siquiera los administradores del servidor, puedan mirar la contraseña de la billetera y hacer transacciones desde la billetera.

Ya estoy cifrando las contraseñas de las cuentas de usuario con bcrypt.

Esto es lo que idealmente me gustaría implementar:

  • Una frase de contraseña a la que solo un usuario que tiene acceso "tiene acceso". (No directamente, sino a través de su sesión).
  • Que la frase de contraseña está disponible para cuando el usuario decide hacer una transacción desde dentro de la interfaz de usuario del cliente (la frase de contraseña es necesaria en para realizar transacciones), pero que el usuario no está obligado a escribir en una segunda contraseña o escriba la contraseña de su cuenta cada vez.
  • Que nadie sea capaz de saber cuál es la frase de contraseña para un determinado usuario, no administradores de servidor que buscan en bases de datos / sesiones de servidor, no hackers en el servidor y escribir scripts que pierden la frase de contraseña, no yo mismo.

¿Es esto posible? Supongo que, de alguna manera, tendría que obtener un hash de la contraseña del usuario antes de cifrarla con bcrypt, usarla como frase de contraseña y almacenarla en la sesión, o probablemente en una cookie (¿con seguridad adicional?). Pero, de nuevo, los administradores que se encuentran en el servidor pueden ver lo que está almacenado en cada sesión, recuperar la frase de contraseña y robar los bitcoins, ¿verdad? Y también, creo que almacenar una contraseña con hash del lado del cliente no sería una buena idea.

Soy realmente nuevo en seguridad, por lo que no tengo idea de cuál sería el mejor enfoque para esto. ¿O quizás estoy siendo demasiado paranoico, y debería usar la contraseña cifrada o una cadena aleatoria (almacenada en una base de datos) como frase de contraseña de la billetera? (Teniendo en cuenta que también se requieren dos claves API).

Sólo estoy buscando una pista en la dirección correcta, ya que ni siquiera sé si lo que quiero es alcanzable. Gracias.

    
pregunta Tarman 29.06.2015 - 02:20
fuente

2 respuestas

1
  

Quiero que la frase de contraseña de la billetera no esté disponible para nadie, excepto para el usuario que ha iniciado sesión (sesión persistente), para que nadie, ni siquiera los administradores del servidor, puedan mirar la contraseña de la billetera y hacer transacciones desde la billetera.

     
  • Nadie puede saber cuál es la frase de contraseña para ningún usuario específico, ni los administradores del servidor que buscan en las bases de datos / sesiones del servidor, ni los piratas informáticos que ingresan al servidor y escriben scripts que filtran la frase de contraseña, no yo.
  •   

Si bien puede proteger esto contra el almacenamiento, un Administrador puede incluir un registro adicional para capturar esta información . No hay nada que pueda hacer al respecto, excepto guardar el secreto en el Cliente como @ Ethan sugirió . (lo que podría ser mejor o peor para la seguridad dependiendo de quiénes sean sus clientes)

Voy a responder con la suposición de que usted decidió que el servidor necesita acceso al secreto directamente . (en cuyo caso, el almacenamiento en el cliente no tendría sentido)

Puede evitar el almacenamiento en el servidor , suponiendo que no se haya instalado ningún registro malicioso.

  

Ya estoy cifrando las contraseñas de las cuentas de usuario con bcrypt.

El cifrado es reversible con la clave. Hashes son de un solo sentido. BCrypt es un hash, no cifrado. (y eso es algo bueno)

Asegúrese de tener un factor de trabajo sólido. Debería tomar al menos 100 ms (con la protección DoS adecuada) para calcular el hash de BCrypt. Tenga en cuenta que el hardware del atacante (si se roba el hash) probablemente calculará estos hashes mucho más rápido cuando intenten la fuerza bruta.

  

Una frase de contraseña a la que solo un usuario que tiene acceso "tiene acceso". (No directamente, sino a través de su sesión).

Cuando el usuario inicie sesión, el servidor tendrá la información necesaria para descifrar el secreto.

  

no se requiere que escriba una segunda contraseña o escriba la contraseña de su cuenta cada vez.

Habrá alguna contraseña que descifre el secreto inicialmente. Esta puede ser la primera contraseña que usan para iniciar sesión o una contraseña "especial" si lo prefiere. Después de eso, el secreto estará continuamente disponible como parte de la sesión de inicio de sesión.

  

¿Es esto posible?

Buena pregunta. La respuesta es Sí, he descrito cómo se puede hacer esto en la siguiente pregunta. Básicamente, solo necesita derivar claves de cifrado a partir de la contraseña del usuario y luego del token de sesión. Ambos deben estar marcados (no solo la contraseña) para que el atacante no pueda acceder al texto original del que se derivó la clave de cifrado. El token de sesión debe tener suficiente entropía para que puedas usar un hash rápido.

Una vez que haya resuelto la administración de la clave de cifrado, puede almacenar el secreto cifrado en el servidor.

¿Cómo podemos servir datos confidenciales cifrados sin almacenar la clave? ¿Debo usar contraseñas definidas por el usuario para las claves?

Excepto, en su caso, en lugar de servir los datos cifrados, simplemente los usará internamente en el servidor.

Lea esto una vez más y publique una nueva pregunta o comentario si no entiende cómo puede aplicarse a su situación.

Y, por supuesto, asegúrese de que su aplicación esté segura de los atacantes (no administradores) para empezar. Esa es la cosa mas importante.

    
respondido por el George Bailey 08.09.2016 - 16:07
fuente
-4

Espero que esté entendiendo la pregunta correctamente, pero ¿por qué no mezclar la frase de contraseña con SHA-256 y almacenar el resultado en una db? No hay una clave de cifrado, por lo que no puede revertirla y, si alguien consigue el hash y lo envía, se volverá a hash y se volverá inválido.

    
respondido por el user3632719 29.06.2015 - 04:48
fuente

Lea otras preguntas en las etiquetas