Перезаписать, затем установить значение null

Я работаю над устаревшей платформой электронной коммерции и заметил условность при работе с номерами кредитных карт. C #

cardnumber = "11111111111111111111";
cardnumber = null;

или в sql

update cards set cardnumber = '11111111111111111111' where customerid = @CustomerID
update cards set cardnumber = null where customerid = @CustomerID

Я предполагаю, что причина состоит в том, чтобы удалить его из памяти, прежде чем устанавливать для него значение null, что может не удалить значение. Но это рассуждение, казалось бы, предполагает, что SQL Server и / или виртуальная машина .NET имеют уязвимости, в которых простая установка значения null не приведет к полному удалению данных, просто скажите, что они доступны.

  1. Я правильно понимаю это?
  2. Нужно ли это делать сегодня?

person tgandrews    schedule 19.04.2013    source источник
comment
К вашему сведению, класс SecureString уже существует. Может быть интересно.   -  person George Duckett    schedule 19.04.2013
comment
На этой таблице есть триггер?   -  person Steve    schedule 19.04.2013
comment
@Steve нет триггера на столе.   -  person tgandrews    schedule 19.04.2013
comment
@tgandrews Это, конечно, программирование вуду. Байты по-прежнему будут где-то в памяти, пока они не будут перезаписаны (предположительно, только когда GC запускает и, этот блок памяти используется повторно, а не просто помещается в список свободной памяти). SecureString, о котором упоминал Джордж, конечно, является правильным решением (по крайней мере, в .Net).   -  person Matthew Watson    schedule 19.04.2013
comment
У меня создалось впечатление, что простая перезапись данных с помощью 0 или 1 не означает, что данные станут невосстановимыми, и что некоторые параноики предпочли бы удалить свои данные, перезаписав их случайными последовательностями несколько раз. Может, в этом все дело?   -  person Nolonar    schedule 19.04.2013
comment
В качестве альтернативы вы можете использовать изменяемый byte [], закрепить его через gchandle, а затем .clear, когда закончите.   -  person Alex K.    schedule 19.04.2013


Ответы (1)


Я не знаю, что такое SQL, но в C # это не имеет смысла. Поскольку строка неизменна, вы не можете переопределить данные, даже если постараетесь изо всех сил.

Когда ты пишешь

cardnumber = "11111111111111111111";

Это просто создает еще одну строку в памяти, но старый номер карты все еще здесь, где-то в памяти.

И когда ты пишешь

cardnumber = null;

Он разыменовывает ранее созданную строку, и теперь у вас есть ссылка cardnumber, ни на что не указывающая. Но ваша строка, содержащая реальный номер карты, все еще здесь.
Так что этот код не только неверен, но и опасен, потому что дает вам ложное чувство безопасности.

Посмотрите, что написано в MSDN на SecureString страницу, которой поделился Джордж Дакетт в комментариях:

Экземпляр класса System.String является неизменным и, когда он больше не нужен, его нельзя программно запланировать для сборки мусора; то есть, после создания экземпляр доступен только для чтения, и невозможно предсказать, когда экземпляр будет удален из памяти компьютера. Следовательно, если объект String содержит конфиденциальную информацию, такую ​​как пароль, номер кредитной карты или личные данные, существует риск, что информация может быть раскрыта после ее использования, поскольку ваше приложение не может удалить данные из памяти компьютера.

Дальнейшие чтения:

person Cyril Gandon    schedule 19.04.2013