2011-08-31 30 views
12

Estoy escribiendo una aplicación C# que será de código abierto y necesito poder almacenar la información de inicio de sesión guardada para cada usuario. Normalmente, solo cifraría la contraseña y luego la almacenaría en un archivo de configuración del usuario, pero me preocupa que debido a que el código sea de código abierto, de alguna manera se derrota el punto de encriptación. Como todo lo que tendrían que hacer es mirar el código y agarrar la clave de encriptación.Almacenamiento de una contraseña guardada en la aplicación de Código abierto

De acuerdo, al menos lo haría mucho más difícil que la contraseña que se almacena en texto plano. Pero, ¿hay alguna forma decente de cifrar la contraseña, pero haciendo que sea al menos extremadamente difícil de descifrar, incluso si tuviera la fuente? Tal vez hacer que sea al menos casi imposible de descifrar en cualquier computadora que no sea la que fue encriptada?

EDIT: Aclaración ... Estoy almacenando contraseñas del lado del CLIENTE, NO las contraseñas para validar su inicio de sesión para el servicio. Es un cliente de un servicio web preexistente del que no tengo control. Solo quiero almacenar las contraseñas localmente para el inicio de sesión automático ... como lo haría cualquier cliente de chat.

EDIT 2: Lo siento por no haberlo hecho antes. Pero las contraseñas deben recuperarse en texto claro en algún momento y el hashing NO es una opción :(Incluso si el servicio me dejara pasar el hash de la contraseña que de alguna manera vencería el propósito porque el hash sería tan bueno como una contraseña: P

Respuesta

1

Creo que si utiliza Rijndal por ejemplo y crea valores de sal aleatorios y deriva las claves de elementos específicos de la máquina (como algunas ID de hardware) será difícil descifrar, incluso si sabe cómo funciona porque le falta la información del hardware.

Pero usted podría considerar el almacenamiento de hashes de contraseñas sólo los e iterar al menos 1000 veces. los valores hash no puede ser covnerted de nuevo a la contraseña original.

Otra idea más: ¿Sería una opción dejar la implementación a quien recurra a su fuente y hacer el resumen de encriptación? No funciona, por supuesto, si ofrece un paquete integrado para descargar. Pero, de nuevo: en la compilación puede usar su propio cifrado "secreto" y stull tenerlo abstracto en la fuente.

+0

No entiendo lo que quiere decir acerca de los hashes ... Necesito el texto claro y actual de la contraseña en algún momento porque debe ser pasado de mi cliente al servicio (que es una conexión encriptada) y no puede ser un hash. –

+0

A partir de la contraseña que recibe, simplemente calcule nuevamente el hash y compárelo con el hash que guardó en el DB. Si coinciden, las contraseñas coinciden. Por supuesto, si necesita la contraseña para iniciar sesión en otro lugar desde su servidor, esto no lo ayudará. – Krumelur

+3

Cambió la pregunta en parte, clarificando realmente, votar abajo es un título injusto. – Lloyd

0

Tal vez pueda encriptar la contraseña utilizando algunos valores específicos de la máquina, como Mac o sth .. Si alguien obtiene la fuente y la contraseña cifrada pero no tiene acceso completo a la contraseña del equipo debe estar seguro.

+0

los valores mac no son seguros. Considere cuán fácil es obtener el valor de mac de una computadora –

+0

Tiene razón, todavía estaba pensando en fuentes no abiertas. De todos modos, la idea es obtener valores específicos de la máquina. – szamil

7

Lo que estás preguntando es básicamente imposible.

Hay no manera de almacenar con seguridad una contraseña en una máquina cliente si es necesario descifrarla. Esto se ve agravado por el hecho de que lo necesita para conectarse a un servicio, que supongo que no es compatible con SSL. En este caso, se podría encontrar trivialmente la contraseña utilizando un analizador de red.

Existe un juego (de código cerrado, por supuesto) Juego que requiere un nombre de usuario, la contraseña se guarda en alguna parte pero está encriptada con una clave que es única para cada instalación.Olvidé la contraseña una vez, así que acabo de usar Wireshark, y listo - Pude ver la contraseña simple.

Esto también me recuerda a las personas quejándose de que es fácil revelar contraseñas en Google Chrome ... Obviamente no lo saben mejor. Puede probar todos los trucos inteligentes que desee, pero cualquier seguridad de la aplicación se descarta una vez que alguien tiene acceso a la máquina.

Por lo tanto, con esto en mente, mantendría el cifrado y descifrado realmente simple. En el mejor de los casos, puede crear una clave derivada de algo unique to the machine, de modo que alguien que robe la contraseña cifrada no podrá descifrarla sin acceder a dicha clave única.

+0

Afortunadamente, el servicio proporciona SSL. Y sí, sé que la única manera totalmente segura es hacer que el usuario ingrese la contraseña CADA vez, pero creo que la mayoría está dispuesta a renunciar a un poco de seguridad por eso. –

+0

, así que proporcione algún tipo de token del servidor con algún tipo de validez ... no es a prueba de fuego pero es tan bueno como puede obtener –

+0

¿Podría mencionar algún algoritmo que pueda usar para encriptar la contraseña? –

0

Y podría usar el cifrado de muñeca babushka. Cifras la contraseña con otra contraseña, luego la encriptas con otra contraseña y muchas veces la escribes con un texto claro. Cualquier persona que quiera acceder a la contraseña de orignal se cansará de descifrar y abandonar antes de acceder a la contraseña original.

+0

No estoy seguro de que deba perder puntos porque no tienes sentido del humor. – oenpelli

Cuestiones relacionadas