2008-09-02 36 views
31

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.¿Cómo almacenar contraseñas en la aplicación Winforms?

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

No importa qué enfoque que trataron (como SecureString), soy fácilmente capaz de ver la contraseña (m_pwd) ya sea utilizando la pestaña del reflector o el uso de cadenas de explorador de procesos para el ejecutable.

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

¿Alguien puede 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.

Respuesta

24

el método santificado es utilizar CryptoAPI y la API de protección de datos

para cifrar, usar 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; 

descifrado es todo lo contrario:

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 se especifica a continuación CRYPTPROTECT_LOCAL_MACHINE la contraseña cifrada se puede almacenar de forma segura en el archivo de registro o de configuración y sólo puede descifrarlo. Si especifica LOCAL_MACHINE, cualquiera con acceso a la máquina puede obtenerlo.

2

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

4

Encontré este libro de keith Brown .NET Developer's Guide to Windows Security. Tiene algunas buenas muestras que cubren todo tipo de escenarios de seguridad. Gratis Online version también está disponible.

11

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.

+1

¿Hay algún ejemplo en la web sobre cómo se hace esto? – karlipoppins

+1

@m_oLogin: vea una de mis otras respuestas [aquí] (http://stackoverflow.com/questions/154430/persistent-storage-of-encrypted-data-using-net/154687#154687) –

Cuestiones relacionadas