Используйте SecureString для номеров кредитных карт - PullRequest
5 голосов
/ 22 июля 2010

Я пытался использовать класс System.Security.SecureString для хранения номеров кредитных карт в памяти во время их обработки. Кто-нибудь использовал класс SecureString для хранения номеров кредитных карт, или большинство используют обычный класс System.String?

Ответы [ 4 ]

9 голосов
/ 23 июля 2010

С точки зрения PCI-DSS нет необходимости защищать номера карт, хранящиеся только в памяти.

PCI заявляет, что только номера карт, сохраненные на диске или передаваемые по сети, должны быть зашифрованы. Это здравый подход к проблеме. Использование SecureString гарантирует, что строка никогда не будет кэшироваться на диск, но, как вы говорите, ее неудобно использовать. Этот пост имеет несколько хороших предложений: https://stackoverflow.com/questions/122784/hidden-net-base-class-library-classes#123141

Теоретически, защита памяти звучит так, как будто это прибавит силы, но на самом деле, если у плохого парня есть доступ к оперативной памяти, тогда игра в значительной степени закончена.

2 голосов
/ 20 августа 2014

Ранее принятый ответ от 2010 года, возможно, был верным в то время, но, пожалуйста, имейте в виду PCI DSS 3.0 раздел 6.5, в котором говорится:

Обучение разработчиковметоды безопасного кодирования, в том числе способы предотвращения распространенных уязвимостей при кодировании и понимание того, как конфиденциальные данные обрабатываются в памяти.

В конечном итоге речь идет о соблюдении лучших отраслевых практик.

Учитывая высокий уровень-производственные нарушения в последние годы, когда конфиденциальные данные (включая данные кредитных карт) собираются вредоносными программами, злоумышленниками и т. д., занимающимися очисткой памяти, больше внимания уделяется обеспечению безопасности конфиденциальной информации, даже в памяти.

ИспользованиеSecureString, где это возможно.

Там, где это невозможно, просто поймите, с чем вы столкнулись.Поскольку строки неизменяемы, и на сборку мусора не всегда можно положиться, вам просто нужно работать с тем, что у вас есть.Один из методов, о которых я читал, состоит в том, чтобы преобразовать строку в BSTR, скопировать ее в закрепленную строку, после чего и BSTR, и закрепленная строка обнуляются после использования.Это кажется немного «хакерским», но это лучше, чем вообще ничего не делать.

Если захват номера кредитной карты выполняется исключительно в приложении winform, сохранение номера карты в памяти вполне выполнимо.

Однако с веб-приложением ASP.NET я не уверен ... Я не пробовал его, но общее согласие по SO, похоже, того не стоит.Кроме того, MSDN специально упоминает приложения ASP.NET, говоря:

Использование класса SecureString менее подходит в приложениях ASP.NET.Маловероятно, что вы можете извлечь данные из веб-страницы, которая содержит конфиденциальные данные (например, номер кредитной карты), и поместить их в SecureString, не передавая их через промежуточную систему.Строковые объекты

Вероятно, вы закончили свой проект, но, надеюсь, это поможет другим.

1 голос
/ 23 июля 2010

Я использую SecureString для других вещей (не для кредитных карт), если он будет кэшироваться в памяти в течение длительного времени.

Проблема, с которой я все время сталкиваюсь, заключается в том, что вам все еще нужно преобразовать ее в обычную строку, чтобы фактически использовать ее для чего-либо, поэтому она действительно ограничена в своей полезности.

Я создал несколько методов расширения, чтобы немного облегчить работу с ними:

    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);
        }
    }
0 голосов
/ 21 июля 2016

Не используйте securestring. PG осуждает это. Посмотрите видео, и в нем изложено множество проблем с безопасностью. https://github.com/dotnet/apireviews/tree/master/2015-07-14-securestring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...