2009-01-14 19 views
17

Estaba pensando en hacer una pequeña herramienta. No es importante lo que hará la herramienta. Lo importante es que la herramienta necesitará almacenar cierta información sensible en la unidad de disco duro del usuario. EDITAR: La información que se almacenará es información del USUARIO: no estoy tratando de proteger mi propio contenido, que distribuyo con la aplicación.¿Hay algún tipo de almacenamiento local seguro en Windows?

Entiendo que necesito encriptar esta información. Pero entonces, ¿dónde guardo con seguridad la contraseña de cifrado? Es una especie de recursión infinita ...

Entonces, ¿hay alguna forma de encriptar información en Windows y tener ventanas que administren las contraseñas de forma segura? Cuando digo ventanas me refiero a Windows XP SP2 o posterior.

También debo tener en cuenta que los usuarios en el mismo sistema no deben tener acceso a la información de otros usuarios (incluso cuando ambos ejecutan mi aplicación).

Estoy buscando soluciones de .NET 2.0 (C#) y nativas (C/C++) para este problema.

Respuesta

20

¿Hay alguna manera de encriptar información en Windows y tener ventanas que administren las contraseñas de forma segura?

CryptProtectData: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx

El uso de .NET: http://msdn.microsoft.com/en-us/library/aa302402.aspx

Históricamente, almacenamiento protegido (disponible en XP, de sólo lectura en Vista +): http://msdn.microsoft.com/en-us/library/bb432403%28VS.85%29.aspx

+3

Para .NET 2.0+, use la clase System.Security.Cryptography.ProtectedData en lugar del segundo enlace de @ bobince. – devstuff

3

Puede usar la función de cifrado nativo. Establezca el atributo de cifrado en su carpeta o archivo (desde la página de propiedades, haga clic en el botón "avanzado"). Luego puede configurar los usuarios que pueden acceder al archivo (de manera predeterminada, esto solo incluye el creador del archivo). La gran ventaja de esta solución es que es totalmente transparente desde la aplicación y los puntos de vista de los usuarios.

Para hacerlo mediante programación: utilizando la API de Win32, llame al EncryptFile() en el directorio donde desea almacenar sus datos confidenciales por usuario. A partir de ahora, todos los archivos recién creados dentro de este directorio serán encriptados y solo podrán ser leídos por su creador (que sería el usuario actual de su aplicación). Alternativamente, puede usar el indicador FILE_ATTRIBUTE_ENCRYPTED en archivos individuales en el momento de la creación. Puede verificar la información de cifrado desde el explorador en la página de propiedades del archivo y ver que los archivos creados por la aplicación estén correctamente encriptados y restringidos a sus respectivos usuarios. No hay una contraseña para almacenar o usar, todo es transparente.

Si desea ocultar los datos de todos los usuarios, puede crear un usuario especial específico de la aplicación y suplantarlo desde su aplicación. Esto, junto con las ACL, es la técnica bendecida en Windows para los servicios del sistema.

+0

¿Puedo configurarlo desde el código? ¿Como de .NET C# o aplicación nativa de C++? – Paulius

+0

Eso no ayuda cuando se distribuye el código/herramienta a otros ... – xan

+0

Bueno, la información debe ser ingresada primero por el usuario, y luego mi aplicación debería almacenarla de manera segura. Entonces, si puedo crear dicho archivo desde mi aplicación, podría funcionar. – Paulius

2

Es posible que desee ver Almacenamiento aislado, que es una manera de almacenar automáticamente la configuración y otros datos en un datos por aplicación. Vea un example y MSDN.

Esta es una alternativa para almacenar las configuraciones normales en el registro, una mejor en muchos casos ... No estoy seguro de cómo se almacenan los datos en el archivo, sin embargo, así que necesitaría verificar, no lo haría No quiero que sea accesible, incluso encriptado, a otros usuarios. Desde la memoria solo la aplicación. eso creó el almacenamiento puede abrirlo, pero eso necesita verificación.

Editar:

de la memoria cuando utilicé esta última, un buen enfoque es escribir una clase de "ajuste" que se ocupa de todos los ajustes etc. en su aplicación. Esta clase tiene el equivalente de los métodos Serialize y DeSerialize que le permiten escribir todos sus datos en un archivo IsolatedStorage, o cargarlos de nuevo. La ventaja adicional de implementarlo de esta manera es que puede usar atributos para marcar bits de la fuente y luego puede usar una cuadrícula de propiedad para darle rápidamente control de configuración de usuario (la propiedad Grid manipula las propiedades de clase en tiempo de ejecución usando la reflexión).

+0

Estoy leyendo los documentos ahora. Esto parece prometedor ... – Paulius

+4

De MSDN: "No use almacenamiento aislado para almacenar secretos de alto valor, como claves o contraseñas no encriptadas, porque el almacenamiento aislado no está protegido de código altamente confiable, de código no administrado o de usuarios de confianza de el ordenador." – Casebash

+0

@Casebash Gracias por la actualización. – xan

-5

Erm hash la contraseña? No es necesario almacenar el trato real en ninguna parte de la máquina con una contraseña hash (posiblemente también salada). Luego, cuando el usuario ingresa su contraseña, realiza la misma operación y la compara con la hash que ha almacenado en el disco.

+0

Ese es el punto: ni siquiera quiero pedirle al usuario una contraseña. El objetivo de mi aplicación, es que si el usuario ya inició sesión en Windows, entonces él es quien dice ser.Entonces esto no funcionaría para mí. – Paulius

+0

Si el usuario ya inició sesión, ¿por qué te molestas en utilizar una contraseña en primer lugar? – liggett78

+0

Porque la información que se almacenará en un archivo externo (o lo que sea) no debe ser accesible desde otro usuario (si alguien más inicia sesión en su propia cuenta de Windows). – Paulius

0

Te recomiendo que consultes el Bloque de aplicaciones de criptografía de la biblioteca empresarial. Compruebe esto blog post. Windows tiene una API de protección de datos integrada para cifrar datos, pero el Bloque de aplicaciones criptográficas lo hace más sencillo.

-4

Um, lo que está tratar de lograr es exactamente lo que DRM intentó lograr. Encripta algo y luego dale al usuario las claves (aunque estén ofuscadas) y la criptografía. Lo hicieron con DVD. Lo hicieron con Blu-Ray. Lo hicieron con iTunes.

Lo que estás proponiendo hacer nunca será seguro. El profano promedio probablemente no lo resuelva, pero cualquier atacante suficientemente motivado lo resolverá y descubrirá las claves, el algoritmo y descifrará los datos.

Si todo lo que hace es encriptar los datos del usuario, pida al usuario su contraseña. Si intenta proteger sus datos internos del usuario que ejecuta la aplicación, es S.O.L.

+0

¿Qué es S.O.L.? De todos modos, no estoy tratando de lograr lo mismo que DRM. No estoy tratando de cifrar MIS archivos, que luego distribuiría con la aplicación. Necesito una forma de encriptar la información del USUARIO, que HE/SHE ingresará en mi APLICACIÓN (la información debe almacenarse para usarla luego desde dentro de mi computadora). aplicación). – Paulius

+0

S.O.L. = "S ** t Outta Luck" –

3

Debería considerar usar DPAPI para este propósito. Encriptará sus datos con una clave simétrica especial (interna) que está en función del usuario. Ni siquiera necesita pedir contraseñas en este caso, porque los diferentes usuarios en el sistema tendrán diferentes claves asignadas.

La desventaja de esto podría ser que no puede recuperar los datos si el usuario es eliminado/Windows reinstalado (creo que este es el caso, aunque no del todo seguro). En ese caso, encripte los datos con una clave "autogenerada" derivada de la contraseña y almacene la contraseña en el registro/archivo cifrado mediante DPAPI.

+0

Enlace a los documentos para .NET 2.0 y posterior: http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx – liggett78

+0

Bueno, mientras los datos son confidenciales, puedo suponer con seguridad, que el usuario puede volver a ingresar los datos en caso de una reinstalación de Windows. Después de todo, así es como obtengo los datos, en primer lugar, el usuario los ingresa, y luego mi aplicación simplemente lo recuerda automáticamente. – Paulius

Cuestiones relacionadas