Храние паролей и алгоритмы шифрования в MS Office Outlook Введение Изначально, в данной статье планировалось рассказать о забавной коллизии паролей в PST файлах Outlook. Но в последствии она была немного расширена, чтобы показать, наряду с недостатками, достоинства программы по сравнению со своими ближайшими конкурентами, рассказать о применяемых методах хранения персональной информации. К тому же, на примере Outlook удобно проследить хронологию развития криптологической мысли, которую в общих чертах можно перенести и на развитие всей линейки операционной системы Windows в целом. Пароли PST файлов Итак, начнем с того, что .PST файл в Microsoft Office Outlook представляет собой файловое хранилище данных на локальном компьютере, в котором в упорядоченном виде хранятся контакты, заметки, почтовые сообщения и другие элементы. Файл .PST может использоваться в качестве стандартного расположения для доставки почтовых сообщений. Его также можно использовать для упорядочения и резервного копирования данных. Чтобы защитить содержимое .PST файла, а также ограничить доступ к нему посторонних лиц, можно установить пароль длиной до 15 знаков. В этом случае принято считать, что без знания оригинального пароля открыть .PST файл невозможно. Посмотрим, действительно ли это так. Диалог ввода пароля PST Пароль на доступ к .PST не запоминается и не хранится в явном виде. Вместо этого вычисляется его хэш значение, которое и сохраняется в самом .PST файле либо, если установлена опция 'Сохранить пароль в списке паролей', в реестре Windows с использованием дополнительного шифрования. Самое интересное заключается в том, что алгоритм подсчета хэша пароля представляет собой не алгоритм хэширования, а простой подсчет контрольной суммы CRC32. CRC32 - алгоритм проверки целостности данных, но уж никак не хэширования. Microsoft по неизвестной причине решила использовать именно его вместо более стойких, например, SHA. Доставшись по наследству от старых версий Outlook, MS долгое время не меняет этот алгоритм, руководствуясь, по всей видимости, соображениями совместимости. Хотя, с другой стороны, непонятно, почему это не было сделано с выходом Outlook 2003 (формат .PST Outlook 2003 имеет 64 битную внутреннюю адресацию, поддержку Unicode и несовместим с предыдущими версиями). Таким образом, хэш пароля представляет собой 32 бита его контрольной суммы. Давайте рассмотрим подробнее механизм работы CRC32: Code: DWORD CPstReader::Crc32( LPBYTE pPassword ) { assert( pPassword ); //set initial crc to zero DWORD crc=0; //till the end of string while ( *pPassword ) crc = (crc>>8) ^ pCRCTable[(BYTE)crc ^ (*pPassword++)]; return crc; } Как можно видеть из отрывка исходного текста, на вход подается пароль (pPassword), на выходе получаем его контрольную сумму. Уязвимость CRC32 заключается в том, что длина получаемой свертки пароля в 32 бита явно недостаточна, поэтому контрольные суммы двух различных паролей могут совпадать! Например, одинаковая контрольная сумма у паролей 1 и orxgnm или у mozart и 2920347097. И если вы думаете, что такие коллизии большая редкость, то сильно заблуждаетесь. Удивительная вещь эти коллизии. Часто наблюдается обратная зависимость: чем сложнее пароль, тем проще найденная для него коллизия. Возьмем пример из той же документации Outlook, отрывок которой не случайно был выбран в качестве предисловия для этой статьи. Нашему "надежному" паролю Y6dh!et5 запросто можно найти замену - более простую комбинацию всего из 5 символов - JlSfw. Еще одно любопытное наблюдение. Если контрольная сумма, хранимая в .PST равна нулю, то считается, что пароль не задан. Но если мы знаем, что встречаются пароли с одинаковыми контрольными суммами, то можно предположить, что существуют и такие, контрольная сумма которых тоже равна нулю. Они и вправду есть. Вот только часть большого списка: 1Rj78C, 5J8j84, ArTniW. Crc32("1Rj78C")=0, Crc32("5J8j84")=0, Crc32("ArTniW")=0. Задав один из таких паролей, мы в результате получим незащищенный .PST файл, и при следующем доступе к нему Outlook пароль не запросит. Не верите? Попробуйте сами. Экспериментальным путем было выяснено, что при использовании метода прямого перебора, для подбора пароля к хэшу Outlook понадобится в среднем не более минуты. Однако криптоанализ CRC32 показал, что данный алгоритм является полностью обратимым для коротких паролей (до 4 символов) и частично обратимым для всех остальных. Это означает, что можно практически сразу найти оригинальный пароль или его аналог, который будет неотличим для Outlook. Было доказано, что для нахождения коллизии (пароля, контрольная сумма которого будет такая же, как и у оригинального) потребуется не более 7 печатных символов. Шифрование PST файлов Если посмотреть опции PST файлов (см. рисунок ниже), то можно заметить, что Outlook кроме всего прочего позволяет еще шифровать содержимое. В этом случае, контрольная сумма пароля не лежит в открытом виде в .PST файле, а дополнительно кодируется с помощью одного из алгоритмов шифрования. Давайте рассмотрим эти алгоритмы. При создании нового .PST, Outlook предлагает на выбор 3 типа файла: 1. шифрование отсутствует 2. шифрование со сжатием 3. стойкое шифрование Создание нового хранилищаЕсли шифрование PST файла отсутствует, то все данные пользователя: контакты, письма, пароли и т.д., будут лежать в открытом, доступном другим пользователям виде. И их можно будет просмотреть, например, из текстового редактора. Алгоритм шифрования со сжатием создан таким образом, что каждому кодируемому символу соответствует другой, взятый из специальной таблицы. Вот этот алгоритм: Code: BOOL CPstReader::Decrypt1( LPBYTE buf, int iSize ) { assert( buf ); BYTE y=0; int x=0; //Check input buffer if ( buf==NULL ) return FALSE; //Check encryption type if ( m_pst.encryption!=PST_ ENCRYPT_COMPESSIBLE ) return FALSE; //actual decryption while ( iSize-- ) { y=buf[x]; buf[x++]=m_pTable[y]; } return TRUE; } Подстановочная таблица (m_pTable) специально создана так, чтобы обеспечить дальнейшее оптимальное сжатие зашифрованного таким образом текста. Однако данный алгоритм сам по себе не сжимает содержимое, а только создает благоприятные для этого условия. Стойкое шифрование тоже является разновидностью первого алгоритма замены. Но в отличие от предыдущего, обеспечивает более сильное шифрование. Другое отличие состоит в том, что зашифрованный этим алгоритмом PST файл впоследствии не удастся сделать таким компактным, как в первом случае. Code: BOOL CPstReader::Decrypt2( LPBYTE buf, int iSize, DWORD id ) { assert( buf ); int x=0; BYTE y=0; WORD wSalt; //Check input buffer if ( buf==NULL ) return FALSE; //Check encryption type if ( m_pst.encryption!=PST_ENCRYPT_STRONG ) return FALSE; //prepare encryption key from block ID wSalt=HIWORD(id) ^ LOWORD(id); //actual decryption while ( iSize-- ) { y=buf[x]; y+=LOBYTE(wSalt); y=m_pTable2[y]; y+=HIBYTE(wSalt); y=m_pTable2[y+0x100]; y-=HIBYTE(wSalt); y=m_pTable2[y+0x200]; buf[x++]= y - LOBYTE(wSalt++); } return TRUE; } Для восстановления блока данных необходимо знать идентификатор блока, без которого процесс расшифровки будет выглядеть несколько затруднительно. Хотя, если внимательно присмотреться к исходному тексту алгоритма, легко заметить, что при шифровании используется только 16 бит идентификатора блока, что позволяет значительно сократить количество возможных вариантов при подборе ключа шифрования, используя метод прямого перебора. Техника хранения паролей учетных записей почты После прочтения данной статьи, у вас может сложиться немного ложное мнение о том, что MS Outlook использует очень слабые и ненадежные алгоритмы шифрования паролей. Однако это не совсем так. Истина, как говорится, познается в сравнении. К тому же, мы проанализировали только шифрование в PST. Давайте теперь рассмотрим и сравним механизмы шифрования паролей учетных записей почты Outlook и других популярных программ. Большинство популярных почтовых клиентов попросту не заботятся о безопасности хранимых паролей пользователей. Например, Eudora, TheBat! или старые версии Netscape, используют для шифрования архаичный алгоритм BASE64 или его производные. IncrediMail просто накладывает XOR гамму на исходный пароль (язык не поворачивается назвать это шифрованием), старые версии браузера Opera вообще не шифровали почтовые пароли, а хранили их открытым текстом. Получше обстоит дело с новыми версиями популярных почтовиков, таких как Thunderbird, Opera M2, Outlook Express. Все они используют надежные, проверенные временем алгоритмы с использованием мастеринг ключей. В основном это связка из MD5 + RC4, или SHA + 3DES, либо их возможные варианты. Thunderbird, Opera M2, Outlook Express хранят мастер ключи и ключи шифрования вместе с зашифрованными паролями, что позволяет без труда (ну или почти без труда) выполнить их обратное преобразование. Что касается Outlook, то тут наблюдается очень прелюбопытнейшая картина. Всю хронологию развития техники хранения паролей к почтовым ящикам в программе Outlook можно условно разделить на четыре периода: - доисторический период - каменный век - средние века - период научно технического прогресса А теперь подробнее. Доисторический период - период первого становления на ноги. Говорят, первые версии программы умели шифровать хранимые в реестре пароли по алгоритму BASE64. Что уже само по себе являлось достижением для того времени. Для расшифровки таких паролей достаточно было одного калькулятора или пары-тройки извилин. Каменный век - Outlook 9x - время первых экспериментов. Появляется новый алгоритм, который, при шифровании паролей, использовал ключ шифрования и уникальный идентификатор записи. Ноу-хау того времени. Данные, зашифрованные по этому алгоритму, невозможно было расшифровать без знания ключа и идентификатора записи. Многие современные почтовые клиенты не могут похвастаться наличием таких алгоритмов в своем арсенале и по сей день. Однако общая идея нового типа шифрования омрачалась одним существенным недостатком - ключ шифрования и идентификатор записи хранились в реестре вместе с зашифрованными данными. Средние века - Outlook 2000 - первые стандарты. Пароли к почтовым аккаунтам теперь хранятся в защищенном хранилище (Protected Storage) Windows. Вот вкратце алгоритм расшифровки паролей в защищенном хранилище: 1. Создается key1 для расшифровки мастер ключа, используя SHA(Salt) + SHA(SID) + SHA(Salt). Salt - глобальная константа. SID - идентификатор пользователя. 2. Создается key2 для расшифровки мастер ключа, используя SHA(MKSalt) + SHA(key1). MKSalt - двоичные данные, уникальные для каждого мастер ключа, хранимые вместе с ним. key1 - 20 байт данных, полученных на предыдущем шаге. 3. С помощью алгоритма DES и key2 расшифровывается мастер ключ. 4. Полученный мастер ключ принимает участие в расшифровке ключа шифрования записи. Ключ шифрования записи хранится вместе с самой записью и различен для каждой записи. Он состоит из 16 байт, половина из которых используются непосредственно для расшифровки, а вторая половина для проверки валидности. 5. И уже этим расшифрованным ключом записи можно расшифровывать непосредственно саму запись (пароли и др. сенситивную информацию). Очень неплохо и стильно придумано! Основные достоинства данного алгоритма: Мастер ключ един для всех записей. Поэтому достаточно расшифровывать его лишь один раз (шаги 1-3). Это ускоряет весь процесс расшифровки, не снижая уровень безопасности в целом. В шифровании мастер ключа принимает участие SID пользователя, поэтому мастер ключ для каждого пользователя будет разным. Таким образом, становится понятно, что без знания SID (который различен для каждого пользователя) расшифровать данные невозможно. Однако это немного омрачается тем, что SID хранится в реестре вместе с мастер ключом. Данный алгоритм, хотя и был создан более 10 лет назад, устойчив к столь популярному в наши дни виду атак с использованием rainbow tables. Предложенная схема шифрования, которая, кстати говоря, уже была задействована с выходом Internet Explorer 4, представляла собой большой прорыв в области шифрования данных. Все современные браузеры (Opera, Mozilla, Firefox и Internet Exlorer вплоть до 6 версии) используют похожие схемы шифрования своих паролей. Заметьте также, что свободный полет творческой фантазии самых сильных конкурентов Outlook в лучшем случае остановился в этом, среднем веке. Период научно технического прогресса - Outlook 2003 - впереди планеты всей. Новая версия популярного почтового клиента использует новый алгоритм шифрования, который является продолжением и логическим развитием предыдущего. Этот алгоритм основан на одной важной детали - привязки к паролю пользователя. Не будем в данной статье подробно описывать механизм его работы, ибо это займет не одну страницу. Скажем лишь, что это всем известный DPAPI. Для расшифровки паролей, зашифрованных при помощи DPAPI, необходимо знать как минимум три вещи: 1. Мастер ключ пользователя 2. SID пользователя 3. Пароль пользователя Вкратце основные достоинства нового алгоритма: Мастер ключ теперь хранится в отдельной папке локального компьютера, доступ к которой частично ограничен. Длина мастер ключа составляет 512 бит, что исключает возможность его подбора даже в ближайшем будущем. Используются новые алгоритмы, в частности ShaHmac, с изменяемым количеством итераций в цикле (по умолчанию 4000, в Windows Vista - в несколько раз больше). Таким образом, на порядки снижается возможность подбора пароля методом прямого перебора. Алгоритмы шифрования (как мастер ключа, так и самих данных) полностью настраиваемые. Можно задавать любые, поддерживаемые операционной системой. Можно производить защиту данных на уровне привилегий операционной системы. Привязка алгоритма к паролю пользователя. Сам процесс расшифровки паролей для текущего залогиненного пользователя абсолютно прозрачен. Пароль запрашивается лишь единожды, при входе в систему, всю остальную работу система берет на себя. Если даже потенциальный хакер будет иметь физический доступ к зашифрованным данным, то расшифровка их без знания пароля пользователя будет невозможна. Заключение Как видим, с выходом каждой новой версии этой популярной почтовой программы Microsoft придумывает что-то новое и неизведанное доселе. Так что может иной раз и не стоит бросать камни в чужой огород? Как ни странно, но очередная версия Outlook 2007 не привнесла ничего кардинально нового в принципы шифрования персональных данных пользователя. Очевидно, все программисты были заняты разработкой и доводкой Windows Vista. В частности, например, созданием таких страшных вещей как BitLocker или CardSpace. Но об этом в другой раз... (с) 2006 Passcape Software