Убирание c# массива байтов с уязвимыми данными

Это не пример Python, но в D программирование языка , термин mixin используется для обращения к используемому почти такому же пути конструкции; добавление груды материала к классу.

В D (который между прочим не делает MI) это сделано путем вставки шаблона (думайте синтаксически осведомленные и безопасные макросы, и Вы будете близки) в объем. Это допускает одну строку кода в классе, структуре, функции, модуле или безотносительно расшириться до любого количества объявлений.

6
задан Gautam 24 August 2009 в 03:22
поделиться

7 ответов

Я не могу придумать никаких обстоятельств, при которых звонок в Array.Clear когда-либо был бы оптимизирован, и даже если бы это было возможно, он был бы оптимизирован только в тех случаях, когда ваш байт [] уже был очищен.

Изменить: Что-то еще, что следует учитывать, будет выяснять, Реализация SecureString будет полезна в вашей ситуации:

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

9
ответ дан 8 December 2019 в 14:45
поделиться

Даже если Array.Clear гарантированно выполняется (не оптимизирован), я думаю, у вас все еще может быть проблема. Сборщик мусора может перемещать объекты в куче, и нет гарантии, что следы исходного байта останутся, если он был перемещен из одного места в другое до вызова Array.Clear.

Вы можете проверить SecureString , ProtectedData или ProtectedMemory . Но если вам нужен более ручной подход, я думаю, вам придется по крайней мере закрепить массив байтов, чтобы GC не мог его перемещать. Я считаю, что SecureString также использует этот трюк.

4
ответ дан 8 December 2019 в 14:45
поделиться

Если вас беспокоит Array.Clear, вы всегда можете просто Marshal.Copy пустой массив байтов в конфиденциальные данные.

Например, вот так (при условии, что 'data' - байт [], содержащий конфиденциальную информацию):

        byte[] clear = new byte[data.Length];
        unsafe
        {
            fixed (byte* ptr = &data[0])
            {
                Marshal.Copy(clear, 0, new IntPtr(ptr), data.Length);
            }
        }
1
ответ дан 8 December 2019 в 14:45
поделиться

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

Тем не менее, уверены ли вы, что вам нужно очистить только этот массив? Рассмотрим все другие места, где значение также могло существовать: буфер в форме, передаваемые строковые объекты, ключевые эквивалентные значения в промежуточных вычислениях или выгружаемые на диск. Обнуление этого единственного массива дает вам только 1% пути. Вы должны очистить весь ключевой путь.

1
ответ дан 8 December 2019 в 14:45
поделиться

Если вы пишете свою собственную процедуру шифрования, мой совет: не делайте этого. Вы ошибетесь (как и я, как и любой, кто не является экспертом по безопасности ). Используйте хорошо известную, проверенную библиотеку.

(Если нет, то ничего!)

1
ответ дан 8 December 2019 в 14:45
поделиться

I was under the impression that there were already techniques to show the recent state of RAM. Then there's also the MIT guys that flash froze some RAM, lifted it and took it somewhere else and maintained all of the state.

So, if you were paranoid, you'd randomly write a whole bunch of data over your array a few times.

0
ответ дан 8 December 2019 в 14:45
поделиться

AFAIK нет эквивалента SecureZeroMemory в CLR. Для хранения данных следует использовать SecureString .

0
ответ дан 8 December 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: