2012-06-15 26 views
9

Ứng dụng này hiển thị biểu mẫu có hộp văn bản nơi người dùng được yêu cầu nhập mật khẩu được sử dụng để giải mã tài liệu.trong C#, cách thích hợp để xử lý dữ liệu nhạy cảm như mật khẩu là gì?

tôi có mã trông như thế này:

string password = passwordTextBox.Text; 
... 
DecryptDocument(password); 

Nhưng tôi đã nói rằng, nói về mặt kỹ thuật, đây là một lỗ hổng bảo mật, bởi vì các dữ liệu mà đại diện cho mật khẩu có thể vẫn còn trong bộ nhớ ngay cả sau khi ứng dụng đã đóng cửa.

Tôi cố gắng để sử dụng lớp System.Security.SecureString nhưng bây giờ tôi đang đối phó với các con trỏ tới CoTaskMem mà dường như làm cho vấn đề tồi tệ hơn:

SecureString password = new SecureString(); 
foreach(char i in passwordTextBox.Text.ToCharArray()) 
password.AppendChar(i); 

IntPtr ptr = Marshal.SecureStringToCoTaskMemAnsi(password); 
int length = password.Length; 
byte[] bytes = new byte[length]; 

Marshal.Copy(ptr, bytes, 0, length); 

DecryptDocument(Encoding.Default.GetString(bytes)); 

Marshal.FreeCoTaskMem(ptr); 

Như bạn có thể thấy, nó không giống như tôi đang làm cho ứng dụng an toàn hơn, vì sớm hay muộn tôi sẽ phải lấy đầu vào (passwordTextBox.Text) và chuyển đổi nó thành một chuỗi mà tôi có thể chuyển tới hàm DecryptDocument().

Có cách nào để giải quyết vấn đề này hay tôi nên xử lý lỗ hổng bảo mật này?

+0

"Nhưng về mặt kỹ thuật, đây là lỗ hổng bảo mật vì dữ liệu biểu thị mật khẩu có thể vẫn còn trong bộ nhớ ngay cả sau khi ứng dụng bị đóng." ** - ở một vị trí ngẫu nhiên trong bộ nhớ. Bạn đang lo lắng về không có gì. ** "Có cách nào để giải quyết vấn đề này hay tôi nên đối phó với lỗ hổng bảo mật này?" ** Lỗ hổng nào sẽ là? ** –

+2

Nó sẽ là lỗ hổng này: http: // cwe .mitre.org/data/definitions/316.html –

+2

@Ramhound, Nếu bạn không lo lắng về việc có văn bản ở một vị trí ngẫu nhiên trong bộ nhớ, thì nó không đáng sử dụng SecureString cả. Để công bằng, nó thực sự chỉ thêm một lượng nhỏ bảo mật; mối quan tâm chính là các bãi đổ vỡ, mặc dù chúng có thể đã rò rỉ tất cả các loại thông tin nhạy cảm (tức là mọi thứ hiện đang được giải mã cho mục đích làm việc). Điều duy nhất mà SecureString thực sự mua cho bạn là giảm xác suất rò rỉ cụm mật khẩu, có khả năng làm tổn hại đến khóa (hoặc các dịch vụ khác được người dùng liên quan truy cập nếu họ sử dụng lại cụm mật khẩu của họ). –

Trả lời

7

Nếu bạn thực sự muốn sử dụng SecureString, nó cần được sử dụng từ đầu đến cuối, tốt nhất là chỉ nên tương tác một ký tự cùng một lúc. Bất cứ khi nào chuỗi được giải mã thành một mảng ký tự, bạn sẽ muốn xóa rõ ràng bộ nhớ khi bạn sử dụng xong nó. Hậu quả của việc này:

  1. Bạn nên sử dụng điều khiển TextBox an toàn hoạt động với SecureString trực tiếp. Xem here để có một ví dụ điển hình.

  2. Bạn nên sửa đổi DecryptDocument để nhận trực tiếp SecureString.

  3. Bạn sẽ muốn triển khai giải mã để nó dành ít thời gian nhất với các ký tự được giải mã nhất có thể. Một số kiến ​​trúc mật mã trong .NET thực sự hỗ trợ SecureString trực tiếp. Nếu không, việc đặt cược tốt nhất của bạn là sử dụng bộ đệm không được quản lý và xóa rõ ràng khi bạn đã hoàn thành nó.

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