Autor
|
Tema: Proteger par de claves RSA (Leído 7,770 veces)
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
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.
|
|
|
En línea
|
|
|
|
~
|
Aplicar SHA3-512 a la contraseña y recalcularla cada vez que se desencripte para comparar. No almacenar ese hash ni la contrasea.
|
|
|
En línea
|
|
|
|
arget
Desconectado
Mensajes: 44
|
~ (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.
|
|
|
En línea
|
La gestión manual de bloques de memoria en C es como hacer malabarismos con pastillas de jabón en la ducha de la prisión: todo diversión hasta que cometes un fallo.
|
|
|
kub0x
Enlightenment Seeker
Moderador
Desconectado
Mensajes: 1.486
S3C M4NI4C
|
Buenas Alberto, he posteado en cryptostackexchange una pregunta relacionada con tu cuestión -> https://crypto.stackexchange.com/questions/34155/storing-rsa-private-keySi 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!
|
|
|
En línea
|
|
|
|
kub0x
Enlightenment Seeker
Moderador
Desconectado
Mensajes: 1.486
S3C M4NI4C
|
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!
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
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.
|
|
|
En línea
|
|
|
|
arget
Desconectado
Mensajes: 44
|
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.
|
|
|
En línea
|
La gestión manual de bloques de memoria en C es como hacer malabarismos con pastillas de jabón en la ducha de la prisión: todo diversión hasta que cometes un fallo.
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[MOD] Proteger CD
Software
|
darth davers
|
1
|
5,035
|
25 Mayo 2005, 19:31 pm
por el-brujo
|
|
|
Proteger mi CD please
Software
|
Leodark
|
1
|
3,036
|
28 Mayo 2005, 00:08 am
por + enrique ZP
|
|
|
Proteger DVD
Multimedia
|
SatDio
|
1
|
2,658
|
15 Agosto 2005, 13:57 pm
por Songoku
|
|
|
Proteger DVD
Multimedia
|
clopezar
|
0
|
1,804
|
11 Marzo 2006, 04:51 am
por clopezar
|
|
|
Generador en Java : Crea claves seguras WPA y WPA2 para proteger tu red WiFi
Noticias
|
wolfbcn
|
1
|
4,614
|
14 Febrero 2012, 16:14 pm
por MauroMasciar
|
|