¿Cómo guardo y recupero las credenciales del administrador de credenciales de Windows Vault?

Quiero almacenar de forma segura una contraseña de texto claro en una PC con Windows. Actualmente estoy usando DPAPI CryptProtectData para encriptarlo, luego CryptProtectData el blob cifrado en un archivo en el AppData local del usuario.

En Windows 7, hay Windows Vault, un administrador de credenciales (Panel de control \ Cuentas de usuario y Seguridad familiar \ Administrador de credenciales) que almacena los datos de inicio de sesión para una variedad de tipos de inicio de sesión, incluida la “credencial genérica”. En la superficie, este parece el lugar correcto para que un progtwig almacene credenciales. Sin embargo, no pude encontrar ninguna API para ello. Leí la referencia de la función Autenticación en MSDN, pero francamente me perdí en ella.

¿Existe una API para Windows Vault para almacenar y recuperar credenciales de un progtwig y, en caso afirmativo, dónde puedo encontrar la documentación?

Muchas gracias a @Luke por la pista: las funciones de la API de Windows para almacenar credenciales y leerlas desde Windows Vault son CredWrite() y CredRead() . Aquí hay un ejemplo de código que puede comstackrse y ejecutarse, que solía confirmar que estas funciones realmente hacen lo esperado:

 #include  #include  #include  #pragma hdrstop void main () { { //--- SAVE char* password = "brillant"; DWORD cbCreds = 1 + strlen(password); CREDENTIALW cred = {0}; cred.Type = CRED_TYPE_GENERIC; cred.TargetName = L"FOO/account"; cred.CredentialBlobSize = cbCreds; cred.CredentialBlob = (LPBYTE) password; cred.Persist = CRED_PERSIST_LOCAL_MACHINE; cred.UserName = L"paula"; BOOL ok = ::CredWriteW (&cred, 0); wprintf (L"CredWrite() - errno %d\n", ok ? 0 : ::GetLastError()); if (!ok) exit(1); } { //--- RETRIEVE PCREDENTIALW pcred; BOOL ok = ::CredReadW (L"FOO/account", CRED_TYPE_GENERIC, 0, &pcred); wprintf (L"CredRead() - errno %d\n", ok ? 0 : ::GetLastError()); if (!ok) exit(1); wprintf (L"Read username = '%s', password='%S' (%d bytes)\n", pcred->UserName, (char*)pcred->CredentialBlob, pcred->CredentialBlobSize); // must free memory allocated by CredRead()! ::CredFree (pcred); } } 

Una credencial genérica se almacena en Windows Vault, como se puede ver en la captura de pantalla:

Una credencial genérica almacenada en Windows Vault

Para las personas que se unen al hilo tarde, hay una nueva biblioteca para interactuar con esta tienda en Windows 8 llamada: Windows.Security.Credentials.PasswordVault

De hecho, solo se necesitan dos líneas de powershell para usar la clase para ver todos los nombres de usuario y contraseñas almacenados en la cuenta de usuario actual:

 [void][Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime] (new-object Windows.Security.Credentials.PasswordVault).RetrieveAll() | % { $_.RetrievePassword(); $_ } 

Si alguien está interesado en leer y escribir desde PowerShell o C #, aquí hay un enlace a un script que lo hace:

Administrador de credenciales de PowerShell: CredMan.ps1

La secuencia de comandos de PowerShell accede a la API a través de C # en línea que utiliza Pinvoke.