2008-09-02 36 views
31

Tôi có một số mã như thế này trong một ứng dụng winforms Tôi đã viết để truy vấn hộp thư của người dùng Dung lượng lưu trữ.Làm thế nào để lưu trữ mật khẩu trong ứng dụng Winforms?

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

Không có vấn đề tiếp cận những gì tôi đã cố gắng (như SecureString), tôi dễ dàng có thể xem các mật khẩu (m_pwd) hoặc tab sử dụng Reflector hoặc sử dụng chuỗi Process Explorer để thực thi.

Tôi biết tôi có thể đặt mã này trên máy chủ hoặc thắt chặt bảo mật bằng các cơ chế như ủy quyền và chỉ cấp các đặc quyền bắt buộc cho tài khoản dịch vụ.

Ai đó có thể đề xuất một cách an toàn hợp lý để lưu trữ mật khẩu trong ứng dụng cục bộ mà không tiết lộ mật khẩu cho tin tặc?

Bạn không thể bẻ khóa vì tôi cần biết mật khẩu chính xác (không chỉ băm cho mục đích phù hợp). Cơ chế mã hóa/giải mã không hoạt động vì chúng phụ thuộc vào máy.

Trả lời

24

phương pháp thánh là sử dụng CryptoAPI và các API Data Protection

để mã hóa, sử dụng một cái gì đó như thế này (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; 

Decryption là ngược lại:

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

Nếu bạn không chỉ định CRYPTPROTECT_LOCAL_MACHINE sau đó mật khẩu được mã hóa có thể được lưu trữ an toàn trong registry hay các tập tin cấu hình và chỉ có bạn mới có thể giải mã nó. Nếu bạn chỉ định LOCAL_MACHINE, thì bất kỳ ai có quyền truy cập vào máy đều có thể nhận được nó.

2

Nếu bạn lưu nó dưới dạng chuỗi bảo mật và lưu chuỗi bảo mật vào tệp (có thể sử dụng Isolated Storage, thì lần duy nhất bạn có mật khẩu thuần văn bản là khi bạn giải mã nó để tạo ra mbstore của bạn. không mất một SecureString hoặc một đối tượng Credential

4

Tôi tìm thấy cuốn sách này của keith Brown Hướng dẫn của Nhà phát triển .NET về Bảo mật Windows. Nó có một số mẫu tốt bao gồm tất cả các loại kịch bản bảo mật. Miễn phí Online version cũng khả dụng.

11

Như đã đề cập, API bảo vệ dữ liệu là cách hay để thực hiện việc này. Lưu ý rằng nếu bạn đang sử dụng .NET 2.0 hoặc cao hơn, bạn không cần sử dụng P/Invoke để gọi DPAPI. Khung công tác kết thúc các cuộc gọi với lớp System.Security.Cryptography.ProtectedData.

+1

Có ví dụ nào trên web về cách thực hiện điều này không? – karlipoppins

+1

@m_oLogin: Xem một trong các câu trả lời khác của tôi [ở đây] (http://stackoverflow.com/questions/154430/persistent-storage-of-encrypted-data-using-net/154687#154687) –

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