Это не пример Python, но в D программирование языка , термин mixin
используется для обращения к используемому почти такому же пути конструкции; добавление груды материала к классу.
В D (который между прочим не делает MI) это сделано путем вставки шаблона (думайте синтаксически осведомленные и безопасные макросы, и Вы будете близки) в объем. Это допускает одну строку кода в классе, структуре, функции, модуле или безотносительно расшириться до любого количества объявлений.
Я не могу придумать никаких обстоятельств, при которых звонок в Array.Clear
когда-либо был бы оптимизирован, и даже если бы это было возможно, он был бы оптимизирован только в тех случаях, когда ваш байт []
уже был очищен.
Изменить: Что-то еще, что следует учитывать, будет выяснять, Реализация SecureString
будет полезна в вашей ситуации:
Объект
SecureString
похож на объектСтроковый
объект, в котором есть текст ценность. Однако ценность Объект SecureString автоматически зашифрован, может быть изменен, пока вы приложение помечает его как доступное только для чтения, и можно удалить из памяти компьютера ваше приложение или .NET Сборщик мусора фреймворка
Даже если Array.Clear гарантированно выполняется (не оптимизирован), я думаю, у вас все еще может быть проблема. Сборщик мусора может перемещать объекты в куче, и нет гарантии, что следы исходного байта останутся, если он был перемещен из одного места в другое до вызова Array.Clear.
Вы можете проверить SecureString , ProtectedData или ProtectedMemory . Но если вам нужен более ручной подход, я думаю, вам придется по крайней мере закрепить массив байтов, чтобы GC не мог его перемещать. Я считаю, что SecureString также использует этот трюк.
Если вас беспокоит 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);
}
}
Уловка, которая работает с большинством компиляторов C, заключается в том, чтобы сделать что-то вроде суммирования всех элементов очищенного массива, а затем что-то сделать с этой суммой, например, распечатать ее или xor с вашим возвращаемым значением . Таким образом, удаление мертвого кода не устранит очистку массива.
Тем не менее, уверены ли вы, что вам нужно очистить только этот массив? Рассмотрим все другие места, где значение также могло существовать: буфер в форме, передаваемые строковые объекты, ключевые эквивалентные значения в промежуточных вычислениях или выгружаемые на диск. Обнуление этого единственного массива дает вам только 1% пути. Вы должны очистить весь ключевой путь.
Если вы пишете свою собственную процедуру шифрования, мой совет: не делайте этого. Вы ошибетесь (как и я, как и любой, кто не является экспертом по безопасности ). Используйте хорошо известную, проверенную библиотеку.
(Если нет, то ничего!)
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.
AFAIK нет эквивалента SecureZeroMemory в CLR. Для хранения данных следует использовать SecureString .