2011-06-28 15 views
9

Tôi có ứng dụng ASP.Net C# cần kết nối với API bên ngoài bằng cách sử dụng dịch vụ web mỗi 5 phút.Thực tiễn tốt nhất để lưu trữ và cập nhật mật khẩu API bên ngoài

Các yêu cầu của Webservice bên ngoài là như sau:

  • Username và Password được yêu cầu
  • tôi phải chuyển tên người dùng và mật khẩu với mỗi yêu cầu webservice
  • Passwords hết hạn mỗi 90 ngày và phải thay đổi trước ngày hết hạn
  • Mật khẩu không thể thay đổi theo cách thủ công (theo con người), ứng dụng của tôi phải kết nối với một Dịch vụ Web thay đổi mật khẩu riêng biệt để thay đổi mật khẩu.
  • Ứng dụng của tôi phải tạo mỗi mật khẩu mới dựa trên một bộ quy tắc.
  • Không thể sử dụng lại mật khẩu.
  • SSL, Giấy chứng nhận và Firewall IP hạn chế được yêu cầu

tôi đã xây dựng tất cả các trước, nhưng tôi hiện đang có một vấn đề. Phương pháp hay nhất để lưu trữ mật khẩu hiện tại và lịch sử là gì?

Rõ ràng việc lưu trữ mật khẩu thô là một giải pháp tồi. Tôi cần có khả năng để webservice của tôi đọc mật khẩu và truyền nó với mỗi yêu cầu. Tôi cũng cần có thể truy cập tất cả mật khẩu lịch sử để đảm bảo rằng mật khẩu mới được tạo của tôi không trùng lặp.

Lý tưởng nhất, tôi muốn lưu trữ mỗi mật khẩu (mã hóa) trong cơ sở dữ liệu của mình và giải mã nó bất cứ khi nào tôi cần gọi dịch vụ web. Có cách nào tốt nhất tôi nên theo dõi? Tôi có nên mã hóa mỗi mật khẩu bằng Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Cryptographer.EncryptSymmetric (..)?

Lưu ý: Rất tiếc, tôi không có quyền truy cập để thay đổi cách các chức năng API bên ngoài. Tôi phải tuân thủ các quy tắc được cung cấp.

+0

Stick một bộ đếm 5 chữ số ở phần cuối của mật khẩu, với những tháng số từ năm 2010? –

Trả lời

6

liên quan đến các password history Với tôi sẽ đi xuống một trong hai tuyến đường:

  1. Theo kế hoạch hiện tại của bạn, mật khẩu lưu trữ trong tập tin/db/config - đề nghị bạn sử dụng một thuật toán băm (trái ngược với mã hóa) để so sánh mật khẩu mới với các băm mật khẩu được lưu trữ cho "bình đẳng".

  2. Đừng bận tâm lưu trữ lịch sử mật khẩu - hãy thực hiện lần đầu tiên dịch vụ web thay đổi mật khẩu nếu không chọn, sau đó gửi lại bằng mật khẩu thay thế. Bằng cách này, bạn không sao chép các quy tắc kinh doanh của dịch vụ web thay đổi mật khẩu (ví dụ: cho phép họ thay đổi nó để cho phép bạn sử dụng lại mật khẩu sau 6 tháng).

Đối với lưu trữ mật khẩu hiện tại: giả sử bạn phải gửi mật khẩu dưới dạng chữ thô, thì có, bạn nên lưu mật khẩu dưới dạng mã hóa.Có rất nhiều bài viết out there về cách thực hiện điều này. Hoặc bạn thậm chí có thể mã hóa một phần cụ thể của tệp cấu hình của bạn chẳng hạn như seen here.

0

Công cụ đăng ký ASP.NET IIS (Aspnet_regiis.exe) có thể mã hóa và giải mã các phần của web.config. Không có mã đặc biệt cần thiết trong một ứng dụng, vì ASP.NET 2.0 sẽ giải mã một cách kỳ diệu các phần trong thời gian chạy.

http://msdn2.microsoft.com/en-us/library/zhhddkxy.aspx

+0

Điều này dường như không giải quyết được vấn đề của tôi. – Jon

+0

-1 tự động sửa đổi web.config có vẻ như một ý tưởng khủng khiếp – Earlz

+0

@earlz - không có gì được sửa đổi động. Bạn làm điều này vào thời gian triển khai từ dòng lệnh. Tôi muốn đề nghị bạn hoàn tác ý kiến ​​đó vì nó không phải là một lá phiếu được thông báo. Cảm ơn. – Kev

1

Cách đơn giản nhất ... sử dụng lớp ProtectedData:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx

byte[] bytes = System.Text.Encoding.UTF8.GetBytes(password); 
byte[] cypher = ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser); 
//... reverse 
byte[] bytes = ProtectedData.Unprotect(cypher, null, DataProtectionScope.CurrentUser); 
string password = System.Text.Encoding.UTF8.GetString(bytes); 
Các vấn đề liên quan