Модификатор (salt) это значение, специально выбранное или случайное, которое в незашифрованном виде присоединяется к шифрованному сообщению. Комбинирование ключа и модификатора помогает сбить хакера с толку. Модификатор часто используется в -системах для создания хеша паролей. В старые добрые времена хеши паролей хранились открытым текстом в общедоступном файле (в каталоге,etc.passwd). Любой мог посмотреть этот файл и сравнить хеши своего пароля и других пользователей. Если находились совпадающие хеши, то и соответствующие пароли совпадали! В Windows модификаторы паролей не применяются, хотя в Windows 2000 и более поздних версиях хеши паролей шифруются перед размещением в постоянном хранилище, что обеспечивает тот же результат. В Windows NT 4.0 с SP 3 при необходимости можно задействовать функцию Syskey (настоятельно ее рекомендуем). Внесем небольшие изменения в программу на основе CryptoAPI, применив модификатор. if (! CryptCreateHash(hProv, _MD, 0, 0, &hHash)) throw; if (! CryptHashData(hHash, bKey, MAX_,0)) throw; if (! CryptHashData(hHash, bSalt, cbSaltSize, 0)) throw; if (! CryptDeriveKey(hProv, _RC, hHash, _E, &hKey)) throw; 248 Часть II Методы безопасного кодирования Код просто хеширует модификатор вместе с ключом; ключ остается зашифрованным, а модификатор в незашифрованном виде добавляется к сообщению. Внимание! Биты модификатора состоят из случайных данных. Биты ключа должны оставаться в тайне, в то время как к битам модификатора подобное требование не предъявляется, и они передаются открытым текстом. Модификатор лучше всего подходит для передачи или хранения большого числа похожих пакетов, зашифрованных одним и тем же ключом. Обычно два одинаковых пакета после шифрования тоже совпадают до бита, а это очень полезный сигнал взломщику. Если менять модификатор при отсылке каждого пакета, результирующие шифропакеты будут отличаться, даже если исходные одинаковы. Модификаторы не обязательно должны оставаться секретными и обычно передаются открытым текстом с каждым зашифрованным пакетом, поэтому гораздо проще с каждым пакетом менять значения модификатора, а не ключ. Примечание Все алгоритмы шифрования в. NET Framework блочные. Поэтому у вас меньше шансов совершить ошибку, подобную тем, что описаны в этом разделе. Атаки на поточные шифры путем переворота бит Как я уже говорил, в алгоритмах потокового шифрования данные, как правило, шифруются и расшифровываются побитово достаточно применить операцию XOR к открытому тексту и ключевому потоку, сгенерированному поточным шифром. Из-за этого поточные шифры восприимчивы к атакам переворота бит (bit flip). При побитовом шифровании хакер может изменить 1 бит зашифрованного текста, и получатель не узнает, что данные изменились. Это очень опасно, если взломщик не знает содержания сообщения, но знаком с его форматом. Допустим, известно, что формат сообщения таков: hh:mm dd! mmm! yyyy. bbbbbbbbbbbbbbbbbbbbbbbbbbbb где hh часы в 24-часовом формате, mm минуты, dd дни, mmm трехбуквенная аббревиатура, обозначающая месяц, yyyy год, а bbbbb тело сообщения. Сквирт (Squirt) решил передать Мэйджору (Major) сообщение. Перед шифрованием поточным алгоритмом сообщение выглядело так: 16:00 03! Sep! 2004. Встречаемся в парке для выгула собак. Сквирт. Примечание Будем считать, что Сквирт и Мэйджор имеют общий ключ, который используют для шифрования и расшифровки данных. Как видите, Сквирт хочет встретиться с Мэйджором в парке для выгула собак 3-го сентября 2004 года в 4 пополудни. Вам, как хакеру, не известен исходный текст, у вас есть только шифрованное сообщение, и вам известен формат сообщения. Однако ничего не мешает вам поменять один или несколько зашифрованных байт в полях времени и даты (в общем случае, в любом поле) и переправить сообще ГЛАВА 8 Подводные камни криптографии 249 ние Мэйджору, у которого нет инструментов, чтобы обнаружить подмену. В расшифрованном Мэйджором сообщении указано совсем другое время (не 16:00), и встреча не состоится. Это простая и в то же время опасная атака! Защита от атак переворота бит Подобные атаки предотвращаются путем реализации цифровой подписи или хеша с ключом (о нем чуть позже).