Курс лекций для студентов специальности i-31 03 04 Информатика всех форм обучения Минск 2010



страница29/29
Дата09.08.2019
Размер0.64 Mb.
#126834
ТипКурс лекций
1   ...   21   22   23   24   25   26   27   28   29

Изолированные хранилища


Изолированное хранилище (isolated storage) – механизм, позволяющий сохранять данные приложения на компьютере локального пользователя без предоставления прав доступа к файлам, базам данных и реестру.

Изолированное хранилище предлагает следующие области изоляции:

1. Изоляция по пользователю:


  • хранилище конкретного пользователя;

  • хранилище компьютера.

2. Изоляция по коду:

  • хранилище приложения;

  • хранилище сборки;

  • хранилище домена.

Управление изолированным хранилищем выполняется при помощи класса System.IO.IsolatedStorage.IsolatedStorageFile, основные методы которого перечислены в табл. 22.

Таблица 22



Методы класса IsolatedStorageFile

Имя элемента

Описание

Close()

Закрывает хранилище

CreateDirectory()

Создаёт каталог в изолированном хранилище

DeleteDirectory()

Удаляет каталог в изолированном хранилище

DeleteFile()

Удаляет из изолированного хранилища файл

GetDirectoryNames()

Получает список каталогов изолированного хранилища, соответствующий шаблону поиска

GetFileNames()

Получает список файлов изолированного хранилища, соответствующий шаблону поиска

GetMachineStoreForApplication()

Получает изолированное хранилище, соответствующее приложению, с областью действия компьютера (стат. метод)

GetMachineStoreForAssembly()

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

GetMachineStoreForDomain()

Получает изолированное хранилище, соответствующее домену, с областью действия компьютера (статический метод)

GetStore()

Получает изолированное хранилище, соответствующее указанным данным изоляции по коду и пользователю (статический метод)

GetUserStoreForApplication()

Получает изолированное хранилище, соответствующее приложению, с областью действия пользователя (стат. метод)

GetUserStoreForAssembly()

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

GetUserStoreForDomain()

Получает изолированное хранилище, соответствующее домену, с областью действия пользователя (стат. метод)

InitStore()

Инициализирует новый объект изолированного хранилища

Remove()

Удаляет изолированное хранилище со всем ее содержимым (статический метод)

Класс System.IO.IsolatedStorage.IsolatedStorageFileStream – это поток, который позволяет читать и записывать данные в файлы изолированного хранилища.

Продемонстрируем работу с рассмотренными классами:

// получаем хранилище текущего пользователя и домена

var storage = IsolatedStorageFile.GetUserStoreForDomain();


// создаём подкаталог

storage.CreateDirectory("data");


// открываем или создаём файл (макс. размер = 10K)

var isoStream = new IsolatedStorageFileStream(@"data\file.txt",

FileMode.OpenOrCreate,

FileAccess.Write,

FileShare.Write,

10240,


storage);
// пишем в поток

isoStream.Position = 0;

var writer = new StreamWriter(isoStream);

writer.WriteLine("Useful Info");


// выводим информацию о хранилище

Console.WriteLine("CurrentSize = " + storage.CurrentSize);

Console.WriteLine("MaximumSize = " + storage.MaximumSize);
// закрываем поток и хранилище

writer.Close();

storage.Close();

Криптография


Криптографические возможности .NET применяются для защиты данных. Один из простейших способов использования криптографии – методы Encrypt() и Decrypt() классов File и FileInfo. Первый метод выполняет прозрачное шифрование файла, используя ключ, сгенерированный по паролю текущего пользователя. «Прозрачным» этот вид шифрования назван потому, что его эффект будет заметен только для других пользователей (а не для того, который его выполнил). Второй метод устраняет прозрачное шифрование файла.

File.WriteAllText("myfile.txt", "This is a sample text");

File.Encrypt("myfile.txt");

Ключ, созданный по паролю текущего пользователя, могут применять для шифрования данных и статические методы Protect() и Unprotect() класса ProtectedData (пространство имён System.Security.Cryptography в сборке System.Security.dll). Первый параметр этих методов – массив байт, подлежащих шифровке/дешифровке. Второй параметр – массив байт, дополнительно добавляемый к ключу для усиления его защиты. Третий параметр – элемент перечисления DataProtectionScope, указывающий на методику выработки ключа (текущий пользователь или текущий компьютер).

// шифруемые данные

byte[] data = Encoding.UTF8.GetBytes("secret");

// не используем усиление ключа, созданного по паролю пользователя

byte[] en_1 = ProtectedData.Protect(data, null,

DataProtectionScope.CurrentUser);

