todas para mis informacion guardar gratis contraseñas confidencial claves app aplicacion administrador winforms security passwords

para - ¿Cómo almacenar contraseñas en la aplicación Winforms?



guardar claves gratis (4)

Tengo un código como este en una aplicación de winforms que estaba escribiendo para consultar el cupo de almacenamiento del buzón de un usuario.

DirectoryEntry mbstore = new DirectoryEntry( @"LDAP://" + strhome, m_serviceaccount, [m_pwd], AuthenticationTypes.Secure);

SecureString enfoque que probé (como SecureString ), puedo ver fácilmente la contraseña ( m_pwd ) usando Reflector o usando la pestaña de cadenas del Explorador de procesos para el ejecutable.

Sé que podría poner este código en el servidor o reforzar la seguridad utilizando mecanismos como la delegación y otorgando solo los privilegios necesarios a la cuenta del servicio.

¿Puede alguien sugerir una forma razonablemente segura de almacenar la contraseña en la aplicación local sin revelar la contraseña a los piratas informáticos?

Hashing no es posible ya que necesito saber la contraseña exacta (no solo el hash para hacer coincidir). Los mecanismos de cifrado / descifrado no funcionan, ya que dependen de la máquina.


Como se mencionó, la API de protección de datos es una buena forma de hacerlo. Tenga en cuenta que si usa .NET 2.0 o superior, no necesita usar P / Invoke para invocar el DPAPI. El marco envuelve las llamadas con la clase System.Security.Cryptography.ProtectedData.


El método santificado es usar CryptoAPI y las API de protección de datos.

Para encriptar, use algo como esto (C ++):

DATA_BLOB blobIn, blobOut; blobIn.pbData=(BYTE*)data; blobIn.cbData=wcslen(data)*sizeof(WCHAR); CryptProtectData(&blobIn, description, NULL, NULL, NULL, CRYPTPROTECT_LOCAL_MACHINE | CRYPTPROTECT_UI_FORBIDDEN, &blobOut); _encrypted=blobOut.pbData; _length=blobOut.cbData;

El descifrado es lo opuesto:

DATA_BLOB blobIn, blobOut; blobIn.pbData=const_cast<BYTE*>(data); blobIn.cbData=length; CryptUnprotectData(&blobIn, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &blobOut); std::wstring _decrypted; _decrypted.assign((LPCWSTR)blobOut.pbData,(LPCWSTR)blobOut.pbData+blobOut.cbData/sizeof(WCHAR));

Si no especifica CRYPTPROTECT_LOCAL_MACHINE, la contraseña cifrada puede almacenarse de manera segura en el registro o archivo de configuración y solo usted puede descifrarla. Si especifica LOCAL_MACHINE, cualquiera con acceso a la máquina puede obtenerlo.


Encontré este libro de Keith Brown. La Guía del desarrollador de .NET para la seguridad de Windows. Tiene algunas buenas muestras que cubren todo tipo de escenarios de seguridad. La versión gratuita en línea también está disponible.


Si lo almacena como una cadena segura y guarda la cadena segura en un archivo (posiblemente usando Almacenamiento aislado , la única vez que tendrá una contraseña de texto plano es cuando la descifre para crear su mbstore. Desafortunadamente, el constructor no toma una SecureString o un objeto Credential.