2010-07-22 38 views
5

Tôi đã xem xét sử dụng lớp System.Security.SecureString để giữ số thẻ tín dụng trong bộ nhớ trong khi chúng đang được xử lý. Có ai đã sử dụng lớp SecureString để giữ số thẻ tín dụng, hoặc làm hầu hết chỉ sử dụng lớp System.String bình thường?Sử dụng SecureString cho số thẻ tín dụng

+1

Câu hỏi hay hơn: System.SecureString có thực sự bảo mật đủ cho ứng dụng này không? –

+0

@JSBangs: Vâng, từ những gì tôi hiểu, System.SecureString đặc biệt có ý nghĩa cho mục đích này. Tuy nhiên, vì có quá nhiều API khác trong khuôn khổ .NET vẫn sử dụng lớp System.String bình thường, rất khó để duy trì tính bảo mật của chuỗi trong suốt ứng dụng. Tôi đoán câu hỏi của tôi thực sự là: Liệu có đáng để thử và bảo mật dữ liệu từ đầu đến cuối trong bộ nhớ hay không, chỉ có quá nhiều khoảng trống trong API, nơi điều này không được hỗ trợ mà bảo mật thực sự sẽ không đạt được ? – NYSystemsAnalyst

Trả lời

9

Từ góc độ PCI-DSS, không có yêu cầu để bảo vệ số thẻ lưu trữ chỉ trong bộ nhớ.

PCI chỉ cho biết số thẻ được lưu vào đĩa hoặc được truyền qua mạng phải được mã hóa. Đây là một cách tiếp cận thông thường cho vấn đề này. Sử dụng SecureString sẽ đảm bảo rằng chuỗi không bao giờ được lưu vào ổ cứng, nhưng như bạn nói - nó rất phiền phức khi sử dụng. Bài viết này có một số gợi ý tốt mặc dù: https://stackoverflow.com/questions/122784/hidden-net-base-class-library-classes#123141

Về lý thuyết, bảo vệ bộ nhớ giống như nó sẽ tăng cường sức mạnh, nhưng trong thực tế nếu một kẻ xấu có quyền truy cập vào RAM, sau đó trò chơi của nó khá nhiều.

+0

Yêu cầu PCI là đúng vị trí để tìm câu trả lời ở đây ^^ – cRichter

1

Tôi sử dụng SecureString cho các nội dung khác (không phải thẻ tín dụng), nếu nó sẽ được lưu trong bộ nhớ trong một thời gian dài.

Vấn đề tôi tiếp tục gặp phải là bạn vẫn phải sắp xếp nó thành một Chuỗi bình thường để thực sự sử dụng nó cho bất cứ điều gì, vì vậy nó thực sự bị hạn chế về tính hữu dụng của nó.

tôi đã tạo ra một vài phương pháp mở rộng để dễ dàng làm việc với họ một chút:

public static unsafe SecureString Secure(this string source) 
    { 
     if (source == null) 
      return null; 
     if (source.Length == 0) 
      return new SecureString(); 

     fixed (char* pChars = source.ToCharArray()) 
     { 
      SecureString secured = new SecureString(pChars, source.Length); 
      return secured; 
     } 
    } 


    public static string Unsecure(this SecureString source) 
    { 
     if (source == null) 
      return null; 

     IntPtr bstr = Marshal.SecureStringToBSTR(source); 
     try 
     { 
      return Marshal.PtrToStringUni(bstr); 
     } 
     finally 
     { 
      Marshal.ZeroFreeBSTR(bstr); 
     } 
    } 
+3

Điều này đánh bại mục đích. Ngay sau khi bạn chuyển đổi từ/sang System.String, nó không còn an toàn nữa. –

+0

@Hans - Tôi tin rằng tôi đã giải quyết sự thiếu sót đó trong đoạn thứ hai của câu trả lời của tôi. – Toby

2

Câu trả lời trước đó được chấp nhận từ năm 2010 có thể là chính xác tại thời điểm đó, nhưng hãy lưu ý của PCI DSS 3.0 phần 6.5, trong đó nêu:

phát triển Luyện tập các kỹ thuật mã hóa an toàn, bao gồm cách tránh chung mã hóa lỗ hổng bảo mật và hiểu cách dữ liệu nhạy cảm được xử lý trong bộ nhớ .

Cuối cùng là tôn trọng các phương pháp hay nhất trong ngành.

Khi có các thông tin nhạy cảm (bao gồm thông tin thẻ tín dụng) bị bắt bởi phần mềm độc hại, kẻ tấn công, v.v ..., tập trung nhiều hơn vào việc giữ an toàn thông tin nhạy cảm, ngay cả trong bộ nhớ.

Sử dụng SecureString nếu có thể.

Nơi không thể, chỉ cần hiểu bạn đang làm gì. Vì dây là không thay đổi và thu gom rác không phải lúc nào cũng được dựa vào, bạn chỉ cần làm việc với những gì bạn có. Một phương pháp tôi đã đọc là làm cho chuỗi thành BSTR, sao chép nó vào một chuỗi được ghim, sau đó cả chuỗi BSTR và ghim được đánh số 0 sau khi sử dụng. Nó cảm thấy một chút 'hacky', nhưng nó tốt hơn là không làm gì cả.

Nếu thực hiện việc thu thập số thẻ tín dụng hoàn toàn trong ứng dụng biểu mẫu, hãy giữ số thẻ an toàn trong bộ nhớ là khá khả thi.

Với ứng dụng web ASP.NET, tôi không chắc ... Tôi chưa thử, nhưng general consensus trên SO có vẻ như không đáng. Ngoài ra, MSDN đề cập đến các ứng dụng ASP.NET cụ thể, bằng cách nói:

Sử dụng lớp SecureString ít phù hợp hơn trong ASP.NET ứng dụng. Không chắc bạn có thể trích xuất dữ liệu từ trang Web có chứa dữ liệu nhạy cảm (chẳng hạn như số thẻ tín dụng) và đặt bên trong SecureString mà không có thông qua Hệ thống trung gian. Đối tượng chuỗi

Có thể bạn đã hoàn thành dự án của mình, nhưng hy vọng điều này sẽ hỗ trợ người khác.

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