// используем усиление ключа, созданного по данным текущей машины

byte[] en_2 = ProtectedData.Protect(data, new byte[] { 2, 2, 5 },

DataProtectionScope.LocalMachine);

Одним из методов защиты информации является хеширование. Это односторонне шифрование, вырабатывающее по массиву данных короткий фиксированный набор байт – хэш. Хэш является своеобразной «подписью» для данных, так как любое изменение данных ведет к изменению хэша. Чем длиннее хэш, тем более стойким он является (т.е. тем труднее найти два разных массива данных с одинаковым хэшем).

Для хеширования следует использовать один из классов, наследников класса HashAlgorithm. Например, в следующем фрагменте кода демонстрируется хеширование по алгоритму SHA-256 (http://ru.wikipedia.org/wiki/SHA-2).

byte[] data = Encoding.UTF8.GetBytes("password");

byte[] hash = SHA256.Create().ComputeHash(data);

Метод ComputeHash() может принимать в качестве аргумента не только массив байт, но и поток данных.

Симметричное шифрование использует для зашифровки и расшифровки информации один и тот же ключ. Платформа .NET содержит реализацию четырёх симметричных алгоритмов, лучший из которых – алгоритм Rijndael (http://ru.wikipedia.org/wiki/Rijndael). Реализации алгоритмов оформлены как наследники абстрактного класса SymmetricAlgorithm. Для работы симметричным алгоритмам требуется байтовый ключ установленной длины и вектор инициализации (это также байтовый массив). Далее представлен пример симметричного шифрования последовательности байтов, по мере того как она записывается в файл.

// ключ и вектор инициализации должны быть 126, 128 или 256 бит

byte[] key = Encoding.UTF8.GetBytes("-My private key-");

byte[] iv = Encoding.UTF8.GetBytes("--Init vector--");

byte[] data = Encoding.UTF8.GetBytes("Secret message");

SymmetricAlgorithm algorithm = Rijndael.Create();

ICryptoTransform encryptor = algorithm.CreateEncryptor(key, iv);

using (var stream = File.Create("data.bin"))

{

using (var cryptoStream = new CryptoStream(stream, encryptor,



CryptoStreamMode.Write))

{

cryptoStream.Write(data, 0, data.Length);



}

}

Предыдущий пример демонстрирует использование декоратора CryptoStream для организации зашифрованного потока. Этот декоратор можно комбинировать с другими классами, например DeflateStream (сжатый поток).



Кроме симметричного шифрования платформа .NET предоставляет реализацию двух алгоритмов шифрования с открытым ключом – DSA и RSA. Второй алгоритм является более стойким. Мы не будем подробно останавливаться на нюансах использования RSA1, приведём лишь фрагмент кода, который иллюстрирует этот вид шифрования.

byte[] data = Encoding.UTF8.GetBytes("Secret message");

using(var rsa = new RSACryptoServiceProvider())

{

byte[] encrypted = rsa.Encrypt(data, true);



}

2.33. ДИАГНОСТИКА


В данном параграфе будут рассмотрены средства, облегчающие диагностику проблем и мониторинг поведения приложения.

Описание средств диагностики начнём с условной компиляции, выполняемой при помощи специальных препроцессорных директив. Препроцессорные директивы – это инструкции для компилятора, начинающиеся с символа # и расположенные в отдельной строке кода. Директива #if заставляет компилятор проигнорировать фрагмент кода, если описан символ, указанный после #if. Для описания символа служит препроцессорная директива #define.

#define TESTMODE // #define должна стоять в начале фала

using System;


public class Program

{

private static void Main(string[] args)



{

#if TESTMODE

Console.WriteLine("in test mode!");

#endif


}

}

Символ можно описать не только с помощью #define, но и указав ключ компилятора командной строки /define или используя окно свойств проекта в Visual Studio (в этих случаях описание символа распространяется не на отдельный файл, а на всю сборку). При условной компиляции можно применять также директивы #else, #elif (комбинация #else и #if), знаки &&, ||, ! и директиву #undef (для отмены в отдельном файле символа сборки).



#define V2

#define TestMode

using TestType =

#if V2 && TestMode

MyCompany.GadgetV2;

#else


MyCompany.Gadget;

#endif


Метод класса1 может быть помечен атрибутом [Conditional] с указанием символа. В этом случае компилятор исключит из кода все вызовы помеченного метода, если символ будет не определён.

[Conditional("DEBUG_MODE")]

private void WriteLog(string ms) { . . . }

По сути, использование для метода атрибута [Conditional] аналогично обрамлению каждого вызова метода директивами #if-#endif.

При мониторинге работы программы полезным оказывается возможность вывода и фиксации различных диагностических сообщений. Для этой цели можно применить статические классы Debug и Trace из пространства имён System.Diagnostics. Эти классы очень похожи, но все методы класса Debug помечены атрибутом [Conditional("DEBUG")], а все методы класса Trace – атрибутом [Conditional("TRACE")]. Visual Studio определяет в отладочной конфигурации и DEBUG, и TRACE, а в выпускной конфигурации только TRACE.

Классы Debug и Trace содержат методы вывода сообщений Write(), WriteLine(), WriteIf(), Fail() и Assert(). В классе Trace определены дополнительные методы TraceInformation(), TraceWarning() и TraceError().

Debug.WriteLine("Debug message");

Debug.WriteIf(5 > 2, "Correct condition");

Debug.Fail("Error in code");

Debug.Assert(3 < 2, "Error in condition");

Trace.TraceInformation("Info");

Классы Debug и Trace имеют свойство Listeners, содержащее коллекцию объектов TraceListener. Эти объекты ответственны за обработку содержимого, генерируемого методами вывода сообщений. По умолчанию коллекция Listeners включает один слушатель – объект класса DefaultTraceListener. Этот слушатель записывает сообщения в окно отладчика Visual Studio, а при вызове метода Fail() или нарушении условия в методе Assert() выводит диалоговое окно для подтверждения выполнения программы. Это поведение можно изменить, удалив слушатель или добавив один или несколько собственных. Слушатель можно разработать, унаследовав от TraceListener, или воспользоваться одним из готовых типов:



  • TextWriteTraceListener – пишет в поток, или в TextWriter, или в файл. Имеет подклассы ConsoleTraceListener, DelimitedListTraceListener, XmlWriterTraceListener, EventSchemaTraceListener;

  • EventLogTraceListener – пишет в журнал событий Windows;

  • EventProviderTraceListener – пишет в подсистему ETW в Windows Vista;

  • WebPageTraceListener – пишет на веб-страницу ASP.NET.

При использовании журнала событий Windows сообщения, выводимые методами TraceWarning() и TraceError(), выводятся как предупреждения и ошибки соответственно.

// удаляем слушатель по умолчанию

Trace.Listeners.Clear();
// добавляем слушатель для записи в конец файла

Trace.Listeners.Add(new TextWriterTraceListener("trace.txt"));


// настраиваем журнал событий Windows

if(!EventLog.SourceExists("DemoApp"))

EventLog.CreateEventSource("DemoApp", "Application");
// и добавляем соответсвующий слушатель

Trace.Listeners.Add(new EventLogTraceListener("DemoApp"));


// пишем несколько сообщений

Trace.WriteLine("message");

Trace.TraceError("error");

В классе TraceListener определено свойство Filter, которое можно установить для фильтрации сообщений. Кроме этого, имеется несколько свойств для управления внешним видом выводимых сообщений.

var listener = new TextWriterTraceListener("trace.txt");

listener.Filter = new SourceFilter("Program");

listener.IndentSize = 4;

Для слушателей, которые пишут информацию в кэшируемый поток (например, слушатель TextWriteTraceListener), рекомендуется перед окончанием приложения вызывать методы Close() или Flash(). Такие же методы есть у классов Debug и Trace. Если у этих классов установить свойство AutoFlash в true, то метод Flash() будет вызываться после каждого сообщения.



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

1 Это значение должно иметь целое количество минут.

1 Некоторые символы Unicode представлены двумя 16-битными «суррогатными» символами.

1 Подробнее см. http://ru.wikipedia.org/wiki/Регулярные_выражения.

1 К базовым типам платформы .NET относятся все числовые типы, а также bool, string и System.DateTime.

1 Типы CultureInfo, NumberFormatInfo, DateTimeFormatInfo определены в пространстве имён System.Globalization.

1 var nfi = (NumberFormatInfo)formatProvider.GetFormat(typeof(NumberFormatInfo));

1 Типы, переопределяющие Equals(), должны также перекрывать метод GetHashCode(); в противном случае коллекции-словари могут работать неправильно.

1 Вот почему тип string не перегружает операции < и >  результат может измениться в зависимости от текущих региональных стандартов.

1 Сборка мусора также происходит и при окончании работы программы.

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

1 Если бы использовалось foreach (var s in shop), то тип s был бы object.

1 В пространстве имен System.Collections имеется слаботипизированный аналог класса List – класс ArrayList.

1 В пространстве имен System.Collections имеются слаботипизированные аналоги классов Queue и Stack – классы Queue и Stack.

1 В пространстве имен System.Collections имеется слаботипизированный аналог класса Dictionary – класс Hashtable.

1 В пространстве имен System.Collections имеется слаботипизированный аналог класса Collection – класс CollectionBase.

1 Для использования System.Linq необходимо подключить сборку System.Core.dll.

1 Все операторы LINQ имеют модификаторы public static. Для краткости эти модификаторы не указываются.

1 Сами адаптеры потоками не являются.

2 Список не является полным – представлены наиболее часто используемые классы.

1 Заметим, что класс FileStream уже обладает некоторой поддержкой буферизации.

1 При добавлении объектов типа XAttribute или унаследованных от XNode выполняется клонирование, если эти объекты уже имеют родителя в дереве объектов XML.

1 Запись + XName name означает наличие перегруженной версии, принимающей параметр name типа XName.

1 Запись + params означает наличие перегруженной версии, принимающей параметр типа params object[].

1 У XmlTextReader имеются также специфичные методы чтения конкретного содержимого XML-документа (например, ReadContentAsInt(), ReadAttributeValue()).

1 О синтаксисе применения атрибутов и операторе typeof рассказано далее.

1 SOAP (Simple object access protocol) – формат данных, основанный на XML. Применяется для передачи информации в глобальной сети.

1 Класс StreamingContext описывает контекст потока сериализации. Основным свойством класса является State, принимающее значения из перечисления StreamingContextStates.

1 Эти атрибуты размещены в пространстве имён System.Runtime.Serialization и одноимённой сборке.

2 Это необязательное условие при использовании NetDataContractSerializer.

1 Visual Studio не позволяет работать с многофайловыми сборками, поэтому файлы примера придется компилировать, используя компилятор командной строки csc.exe.

1 Технология зондирования сборок (probing) позволяет размещать зависимые сборки в подкаталогах.

1 Об атрибутах будет рассказано в следующих параграфах.

1 Статический метод Activator.CreateInstance() также выполняет создание объектов.

1 Если атрибут применяется к сборке или модулю, он должен быть записан после директив using, но перед основным кодом.

1 Данные требования не продиктованы исполняющей средой, но заложены в компиляторы языков для .NET.

1 Если бы создавался только один объект, соответствующий атрибуту, то изменение данных в нем отразилось бы на всех запросах к атрибуту.

2 В случае веб-приложения файл конфигурации всегда называется web.config.

1 В веб-приложениях используется System.Web.Configuration.WebConfigurationManager.

1 Любой созданный поток резервирует примерно один мегабайт памяти под свои нужды.

1 Прекращение работы фонового потока не гарантируется выполнение его блоков finally.

2 Оба метода – Suspend() и Resume() – помечены как устаревшие. Использовать их не рекомендуется.

1 public delegate void WaitCallback(object state);

1 Существует класс CountdownEvent, посылающий сигнал Set() при достижении внутренним счётчиком заданного значения (метод AddCount() увеличивает счётчик).

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











1 Вариант реализации данного шаблона был представлен в предыдущем параграфе.

1 Нельзя вызвать асинхронно объект группового делегата.

1 Настройка роли пользователя в Windows соответствует отнесению этого пользователя к одной из групп. Настройка групп выполняется командами Панель управленияАдминистрированиеУправление компьютером  Локальные пользователи и группы.

1 Существует класс (и атрибут) для разрешений, использующих данные принципала  PrincipalPermission. Так можно разрешить вызов метода определённому пользователю:

[PrincipalPermission(SecurityAction.Demand, Name = "Alex")]



private void ActionWithFiles() { . . . }

1 В частности, не затрагиваются вопросы генерации и сохранения ключей шифрования.

1 Или класс, производный от System.Attribute.

Каталог: images
images -> В списке студентов (или магистрантов)
images -> Н. И. Сулейманов Комплект контрольно-оценочных средств для оценки результатов освоения профессионального модуля разработан на основе Федерального государственного образовательного стандарта среднего профессионального
images -> По направлению подготовки
images -> Добавить гаджеты. Добавление гаджетов
images -> Техническое задание № apnip/C. 2/CS/Ind/01 Международный консультант по улучшенной производительности орошаемого земледелия
images -> Комплект контрольно-оценочных средств по профессиональному модулю пм. 01 Техническое обслуживание и ремонт автотранспорта


Поделитесь с Вашими друзьями:
1   ...   21   22   23   24   25   26   27   28   29




База данных защищена авторским правом ©vossta.ru 2022
обратиться к администрации

    Главная страница