Самые комментируемые за месяц

23 апреля 2012, 11:26

Медленнодействие

Не всегда программы должны работать самым быстрым образом. Например, иногда специально используют медленные алгоритмы проверки пароля. Для того, кто знает пароль, задержка в пару секунд не страшна. А для врага, пытающегося подобрать пароль — серьёзное препятствие. Важно, что именно алгоритм должен быть медленный, а не лишь его реализация. Для быстрого алгоритма враг сам напишет быструю реализацию.

Подобное замедление появилось в Django 1.4.

Ещё один пример — проверка кода аутентичности сообщения. Алиса посылает Бобу сообщение (например, «Переведи 100 долларов на счёт 42») и специальный код (например «56789»), с помощью которого Боб убеждается, что сообщение пришло именно от Алисы и что сообщение по дороге не изменилось. Этот код зависит от ключа, который есть только у Алисы и Боба, поэтому враг не может просто так создать сообщение и код, которым Боб поверит. Обычно проверка происходит так: Боб берёт ключ и полученное сообщение, вычисляет код и сравнивает с присланным кодом.

Вот собственно сравнение кодов и может стать дырой в безопасности, если Боб сравнивает их побайтово и, находя различие, сразу сообщает об ошибке. Враг создаёт своё сообщение «Переведи все доллары на счёт 88», а потом начинает перебирать коды, меняя первую цифру и замеряя время проверки. Самая долгая проверка указывает на правильно угаданную первую цифру. И так далее.

В этом случае нужно искуственно уравнивать продолжительность проверки, следя, чтобы шибко умный компилятор не испортил всё своей оптимизацией.