Foro de elhacker.net

Seguridad Informática => Criptografía => Mensaje iniciado por: AlbertoBSD en 29 Marzo 2016, 15:06 pm



Título: Proteger par de claves RSA
Publicado por: AlbertoBSD en 29 Marzo 2016, 15:06 pm
Buen dia foro. Estoy viendo las alternativas para proteger el par de claves RSA.

Tengo este programa en el que estoy trabajando, un projecto personal.

El programa genera el par de claves RSA de 1024 o 2048 con la API de libgcrypt, ya puedo cifrar y firmar los archivos con dicha clave.

El programa es mas o menos autonomo, he visto que normalmente se trabaja con un password para cifrar las claves con AES o algun otro algoritmo de cifrado simetrico, y asi solo la persona que conoce el password tiene acceso al par de claves.

Pero como mi programa es autonomo estoy buscando una alternativa mis idias son las siguientes.

  • Buscar un tipo de UUID en la maquina y usar su sha256 de password
  • Generar un archivo random y usar su sha256 de password
  • hardcodear el password en la aplicacion (mala idea) pero es una opcion

¿Alguna otra?

¿Que suguieren ustedes?

Saludos.


Título: Re: Proteger par de claves RSA
Publicado por: ~ en 29 Marzo 2016, 17:32 pm
Aplicar SHA3-512 a la contraseña y recalcularla cada vez que se desencripte para comparar. No almacenar ese hash ni la contrasea.


Título: Re: Proteger par de claves RSA
Publicado por: arget en 31 Marzo 2016, 22:58 pm
~ (así te llamas), eso no sirve, porque según entiendo pretende que su programa no dependa del usuario, es decir, que el usuario no tenga que lidiar con este en ningún momento. Esto exige claramente que el programa tenga los medios para obtener la clave. Esto es un grave problema, es equivalente a cerrar la puerta y dejar la llave al lado y (prácticamente) a la vista, cualquiera que acceda al ordenador tendrá acceso al archivo cifrado y su clave, aunque la clave se encuentre escondida o dentro del programa o donde sea, o incluso si la clave se genera en tiempo de ejecución, se puede reversear el programa para ver cómo se genera y obtenerla. Sin embargo, solo se me ocurren dos opciones:
La primera es mandar la clave a un servidor remoto con contraseña, esta contraseña podría ser la misma que la contraseña de login del usuario o una derivada de esta, la contraseña del usuario podrás arreglártelas lidiando con el sistema operativo para tener acceso a ella (se me puede ocurrir quizá en lugar de usar la contraseña en sí, usar una derivación del hash almacenado en /etc/shadow o en C:/WINDOWS/System32/config/*, no emplees el hash en sí, porque aunque sea el hash se puede intentar atacar si alguien lo captura on air, por supuesto la conexión con el servidor remoto debe ser segura, como SSH).
La segunda sería generar la contraseña en tiempo de ejecución de manera aleatoria, esto es, al ejecutar el programa por primera vez este aleatoriamente creará un algoritmo de generación de contraseña, este será codificado biinariamente de una manera que solo tu programa conocerá, en un archivo con los mismos permisos que el shadow, cuando se vuelva a ejecutar el programa, este leerá e interpretará el algoritmo escrito en dicho archivo, cogerá la variable del sistema necesaria para ejecutarlo (como bien dices puede ser el UUID de una partición en la máquina), completará el algoritmo a partir de esta variable y obtendrá la contraseña (evidentemente todos los datos confidenciales se deberán borrar inmediatamente mediante una función memset modificada para ello).
Todo esto solo molestará un poquito a cualquier atacante, sin embargo puedes y debes ofuscar el código (existen programas para eso). Eso fastidiará bastante más, de todas formas, solo retrasa lo inevitable. Todo esto dejando de lado que tu programa será de código cerrado, si es de código abierto todo será en vano.
Yo lo que te he propuesto es una forma de ofuscar el código, por supuesto lo puedes hacer todo mucho, muchísimo más lioso, pero esto es anticriptográfico, anti-principios de Kerkchoffs, la seguridad de un sistema no debe depender de que su diseño permanezca en secreto.

En realidad la solución más simple y correcta sería pedir una contraseña al usuario o emplear la contraseña de login del usuario obtenida tal cual (en texto plano) de la forma que veas (en relación con el SO), o su hash del shadow.


Título: Re: Proteger par de claves RSA
Publicado por: kub0x en 1 Abril 2016, 20:14 pm
Buenas Alberto,

he posteado en cryptostackexchange una pregunta relacionada con tu cuestión -> https://crypto.stackexchange.com/questions/34155/storing-rsa-private-key

Si sólo necesitaras implementar un protocolo de comunicación segura basada en criptografía híbrida (AES + RSA/DH/ECC) te recomendaría DHE o ECDHE pero veo que tienes que firmar no te queda otra que guardar la privada.

Saludos!


Título: Re: Proteger par de claves RSA
Publicado por: kub0x en 2 Abril 2016, 23:23 pm
Lo óptimo sería guardar la clave privada RSA cifrada con AES-GCM ya que GCM provee de aunteticación e integridad. De esta forma también puedes detectar modificaciones sobre el ciphertext.

Otras alternativas serían crear dos claves simétricas, una para AES-CBC y otra para CMAC, ambas derivadas de una MasterKey mediante una PRF (SHA-256 preferiblemente). Pero con GCM te ahorras el usar dos keys, es como aplicar un MAC al cifrado, todo en uno.

Saludos!


Título: Re: Proteger par de claves RSA
Publicado por: AlbertoBSD en 3 Abril 2016, 02:01 am
muchas gracias kub0x, voy a leer sobre los metodos de cifrado que comentas, te comento que apenas estoy aprendiendo de esto y todavia no entiendo todos los terminos, aun asi aprendo rapido.


Título: Re: Proteger par de claves RSA
Publicado por: arget en 3 Abril 2016, 20:36 pm
Kub0x, yo no sé si no he entendido su pregunta, pero creo que el busca almacenar de manera segura su clave privada. Es evidente que es necesario cifrarlo mediante un algoritmo simétrico, sin embargo, como comento arriba, si el texto cifrado y la clave se encuentran en el mismo sistema la seguridad es casi nula. Supongo que sería más pertinente hablar de la manera de almacenar de manera segura la contraseña simétrica en lugar de hablar de en qué algoritmo hay que emplearla.

Si me he perdido algo explicádmelo, por favor.


Título: Re: Proteger par de claves RSA
Publicado por: AlbertoBSD en 3 Abril 2016, 23:43 pm
Buen dia.

Al final he decidido guardarlas cifradas con AES128 utilizando un subconjunto del sha256 du uno de los archivos para password y otro para IV.

al final no hay tanto problema si alguien decompila el programa y deduce que subconjunto y que archivos son los que use y decifra las claves aun asi no podran hacer mucho el servidor esta mas protegido y el programa solo recive actualizaciones que vengan cifradas y firmadas por el servidor.