Но ведь в этом-то и его слабость! Код и статические данные не случайны. Утилита, выискивающая незакономерные значения в исполняемом образе, быстро обнаружит ключ. На самом деле такая утилита уже создана британской компанией nCipher (http: www.ncipher.com). Она подключается к работающему процессу и сканирует его память в поисках энтропии. Обнаружив области с высокой степенью случайности, она выясняет, являются ли найденные данные ключом, например ключом протокола SSLTLS. Утилита редко ошибается! Подобные атаки описаны в документе Playing Hide and Seek with Stored Keys (Игра в прятки с ключами) http: www.ncipher.com,products.rscs,downloads.whitepaperskeyhide.pdf. Компания nCipher не распространяет утилиту, храня ее для внутреннего использования. ГЛАВА 8 Подводные камни криптографии 235 Примечание Подробнее о хранении секретной информации в ПО рассказывается в главе 9. Внимание! Не прописывайте секретные ключи в коде, то же самое относится к файлам ресурсов (RC-файлы) и конфигурации. Рано или поздно их все равно найдут. Если вы думаете, что этим никто не станет заниматься, то жестоко ошибаетесь. Долгосрочные и краткосрочные ключи Существует два класса ключей: долгосрочные и краткосрочные. Последние также называют временными, или эфемерными (ephemeral), и используют в самых разных сетевых протоколах, например IPSec, SSLTLS, RPC и. Процесс управления генерацией ключей скрыт от приложения и пользователя. Долгосрочные ключи применяются для аутентификации, обеспечения целостности сообщения и невозможности отрицания авторства (nonrepudiation), а также создания временных ключей. Например, в протоколе SSLTLS сеансовые ключи сервер обычно создает на основе своего закрытого ключа. Вообще-то, все намного сложнее, но основная идея именно такая. Долгосрочные ключи нужны для защиты постоянных данных, хранящихся в базах данных и файлах, и именно их долговременная природа привлекает хакеров много времени для взлома, да и ценность информации выше. Понятно, что долгосрочные ключи необходимо безопасно генерировать и надежно защищать. А теперь пришла пора рассказать о том, как правильно управлять ключами. Выбор длины ключа для защиты данных Зашифрованные данные необходимо защищать ключом достаточной длины. Понятно, что чем она меньше, тем легче хакеру. Однако ключи различных алгоритмов взламывают по-разному. Большинство ключей симметричных шифров, таких как DES и RC, взламывают простым перебором. А вот атакуя RSA (алгоритм асимметричного шифрования), пытаются определить случайные значения, которые применялись для генерации открытого и закрытого ключей. Такой процесс называется разложением на множители (factoring). Поэтому нельзя утверждать, что 112-битный DES-ключ менее безопасен, чем 512-битный RSA-ключ, ведь они взламываются разными способами. Если уж об этом зашла речь, то последний раскладывается на множители значительно быстрее, чем выполняется полный перебор 11битного DES-ключа. Примечание Посмотрите статью Cryptographic Challenges (Проблемы криптографии) на Web-странице http:www.rsasecurity.com,rsalabs.challenges. В ней речь идет о взломах DES полным перебором и RSA разложением на множители. Таким образом, вы вправе защищать симметричные ключи асимметричными, но только при условии, что у последних достаточная длина. Примерные значе 236 Часть II Методы безопасного кодирования ния возьмите из табл. 8-2, созданной на основе документа Determining Strengths For Public Keys Used For Exchanging Symmetric Keys (Определение стойкости отрытых ключей, применяемых для обмена симметричных ключей) (http:ietf.org, internetdrafts.draftormanpublickeylengths.txt). Таблица 8-2. Соответствие размеров симметричных и асимметричных ключей Длина симметричного Эквивалентная длина Эквивалентная длина ключа, бит ключа RSA, бит ключа DSA, бит 70 947 128 80 1228 145 90 1553 153 100 1926 184 150 4575 279 200 8719 373 250 14596 475 Итак, для защиты 80-битового симметричного ключа годится RSA-ключ длиной по крайней мере 1228 бит. Если он короче, хакеру проще расшифровать ключ RSA, чем атаковать в лоб 80-битный симметричный ключ. Внимание! Бессмысленно защищать 128-битный AES-ключ 512-битным RSAключом.