2012-02-10 32 views
30

Tôi muốn lưu trữ mật khẩu rõ ràng trên Windows PC một cách an toàn. Tôi hiện đang sử dụng DPAPI CryptProtectData để mã hóa nó, sau đó lưu trữ các đốm màu được mã hóa trong một tệp trong AppData cục bộ của người dùng.Làm cách nào để lưu trữ và truy xuất bằng chứng xác thực từ trình quản lý thông tin xác thực của Windows Vault?

Trong Windows 7, có Windows Vault, trình quản lý thông tin xác thực (Control Panel \ User Accounts và Family Safety \ Credential Manager) lưu trữ dữ liệu đăng nhập cho nhiều loại đăng nhập, bao gồm "chứng chỉ chung". Trên bề mặt, điều này có vẻ như là nơi thích hợp cho một chương trình lưu trữ thông tin đăng nhập. Tuy nhiên, tôi không thể tìm thấy bất kỳ API nào cho nó. Tôi đọc tài liệu tham khảo Authentication function trong MSDN, nhưng thẳng thắn bị lạc trong đó.

Có API cho Windows Vault để lưu trữ và truy xuất thông tin đăng nhập từ chương trình hay không và nếu có, tôi có thể tìm tài liệu ở đâu?

+1

Có vẻ như CredWrite(), CredRead() và et al trong phần Chức năng quản lý chứng chỉ. – Luke

+1

Tôi hiện đang xem xét các giải pháp lưu trữ thông tin đăng nhập của người dùng - bạn có thể cho tôi biết lý do bạn quyết định chuyển từ lưu trữ blob được mã hóa từ CryptProtectData sang Windows Vault không? Bảo mật hơn? Nó có vẻ ít di động hơn so với các phiên bản Windows trước đó (nhưng hiện tại, tôi không chắc mình sẽ quan tâm). – BSchlinker

+0

Giống như BSchlinker, tôi không hiểu điều này đang thu hút chúng ta. Cách này an toàn hơn lưu trữ trên hệ thống tập tin như thế nào? – Sammi

Trả lời

31

Rất cám ơn @Luke vì gợi ý: Chức năng API Windows để lưu trữ thông tin đăng nhập và đọc chúng từ Windows Vault là CredWrite()CredRead(). Đây là một mẫu mã có thể được biên dịch và chạy, mà tôi sử dụng để xác nhận rằng các chức năng này thực sự làm điều mong đợi:

#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); 
    } 
} 

Một chứng chỉ chung được lưu trữ trong Windows Vault, như có thể được nhìn thấy trên ảnh chụp màn hình:

A generic credential stored in Windows Vault

+0

Có cách nào để sử dụng thông tin đăng nhập theo cách không thể truy xuất được không? (như chỉ đăng nhập vào một URL). – eckes

7

Nếu bất cứ ai quan tâm đến việc đọc và viết để nó từ PowerShell hoặc C#, đây là một liên kết đến một kịch bản nào đó:

PowerShell Credentials Manager: CredMan.ps1

Tập lệnh PowerShell truy cập API thông qua nội tuyến C# sử dụng Pinvoke.

14

Đối với những người tham gia thread muộn, có một thư viện mới để tương tác với cửa hàng này trong Windows 8 được gọi là: Windows.Security.Credentials.PasswordVault

Trong thực tế nó chỉ mất hai dòng PowerShell để sử dụng lớp để xem tất cả các tên người dùng và mật khẩu được lưu trữ trong tài khoản người dùng hiện tại:

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

@ClairelyClaire Điều đó vẫn sẽ thông qua người tín nhiệm. Khi tôi xem cửa sổ của tôi sống bằng chứng xác thực thông qua gui trong win8.1, nó hiển thị như ảoapp/didlogical với một loại chung chung. Vì vậy, nếu bạn liệt kê các creds của loại cred.Type = CRED_TYPE_GENERIC bạn sẽ tìm thấy một. [link] (http://answers.microsoft.com/vi-us/windows/forum/windows_7-security/unknown-credential-virtualappdidlogical/40467173-a75a-44b2-8617-5aa7a0479925) –

+0

Tôi đã xem qua các lệnh cho tập lệnh PowerShell Tim Lewis được đăng - không chắc chắn cách sử dụng trên thông tin với điều đó. Tôi có thể thấy thông tin đăng nhập được lưu trữ được kết hợp với tài khoản MS được kết nối với tài khoản người dùng Windows 8 - không có mật khẩu. – ClairelyClaire

Các vấn đề liên quan