2009-03-17 45 views
6

Tôi cần lưu trữ tên/mật khẩu của người dùng của mình ở đâu đó (tốt nhất là Registry) để ứng dụng .Net của tôi có thể sử dụng chúng để đăng nhập vào một số dịch vụ từ xa thay mặt cho người dùng. Tôi biết có thể lưu trữ các giá trị trong sổ đăng ký dưới dạng "bí mật", có nghĩa là chúng được mã hóa bằng mã thông báo người dùng miền của Windows hoặc một thứ gì đó. Nói cách khác, tôi không muốn phải tự mình giải quyết vấn đề mã hóa.Giữ mật khẩu trong sổ đăng ký là "bí mật"

Để làm rõ: Tôi không thể lưu trữ mật khẩu hoặc muối hoặc bất kỳ thứ gì. Các thông tin đăng nhập này dành cho hệ thống của bên thứ ba và cách chỉ để tôi có thể đăng nhập vào hệ thống này thay mặt cho người dùng của mình bằng cách nào đó giữ thông tin đăng nhập của họ và có thể khôi phục chúng.

Vì vậy, dù sao, tôi nhớ mơ hồ có một nơi như vậy trong sổ đăng ký, nhưng chi tiết thì thầm. Và tôi cần phải làm điều đó trong C# (mặc dù nếu nó truy cập registry đơn giản nó không nên quan trọng).

Chỉnh sửa: Một điều nữa, nó phải tồn tại giữa các phiên người dùng Windows (IOW nó không giúp tôi nếu mật khẩu không đọc được sau khi người dùng đăng nhập và bật).

+0

@Assaf - có, chức năng mã hóa là một phần của chính Windows và các phần tử được duy trì giữa các phiên của người dùng. – overslacked

Trả lời

10

Có thể bạn đang nghĩ đến API bảo vệ dữ liệu. Tìm kiếm MSDN hoặc read some blogs và xem điều đó có phù hợp với bạn hay không.

+0

Có, bắt tốt! DPAPI dường như là những gì OP đang nói đến. – Cerebrus

+0

Mã hóa có được duy trì liên tục trên các phiên của người dùng không? (tức là nếu người dùng đăng xuất và quay lại hoặc nếu đủ thời gian trôi qua, dữ liệu vẫn có thể đọc được)? –

5

Bạn có thể thử sử dụng System.Security.Cryptography.ProtectedData, có thể mã hóa chúng bằng cách sử dụng khóa cho mỗi người dùng. http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx.

Nó không hoàn toàn an toàn, vì mã chạy khi người dùng có thể giải mã dữ liệu.

+0

Mã hóa có được liên tục trên các phiên người dùng không? (ví dụ: nếu người dùng đăng xuất và quay lại hoặc nếu đủ thời gian trôi qua, dữ liệu vẫn có thể đọc được) –

+0

Có, đó là khóa mã hóa cho mỗi người dùng. – Michael

0
  • Bạn không bao giờ nên lưu trữ bằng chứng rõ ràng. Sử dụng mật mã khóa đối xứng. Lấy mật khẩu ra khi chạy. Xem các hàm MSDN reference về Mật mã.
+0

Bạn có ý nghĩa gì khi lấy mật khẩu trong thời gian chạy? Nếu tôi sử dụng một khóa đối xứng hơn bất cứ ai kiểm tra nhị phân có thể kéo nó ra. –

+0

Fudge nhị phân. Sử dụng nhiều băm. Lấy mật khẩu ra sẽ có nghĩa là giải mã. Điều này là nhiều, tốt hơn nhiều so với mật khẩu văn bản thô bất kỳ ngày nào. – dirkgently

+0

@dirkgently Thật tuyệt vời, nhưng bạn lưu trữ khóa đối xứng ở đâu? Trong sổ đăng ký? Trong một tập tin? Làm thế nào là an toàn hơn? – Dan

1

Hãy nhớ rằng bạn không thực sự lưu trữ an toàn bất cứ thứ gì nếu bạn có thể tự động (không có đầu vào của người dùng) truy xuất mật khẩu. Sử dụng RSA, đối xứng hoặc mã hóa khác không tạo sự khác biệt miễn là bạn lưu trữ khóa giải mã trong ứng dụng của mình. Một khi có ai đó lấy chìa khóa, thì bí mật đã hết.

Tuy nhiên, API bảo vệ dữ liệu được đề cập ở trên phải bảo vệ mật khẩu từ những người dùng khác trên cùng một máy. (Nó sounds like DPAPI sử dụng thông tin xác thực đăng nhập của bạn để mã hóa.)

Để biết thêm một vài tùy chọn, hãy xem trang msdn cho Threat Mitigation.

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