security - podemos - ¿Cómo guardo y recupero las credenciales del administrador de credenciales de Windows Vault?
no podemos guardar o buscar cambios porque han expirado sus credenciales almacenadas en cache (3)
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 compilarse y ejecutarse, que solía confirmar que estas funciones realmente hacen lo esperado:
#include <windows.h>
#include <wincred.h>
#include <tchar.h>
#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:
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 programa 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 programa y, en caso afirmativo, dónde puedo encontrar la documentación?
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.