четверг, 14 октября 2010 г.

Кодирование - это не шифрование

Это перевод Encoding Is Not Encrypting. Автор: Реймонд Чен.

Информация об использовании меню Пуск кодируется (слово, которое я выбрал очень аккуратно, чтобы не ввести в заблуждение) в реестре. И кодирование (encoding), и шифрование (encrypting) предполагают изменение формы данных. Но шифрование предполагает, что восстановление исходных данных будет делом сложным: кодирование этого не предполагает. Шифрование также предполагает, что реализующий алгоритм будет устойчив к атакам на него: опять-таки, кодированию это не нужно.

Информация об использовании кодируется, чтобы она не всплывала бы при поиске по реестру типа "SomeAppName.exe". Такой поиск часто выполняется самописными утилитами, которые люди запускают для проверки удаления приложения. Они сканируют диск и реестр на предмет оставшихся следов приложения. Предполагается, что они удалят полностью частично удалённое приложение. Однако, программы удаления не должны удалять эту информацию. Не они (и не их программа) её создавала - не им её и удалять. Фактически, информация об использовании должна пережить программу и её удаление. Тогда, если пользователь удаляет, а затем снова устанавливает программу (например, при обновлении версии), то меню Пуск говорит: "Добро пожаловать назад! Вот твоё VIP-место в меню Пуск". (прим.пер.: см. также)

Кодирование также служит сигналом программистам: "тебе не следует это трогать". Если программист хочет работать с этой информацией, ему придётся применить (чрезвычайно простой, но всё же не тривиальный) алгоритм декодирования, прежде чем он получит доступ к самим данным. Это делает невозможным неадекватное использование и редактирование этой информации. Имеется ввиду, что когда вы начинаете писать алгоритм декодирования для данных в недокументированном ключе реестра - вы очевидно будете делать это намеренно, а не случайно. Идея в том, что в этот момент в вашей голове должен прозвенеть звонок: "Хм, а может мне не следует это трогать?"

Другими словами, кодирование служит как знак "Посторонним Вход Воспрещен". Он не огораживает вашу собственность от других людей, но делает очевидным, что их присутствие тут не поощряется и аннулирует аргумент "Но я же не знал!"

Кодирование информации не имеет ничего общего с безопасностью. Информация хранится в пользовательском улье, так что доступ уже ограничен до этого пользователя (и администраторов). В этом месте не хранится никакой критической информации (типа паролей). Кодирование - это просто лежачий полицейский, который даёт разработчикам, которые попробуют поиграться с этими значениями в реестр, ешё один шанс осознать, что эта информация не предназначена для них.

Конечно же, эти меры не остановят программистов, если они захотят написать функции кодирования и декодирования данных. В одном примере, который я нашёл, если пользователь переконфигурировал программу, то программа изменяла данные об использовании - и это не было частью удаления программы, это происходило во время работы. Другими словами, программисты этой программы намеренно манипулировали данными об использовании и изменяли позицию ярлыка своей программы в меню Пуск.

Выяснение алгоритма декодирования вряд ли является причиной для хвастовства - это не так трудно сделать. И, кроме того, алгоритм декодирования может быть не тем, который вы получили при reverse-engineering-е кода, потому что может существовать ключ реестра (в равной степени недокументированный) для изменения алгоритма кодирования. Программа, о которой я говорил в примере выше, не принимала во внимание этот момент. Если кодирование не было установлено в его значение по умолчанию, то утилита обнаруживала, что данные меню Пуск "испорчены". Слава богу, код не пытался "починить" это!

Ещё один фактор для кодирования: оно должно быть чрезвычайно быстрым, чтобы не замедлять поиск решения о том, что должно идти в ваше меню Пуск. Навряд ли вы бы захотели, чтобы 80% времени открытия меню Пуск проходило в криптографических функциях.

Алгоритм кодирования оставался неизменным с тех пор, когда он был впервые реализован в Windows 2000, так что эта информация переносилась, когда вы обновлялись до Windows XP и Windows Vista.

Однако разработчики меню Пуск Windows 7 временно изменили алгоритм кодирования. Это совпало с решениями по изменению формата информации об использовании и решении о не переносе старой информации об использовании с более ранних версий Windows. Изменение алгоритма кодирования сделало более очевидным отличие старых данных от новых данных. Это временное изменение вызвало шквал недоразумений среди наблюдающих за Windows, которые предположили, при виде нового кодирования, что разработчики меню Пуск "исправили" слабое "шифрование" на другое слабое "шифрование". Угу, только это никогда и не было шифрованием. Оригинальный алгоритм кодирования будет возвращён на место в финальном релизе. В конце концов, оригинальное кодирование - это то, что несет в себе неявный социальный контракт.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.