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
Trả lời
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.
Yêu cầu PCI là đúng vị trí để tìm câu trả lời ở đây ^^ – cRichter
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);
}
}
Đ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. –
@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
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.
Không sử dụng tính năng bảo mật. PG đang phản đối nó. Xem video và họ phác thảo vô số vấn đề bảo mật với nó. https://github.com/dotnet/apireviews/tree/master/2015-07-14-securestring.
- 1. sử dụng securestring cho kết nối sql
- 2. InputType thích hợp cho thẻ tín dụng
- 3. Sử dụng an toàn SecureString cho mẫu đăng nhập
- 4. Lưu trữ thông tin thẻ tín dụng
- 5. Lưu trữ thẻ tín dụng trực tuyến?
- 6. Xác thực thẻ tín dụng với Jquery
- 7. Triển khai hệ thống thẻ tín dụng?
- 8. Biến loại thẻ tín dụng cho REST REST API
- 9. Thay thế cho lưu trữ thông tin thẻ tín dụng
- 10. Thẻ tín dụng - Thẻ trên dịch vụ tệp?
- 11. Xác thực chi tiết thẻ tín dụng
- 12. Nhận thanh toán bằng thẻ tín dụng trong ứng dụng
- 13. Tên chính thức cho mã gồm 3 chữ số của thẻ tín dụng là gì?
- 14. Sử dụng giao dịch thẻ tín dụng trung bình bao nhiêu dữ liệu?
- 15. Cách tốt nhất để tránh sử dụng thẻ tín dụng trùng lặp
- 16. Tôi có thể sử dụng PayPal để tự động tính phí Thẻ Tín Dụng không?
- 17. Chi tiết thẻ tín dụng sandbox Paypal không hoạt động
- 18. Tên ngân hàng từ chi tiết thẻ tín dụng?
- 19. iOS - Tích hợp thanh toán bằng thẻ tín dụng
- 20. Cách kiểm tra tương tác thẻ tín dụng?
- 21. Implenting Xử lý thẻ tín dụng trong PHP MySql Site
- 22. Phí nhà phát triển Android không có thẻ tín dụng?
- 23. Cách nhận thanh toán bằng thẻ tín dụng?
- 24. Yii php Paypal thanh toán thẻ tín dụng tích hợp
- 25. Thanh toán PayPal - tab thẻ tín dụng theo mặc định
- 26. Cổng thanh toán bằng thẻ tín dụng trong PHP?
- 27. Làm cách nào để nhận số dư trên thẻ tín dụng?
- 28. Có cách nào tốt hơn để che giấu một số thẻ tín dụng trong python?
- 29. Biểu thức chính quy cho dữ liệu theo dõi thẻ tín dụng
- 30. Làm cách nào để cho biết quốc gia xuất xứ của thẻ tín dụng theo số của nó?
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? –
@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