windows security encryption .net-2.0 native

¿Hay algún tipo de almacenamiento local seguro en Windows?



security encryption (7)

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.

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 manera 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 señalar 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.


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.


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.


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 a EncryptFile() en el directorio donde desea almacenar sus datos confidenciales por usuario. De ahora en adelante, 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.


Te recomiendo que consultes el Bloque de aplicaciones de criptografía de la biblioteca empresarial. Mira esta publicación en el blog . 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.


Um, lo que estás tratando 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 propones 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 y luego pídale al usuario su contraseña. Si intenta proteger sus datos internos del usuario que ejecuta la aplicación, es SOL


Es posible que desee ver Almacenamiento aislado, que es una forma de almacenar configuraciones y otros datos en una aplicación por datos automáticamente. Vea un ejemplo y MSDN .

Esta es una alternativa para almacenar 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 querría para ser 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 la última vez que utilicé esto, un buen enfoque es escribir una clase "Configuración" que maneje todas las configuraciones, 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 Cuadrícula de propiedad manipula propiedades de clase en tiempo de ejecución usando reflexión) .