2011-07-05 31 views
6

Vì vậy, tôi đang cố gắng để sử dụng các phương pháp Unprotect trong đối tượng System.Security.Cryptography.ProtectedData và tiếp tục nhận được ngoại lệ:System.Security.Cryptography.ProtectedData.Unprotect là ném một lỗi chính không hợp lệ trong một số trường hợp

cryptographicexception key not valid for use in specified state 

Tôi nghĩ rằng nó đã làm với DataProtectionScope (nhưng tôi không phải 100%).

Phương pháp này hoạt động nếu tôi đăng nhập và chạy một dịch vụ thực thi trong chế độ DEBUG có nghĩa là với tôi, nó sẽ chạy dưới "currentuser". Tuy nhiên, nếu tôi cố gắng chạy các dịch vụ cửa sổ thực tế, chạy dưới tài khoản LocalSystem, nó không ném ngoại lệ đã đề cập trước đó.

Phương pháp:

ProtectedData.Unprotect(Byte[] byteArray, <some_password_salt>, DataProtectionScope.CurrentUser) 

Các DataProtectionScope Enum, chỉ có CurrentUser hoặc LocalMachine như các tùy chọn của bạn. Tôi không chắc chắn sẽ là lựa chọn tốt nhất để giải quyết vấn đề này.

Tôi đã thử cài đặt nó thành DataProtectionScope.LocalMachine theo bài viết MSDN, bất kỳ quá trình nào đang chạy trên máy đều có thể bảo vệ dữ liệu. Nhưng không.

Trả lời

13

Data protection API sử dụng khóa được tạo cho mỗi người dùng. Nó là một lược đồ mã hóa đối xứng, có nghĩa là dữ liệu được mã hóa cho một người dùng không thể được giải mã bởi người dùng khác. Nó không thể được giải mã bởi cùng một người dùng trên một máy tính khác.

Đó lá bạn với hai lựa chọn:

  • Mã hóa và giải mã dữ liệu với mã chạy dưới cùng một tài khoản trên cùng một máy
  • Sử dụng CRYPTPROTECT_LOCAL_MACHINE cờ để sử dụng phím máy, chứ không phải của người dùng

Dù bằng cách nào, mã hóa và giải mã phải được thực hiện theo cùng một cách. Ví dụ, sử dụng cờ máy cục bộ khi mã hóa và giải mã.

+0

Có, tôi đã tìm thấy hai vấn đề khi tôi cố gắng sử dụng cờ đó ban đầu. Sau khi chỉnh sửa cả hai, tôi đã có thể sử dụng cờ LocalMachine để làm việc. – pghtech

+3

Rất hữu ích - trong trường hợp của tôi, tôi đã cố gắng chạy mã tôi đã nắm lấy từ một dự án khác. Nó đã sử dụng LocalMachine rồi, nhưng tôi đã mã hóa trên một máy và giải mã trên một máy khác. – neminem

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