Реклама:

Алгоритмы хэширования

Существует несколько алгоритмов хэширования, но наиболее известными из них являются MD5 и SHA1. Описание принципов этих алгоритмов работы можно найти в пособии по практической криптографии. Все классы .NET, реализующие алгоритмы хэширования, порождены от класса HashAlgoritm и находятся в пространстве имен System.Security.cryptography (рис. 4-1).

В алгоритмах MD5, RIPEMD и SHA1 были найдены изъяны. По возможности (например, при построении новой системы, которой не требуется совместимость с другими приложениями, использующими такие алгоритмы) избегайте их использования. В настоящее время рекомендуется применять алгоритмы SHA256-SHA512 (алгоритм SHA384 реально ничего не дает — в большинстве реализаций внутри создается алгоритм SHA512, а ненужные биты отбрасываются). Алгоритмы различаются также по длине выходных данных: SHA1 создает выходные данные длиной 160 бит, а алгоритмы SHA256 и SHA512 — длиной соответственно 256 и 512 бит. Более подробную информацию о рекомендуемых алгоритмах криптографии можно найти на домашней странице NSA (hap://www,nsagov/ia/industry/crypto_suite_b.cfm).

Байер Доминик Microsoft ASP.NET. Обеспечение безопасности. Мастер-класс

Рис. 4-1. Хэширование алгоритмов в .NET

ПРИМЕЧАНИЕ Имена классов, заканчивающиеся на CryptoServiceProvlder, указывают на то, что эти классы являются упаковщиками «родных» библиотек Microsoft Windows Crypto API Реализация же классов, имена которых заканчиваются на Managed, выполняется в управляемом коде Чтобы избежать зависимостей от платформ, выбирайте управляемые реализации («родные» классы работают быстрее).

хэширование в .NET

Создание хэша не должно вызвать у вас трудностей. Создайте экземпляр класса, который реализует алгоритм хэширования, и вызовите метод ComputeHosh. Классы хэширования работают с байтовыми массивами, такими как входные и выходные данные. Если вы будете иметь дело со строковыми данными, строку следует сначала закодировать в байтовый массив. Для этого используются классы пространства имен System.Text. В зависимости от набора входных символов строку нужно кодировать в UTF-8 или Unicode.

string simpleHash(string data)

{

// Кодируем данные в массив

byte[] rJataBytes = Encoding. UTFB.GetBytes(data);

// Создаем хэш

SHA256Managed she = new SHA2S6Managed(); Dyte[] hasfiBytes = sha.ComputeHash(dataBytes);

// Возвращаем строку, закодированную в Base 64 return Convert.ToBase64String(hasriBytes);

J

Этот пример кода создает следующий хэш для строки hello:

LPJNul+wow4m6DsqxbninhsWHlwfpOJecwQzYpOLmCQ=

Некоторая вариация входных данных, например изменение строки на hallo, даст совершенно иной результат (при изменении одного бита входных данных в хорошем алгоритме хэширования выходные данные должны измениться как минимум на 50 %).

03UdM/nNUEnErytGJzVFfk07rxMLy7ri/OJ40n7rrlLk=

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

byte[] hasriFile(string fileName) {


⇐ Предыдущая страница| |Следующая страница ⇒