военная тайна ДРОЗДОВ АНДРЕЙ AKA SULVERUS Спецвыпуск: Хакер, номер #072, стр. 072-034-6 [хэширование.] Среди хэш-алгоритмов в .NET реализованы MD5, SHA1, SHA256, SHA384, SHA512, HMAC-SHA-1 и MACTripleDES. Я подозреваю, что первые две разновидности алгоритмов знакомы практически всем, а алгоритм MACTripleDES - менее известен. Для расчета хэш-значения любым алгоритмом нужно использовать уже излюбленное нами пространство имен System.Security.Cryptography. Для расчета хэш-значения используется метод ComputeHash(byte[] ByteArray). Рассмотрим код для хэширования: листинг Расчет контрольных сумм public class CreateHash { public static string[] Hash = new string[7]; //создаем строковой массив public static void Make() { Console.WriteLine("Enter a value"); byte[] Value = ASCIIEncoding.UTF8.GetBytes(Console.ReadLine()); //получаем значение MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider(); SHA1Managed SHA1 = new SHA1Managed(); SHA256Managed SHA256 = new SHA256Managed(); SHA384Managed SHA384 = new SHA384Managed(); //создаем криптопровайдеры SHA512Managed SHA512 = new SHA512Managed(); HMACSHA1 MACSHA = new HMACSHA1(); MACTripleDES MACTDes = new MACTripleDES(); //генерируем хэш-значения Hash[0] = ASCIIEncoding.UTF8.GetString(MD5.ComputeHash(Value)); Hash[1] = ASCIIEncoding.UTF8.GetString(SHA1.ComputeHash(Value)); Hash[2] = ASCIIEncoding.UTF8.GetString(SHA256.ComputeHash(Value)); Hash[3] = ASCIIEncoding.UTF8.GetString(SHA384.ComputeHash(Value)); Hash[4] = ASCIIEncoding.UTF8.GetString(SHA512.ComputeHash(Value)); Hash[5] = ASCIIEncoding.UTF8.GetString(MACSHA.ComputeHash(Value)); Hash[6] = ASCIIEncoding.UTF8.GetString(MACTDes.ComputeHash(Value)); } } В этом классе создается строковой массив, который будет заполняться хэш-значениями. Создается массив байтов, заполняемый при помощи метода Console.ReadLine(). Затем создаем криптопровайдеры в динамической памяти, шифруем и заполняем строковой массив. [потенциальные уязвимости.] Система CryptoAPI довольно обширна и интересна, но это не исключает, а очень даже способствует большому количеству недочетов в ней. За время написания статьи автор столкнулся с несколькими переполнениями буфера при расшифровке алгоритмом RSA, проблемой несовместимости кодировок при хэшировании и расшифровке алгоритма DES. Конечно, верификатор отловил переполнение буфера, и после появления окна с надписью о том, что программа выполнила недопустимую операцию, в консоли появилась надпись overflow с кодом ошибки. Но и на таких простых примерах видно, насколько еще недоработана система криптографии в .NET. По последним обещаниям компании Майкрософт все неточности и ошибки будут исправлены в полной стабильной версии .NET 3.0. Будем ждать. [the end.] Мы узнали некоторые достоинства и недостатки CryptoAPI в Windows Vista, немного рассмотрели пространство имен System.Security.Cryptography, кратко изучили все виды криптографических алгоритмов и их криптопровайдеров в .NET. На мой взгляд, самой безопасной реализацией криптографического алгоритма в .NET является RSA, - он, как и всегда, надежен. В данный момент его можно смело использовать в своих проектах (с длиной ключа, начиная от 2048 для любовных писем – Прим. Dr. Все, что меньше – на фиг с пляжа). |