суббота, 8 января 2011 г.

Пароли

При работе с большим числом ресурсов (в инете и не только) сталкиваемся с проблемой, что количество необходимых запоминаемых пар логин/пароль становится таковым, что запоминать их просто так становится невозможным.

Эта проблема существует уже давно и ещё до появления инета и в течение этого времени решал её разными способами.

Пароль должен или желабелен обладать такими свойствами, что:

  • Быть восстанавливаемым: при необходимости, должна быть возможность восстановления.
  • Быть секретным: чем меньше шансов, что его кто-то узнает, тем лучше.
  • Быть сложноподбираемым: не быть простым и легко опеределяемым.

Кроме того, хорошо, если пароль можно обновлять и легко делать это периодически; пароль один на один ресурс и пр..

Конечно, лучше всего, если пароль сложен, находится только в голове пользователя, при этом он его не забывает. Но на практике такое сделать чаще всего не получается из-за большого их количества.

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

Простой массовый логин/пасс

Первое из решений было следующим — для всех всторостепенных ресурсов (ресурсов, которые не жалко потерять) заводится один логин и пароль. Если мы заходим куда-то, где требуется регистрация для просмотра страницы, то пробуем регистрироваться именно под таким логин/пасс. Если создаем аккаунт, которого не жалко — то то же самое, но при этом при необходимости мы можем поменять пароль на что-то другое более сложное.

В таком варианте нужно помнить только один логин/пасс, и его забыть трудно, так как он используется постоянно. Ресурсы также запоминать не нужно — даже было за историю несколько случаев, когда напрочь забывал что был где-то, потом приходил и уже был готовый аккаунт со стандартным логином.

Проблем тут несколько. Во-первых, нужно сделать такой логин, который практически наверняка отсутствует на всех серверах, чтобы не натыкаться на уже пользователей с таким же именем. Во-вторых, обнаружилось, что существует ряд «типа умных» ресурсов, которые хотят от пользователя сложного пароля (дайте нам пароль с большими и малыми буквами, с цифрами и с закорючкой из вот этого списка ($%#…), и чтобы минимум 12 символов! — паубывау бы). Поэтому со временем перешел на чуть более сложный пароль.

Такой способ естественным образом неприемлим с точки зрения какой-либо секьюрности. Передача пароля происходит в открытом виде и перехватываема, чаще всего ресурсы организованы таким образом, что хранят у себя в БД пароли в открытом виде (а не в виде хэша функции). Есть даже ресурсы, которые собрают пароли подобного типа, чтобы потом передавать их в переборные системы, взламывающие пароли — поэтому если придумываем пароль и он нужен для секьюрности, то лучше его использовать только в одном месте.

Уровень секьюрности

Как-то у нас в Гомеле пришел в контору «Сервер», где хотел получить акаунт в инет. Там в договоре открытым текстом надо было написать пароль, но сотрудник мне его записать не дал с гордой фразой «Я придумаю его сам!» и видом «Развелось тут ламеров, пароли нормально придумать не могут!», и, посмотрев несколько секунд в потолок, записал в договор 4 цифры. Security Officer, мля…

По уровню безопасности разделяю три уровня:

Отсутствие секьюрности
Пароль должен быть. Максимум что он обязан — быть неподбираемым методом перебора на клавиатуре. Это пароль, который не может взломать обезьяна с гранатой.
Защита от взлома перебором
Это такой пароль, который нельзя взломать перебором в лоб на мощной машине без каких-либо дополнительных ухищрений. То есть, если программист натравит перебор вариантов, то пароль не должен подобраться.
Защита от сотрудников ЦРУ/ФСБ/…
Пароль создается генератором случайных чисел из реального мира, стойкость определяется исходя из конкретного ресурса.

Для первого уровня подойдет любой пароль, который просто так человек не придумает. Его легко запоминать (и забыть), минимум времени на всё.

Второй уровень более сложен. На нём чаще всего использую следующую схему. Придумывается такое слово-выражение, которое не существует в словарях и/или во всем интернете. Например «пеноимитатор». По желанию делается набор на латинской клавиатуре (в принципе, можно слово подобрать по слогам, а перевод на латиницу затрудняет перебор — переборной программе надо несколько раз чертыхнуться чтобы ускориться, — уметь перебирать по слогам неизвестные слова и в клавиатуре другой раскладки) или добавляются хитрые символы. Такие пароли использую для единичных ресурсов, обладающих какой-то средней ценностью (промышленные объекты, мастеры (что это ниже), банковские счета — это уже все следующий уровень).

Для более серьезных ресурсов уже идет третий уровень. Пароли создатся в реальном мире (грубо говоря, например подбрасыванием монетки), нужной сложностью (в зависимости от задачи) и ориентацией на будущее (мощности систем растут согласно Мурам).

Некоторые источники рекомендуют использовать в пароле латинские обязательно большие и обязательно маленькие буквы, плюс цифры. Что повышает стойкость пароля. Таким рекомендациям редко следую, если известно, что сервер позволяет без потери качества вбить пароль только на латинице одного регистра — с такими паролями проще работать, а для обеспечения той же стойкости они должны быть в 1.25 раза длиннее (на каждый 4-й символ нужно вбить ещё один сверх). Но для этой особенности бывают и исключения. Например сервер ICQ воспринимает пароли только в 8 символов. Их стойкость мала, но можно в данном случае сделать финт ушами. Пароль создается в HEX-редакторе и в него вбивается символ(ы) из ненабираемого на клавиатуре диапазона (например первые 20 из 256-ти). Далее мы делаем из View редактора Copy-Paste в ICQ-приложение и теперь для взлома вредителю нужно перебирать 256 вариантов каждого символа, при чем о том, что ему подложили свинью, нужно ещё догадаться.

Мастеры

Но со временем используемых защищенных ресурсов становится все больше, и ими уже сложно управлять, а пароли — контролировать. Для таких случаев применяю схему с мастерами.

В двух словах схема такова. Создается мастер-пароль, который должен быть очень серьезным. С помощью этого пароля можно получить доступ к некоторому ресурсу, хранящему пароли, или способу, с помощью которого можно получить хранимые пароли. В результате все пароли являются обычными, а с помощью мастера мы можем восстановить/получить любой из них.

Самым понятнообъясняемым является e-mail и пароль у нему. Если мы создаем сильный пароль на e-mail, в ящике храним письма (или на ящик мы их можем отправить), в которых имеются рядовые пароли, то пароль к e-mail является мастером. Соответственно, если мы забыли пароль к чему-либо, то мы можем с помощью мастера восстановить (заглянуть в ящик или запросить выслать пароль если это возможно). Но если мастера взломают, то злоумышленник получит доступ ко всем обычным паролям. Поэтому на общение с таким e-mail'ом нужно вести по всем правилам безопасности.

Мастеров может быть много (ящиков, так, чтобы все сразу не накрылось от взлома) и это не обязательно могут быть ящики — это может быть своя программа на машине, online-ресурс, куда можно печатать текст и др..

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

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