Estoy creando una aplicación para Windows, en la que primero debes iniciar sesión.
Los detalles de la cuenta consisten en nombre de usuario y contraseña, y deben guardarse localmente.
Es solo una cuestión de seguridad, por lo que otras personas que usan la misma computadora no pueden ver los datos personales de todos.
¿Cuál es la forma mejor / más segura de guardar estos datos?
No quiero usar una base de datos, así que probé algunas cosas con los archivos de recursos.
Pero como soy un poco nuevo con esto, no estoy completamente seguro de lo que estoy haciendo y dónde debería buscar una solución.
Respuestas:
Si solo va a verificar / validar el nombre de usuario y la contraseña ingresados, use la clase Rfc2898DerivedBytes (también conocida como Función de derivación de clave basada en contraseña 2 o PBKDF2). Esto es más seguro que usar cifrado como Triple DES o AES porque no existe una forma práctica de pasar del resultado de RFC2898DerivedBytes a la contraseña. Solo puede pasar de una contraseña al resultado. Consulte ¿Está bien usar el hash de contraseña SHA1 como una sal al derivar la clave de cifrado y el IV de la cadena de contraseña? para ver un ejemplo y una discusión para .Net o String encriptar / desencriptar con contraseña c # Estilo Metro para WinRT / Metro.
Si está almacenando la contraseña para reutilizarla, por ejemplo, proporcionándola a un tercero, utilice la API de protección de datos de Windows (DPAPI) . Utiliza claves protegidas y generadas por el sistema operativo y el algoritmo de cifrado Triple DES para cifrar y descifrar la información. Esto significa que su aplicación no tiene que preocuparse por generar y proteger las claves de cifrado, una de las principales preocupaciones al utilizar la criptografía.
En C #, use la clase System.Security.Cryptography.ProtectedData . Por ejemplo, para cifrar un dato, utilice
ProtectedData.Protect()
:Almacene la entropía y el texto cifrado de forma segura, como en un archivo o clave de registro con permisos establecidos para que solo el usuario actual pueda leerlos. Para acceder a los datos originales, use
ProtectedData.Unprotect()
:Tenga en cuenta que existen consideraciones de seguridad adicionales. Por ejemplo, evite almacenar secretos como contraseñas como
string
. Las cadenas son inmutables, ya que no se pueden notificar en la memoria, por lo que alguien que mire la memoria de la aplicación o un volcado de memoria pueda ver la contraseña. Use SecureString o un byte [] en su lugar y recuerde deshacerse de ellos o ponerlos a cero tan pronto como la contraseña ya no sea necesaria.fuente
ProtectedData
es que no necesito preocuparme por Almacenar la entropía y el texto cifrado de forma segura, ... para que solo el usuario actual pueda leerlo . Creo que ofrece simplicidad en el sentido de que puedo almacenarlos, sin embargo, es conveniente y aún así, solo el CurrentUser puede descifrarlo. Elentropy
parámetro también es opcional y parece similar a un IV donde la singularidad importa más que el secreto. Como tal, el valor probablemente podría omitirse o codificarse en el programa en situaciones en las que la variación y actualización del texto sin formato es poco frecuente.He usado esto antes y creo que para asegurarme de que la credencial persista y de la mejor manera segura
ConfigurationManager
claseSecureString
claseCryptography
espacio de nombres.Este enlace será de gran ayuda espero: Haga clic aquí
fuente
DPAPI es solo para este propósito. Utilice DPAPI para cifrar la contraseña la primera vez que el usuario ingrese, guárdelo en una ubicación segura (el registro del usuario, el directorio de datos de la aplicación del usuario, son algunas opciones). Siempre que se inicie la aplicación, verifique la ubicación para ver si su clave existe, si usa DPAPI para descifrarla y permitir el acceso; de lo contrario, deniéguela.
fuente
Esto solo funciona en Windows, por lo que si planea usar la plataforma cruzada de dotnet core, tendrá que buscar en otra parte. Consulte https://github.com/dotnet/corefx/blob/master/Documentation/architecture/cross-platform-cryptography.md
fuente
Quería cifrar y descifrar la cadena como una cadena legible.
Aquí hay un ejemplo rápido muy simple en C # Visual Studio 2019 WinForms basado en la respuesta de
@Pradip
.Haga clic derecho en proyecto> propiedades> configuración> Crear una configuración
username
ypassword
.Ahora puede aprovechar la configuración que acaba de crear. Aquí guardo el
username
y,password
pero solo cifro elpassword
campo de valor respetable en eluser.config
archivo.Ejemplo de la cadena cifrada en el
user.config
archivo.Código completo
fuente