Ранее принятый ответ от 2010 года, возможно, был верным в то время, но, пожалуйста, имейте в виду PCI DSS 3.0 раздел 6.5, в котором говорится:
Обучение разработчиковметоды безопасного кодирования, в том числе способы предотвращения распространенных уязвимостей при кодировании и понимание того, как конфиденциальные данные обрабатываются в памяти.
В конечном итоге речь идет о соблюдении лучших отраслевых практик.
Учитывая высокий уровень-производственные нарушения в последние годы, когда конфиденциальные данные (включая данные кредитных карт) собираются вредоносными программами, злоумышленниками и т. д., занимающимися очисткой памяти, больше внимания уделяется обеспечению безопасности конфиденциальной информации, даже в памяти.
ИспользованиеSecureString, где это возможно.
Там, где это невозможно, просто поймите, с чем вы столкнулись.Поскольку строки неизменяемы, и на сборку мусора не всегда можно положиться, вам просто нужно работать с тем, что у вас есть.Один из методов, о которых я читал, состоит в том, чтобы преобразовать строку в BSTR, скопировать ее в закрепленную строку, после чего и BSTR, и закрепленная строка обнуляются после использования.Это кажется немного «хакерским», но это лучше, чем вообще ничего не делать.
Если захват номера кредитной карты выполняется исключительно в приложении winform, сохранение номера карты в памяти вполне выполнимо.
Однако с веб-приложением ASP.NET я не уверен ... Я не пробовал его, но общее согласие по SO, похоже, того не стоит.Кроме того, MSDN специально упоминает приложения ASP.NET, говоря:
Использование класса SecureString менее подходит в приложениях ASP.NET.Маловероятно, что вы можете извлечь данные из веб-страницы, которая содержит конфиденциальные данные (например, номер кредитной карты), и поместить их в SecureString, не передавая их через промежуточную систему.Строковые объекты
Вероятно, вы закончили свой проект, но, надеюсь, это поможет другим.