Vui lòng sửa cho tôi nếu các giả định của tôi sai ở đây, nhưng hãy để tôi giải thích lý do tại sao tôi hỏi.
Lấy từ MSDN, a SecureString
:
Đại diện cho văn bản cần được giữ bí mật. Văn bản được mã hóa để bảo mật khi được sử dụng và bị xóa khỏi bộ nhớ máy tính khi không còn cần thiết.
Tôi hiểu điều này, hoàn toàn có ý nghĩa khi lưu trữ mật khẩu hoặc thông tin riêng tư khác trong SecureString
một System.String
, bởi vì bạn có thể kiểm soát cách thức và thời điểm nó thực sự được lưu trữ trong bộ nhớ, bởi vì System.String
:
là bất biến và, khi không còn cần thiết, không thể được lập trình theo lịch trình để thu gom rác; nghĩa là, thể hiện chỉ đọc sau khi nó được tạo và không thể dự đoán khi nào thể hiện sẽ bị xóa khỏi bộ nhớ máy tính. Do đó, nếu một đối tượng Chuỗi chứa thông tin nhạy cảm như mật khẩu, số thẻ tín dụng hoặc dữ liệu cá nhân, có nguy cơ thông tin có thể bị tiết lộ sau khi sử dụng vì ứng dụng của bạn không thể xóa dữ liệu khỏi bộ nhớ máy tính.
Tuy nhiên, trong trường hợp ứng dụng GUI (ví dụ: máy khách ssh), ứng dụng SecureString
phải được xây dựng từ a System.String
. Tất cả các điều khiển văn bản sử dụng một chuỗi làm kiểu dữ liệu cơ bản của nó .
Vì vậy, điều này có nghĩa là mỗi khi người dùng nhấn một phím, chuỗi cũ đã bị loại bỏ và một chuỗi mới được xây dựng để thể hiện giá trị bên trong hộp văn bản là gì, ngay cả khi sử dụng mặt nạ mật khẩu. Và chúng ta không thể kiểm soát khi nào hoặc nếu bất kỳ giá trị nào trong số đó bị loại khỏi bộ nhớ .
Bây giờ là lúc để đăng nhập vào máy chủ. Đoán xem cái gì? Bạn cần truyền một chuỗi qua kết nối để xác thực . Vì vậy, hãy chuyển đổi chúng ta SecureString
thành một System.String
.... và bây giờ chúng ta có một chuỗi trên heap mà không có cách nào để buộc nó đi qua bộ sưu tập rác (hoặc ghi 0 'vào bộ đệm của nó).
Quan điểm của tôi là : không có vấn đề gì bạn làm, ở đâu đó dọc theo dòng, đó SecureString
là sẽ được chuyển đổi thành một System.String
, có nghĩa là nó sẽ ít nhất tồn tại trên đống tại một số điểm (không có bất kỳ đảm bảo thu gom rác thải).
Quan điểm của tôi không phải là : liệu có cách nào để tránh việc gửi một chuỗi đến kết nối ssh hay phá vỡ việc có một điều khiển lưu trữ một chuỗi (tạo một điều khiển tùy chỉnh). Đối với câu hỏi này, bạn có thể thay thế "kết nối ssh" bằng "hình thức đăng nhập", "hình thức đăng ký", "hình thức thanh toán", "hình thức thực phẩm bạn sẽ cho ăn con chó con của bạn nhưng không phải con bạn", Vân vân.
- Vì vậy, tại thời điểm nào việc sử dụng
SecureString
thực sự trở nên thiết thực? - Có bao giờ giá trị thời gian phát triển thêm để xóa bỏ hoàn toàn việc sử dụng một
System.String
đối tượng? - Là toàn bộ mục
SecureString
đích đơn giản là giảm lượng thời gian aSystem.String
trên heap (giảm nguy cơ chuyển sang tệp hoán đổi vật lý)? - Nếu kẻ tấn công đã có phương tiện để kiểm tra heap, thì rất có thể anh ta (A) đã có phương tiện để đọc tổ hợp phím, hoặc (B) đã có máy vật lý ... Vì vậy, việc sử dụng sẽ
SecureString
ngăn anh ta đến Dù sao dữ liệu? - Đây có phải chỉ là "bảo mật thông qua che khuất"?
Xin lỗi nếu tôi đặt câu hỏi quá dày, sự tò mò chỉ khiến tôi tốt hơn. Hãy trả lời bất kỳ hoặc tất cả các câu hỏi của tôi (hoặc cho tôi biết rằng các giả định của tôi là hoàn toàn sai). :)
SecureString
không thực sự là một chuỗi an toàn. Đó chỉ là một cách để giảm cửa sổ thời gian trong đó ai đó có thể kiểm tra bộ nhớ của bạn và lấy thành công dữ liệu nhạy cảm. Đây không phải là chống đạn và nó không có ý định. Nhưng những điểm bạn đang nâng lên rất hợp lệ. Liên quan: stackoverflow.com/questions/14449579/ từ