Создание хеша пароля в linux

Обновлено: 03.07.2024

Раньше большинство паролей хранилось в открытом виде, но очень быстро разработчики поняли, что так делать небезопасно. Лучше хранить не сам пароль, а его хэш, набор цифр определенного размера, который генерируется на основе пароля. В таком случае, даже если злоумышленник получит хэш, то он не сможет узнать пароль. Существуют различные способы хэширования, например, md5, sha1, sha2 и многие другие. Но существует способ восстановления пароля из хэша. Для этого можно использовать перебор, нам достаточно создавать хэш для каждого возможного пароля и сравнивать его с тем хэшем, который нужно расшифровать.

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

Какие хэши можно перебрать?

Как я уже говорил, существует несколько алгоритмов хэширования, но сложность перебора каждого из них отличается. Каждый из алгоритмов может иметь коллизии. Это когда для одного хэша можно подобрать несколько различных исходных наборов данных. Самым небезопасным из популярных алгоритмов на данный момент считается md5. Было доказано, что в этом алгоритме можно найти множество коллизий, а это значит, что перебрать значение такого хэша будет намного проще. Алгоритм sha1 тоже имеет коллизии, но их намного сложнее найти, а значит перебор будет ненамного проще. Существования коллизий для Sha2 пока не доказано, но не исключено.

Программа hashcat поддерживает работу с такими алгоритмами хэширования: md5, md5crypt, sha1, sha2, sha256, md4, mysql, sha512, wpa, wpa2, grub2, android, sha256crypt, drupal7, scrypt, django и другими.

Установка hashcat

Если вы используете Windows, то вам достаточно загрузить установщик из официального сайта.

Вам нужно выбрать hashcat binaries нужной версии внизу страницы. В архиве находятся исполняемые файлы для Windows, Linux и MacOS, так что у вас не возникнет проблем. В Linux вы также можете установить утилиту из официальных репозиториев. Например, в Ubuntu команда будет выглядеть вот так:

sudo apt install hashcat


Но это еще не все. Если в вашей системе есть видеокарта, то программа будет использовать ее. И на нее должен быть установлен драйвер, желательно проприетарный. Я не буду на этом останавливаться. Но если видеокарта слабая, то можно использовать процессор. Для этого нужно установить несколько пакетов для работы OpenCL на процессоре. Вот так выглядят команды установки в Ubuntu:

sudo apt install libhwloc-dev ocl-icd-dev ocl-icd-opencl-dev
$ sudo apt install pocl-opencl-icd

Теперь мы можем выполнить тестирование производительности:

Утилита hashcat

Сначала давайте рассмотрим синтаксис и возможные опции утилиты, а потом уже перейдем к ее использованию. Это консольная утилита, поэтому придется использовать ее через терминал. Давайте сначала рассмотрим синтаксис:

$ hashcat опции файл_хэшей словари_и_настройки

Как видите, все довольно просто. Начнем с основных опций, которые настраивают как будет вести себя утилита:

  • -h - вывести доступные команды и опции;
  • -V - версия программы;
  • -m - тип хэша, который нужно перебрать, например, md5 или sha;
  • -a - вид атаки;
  • -b - запустить тестирование производительности;
  • --hex-salt - указать соль, которая использовалась при хэшировании;
  • --hex-charset - набор символов, для исходных данных;
  • --status - автоматически обновлять состояние подбора;
  • -o - файл для записи результата;
  • -p - символ, которым разделены хэши для перебора;
  • -c - размер кэша для словаря;
  • -n - количество потоков;
  • -l - ограничить количество слов для перебора;
  • -r - файл с правилами генерации вариантов;
  • -D - устройство для перебора, CPU или GPU;
  • --pw-min - минимальная длина варианта, символов;
  • --pw-max - максимальная длина варианта, символов;
  • --table-min - длина пароля для табличной атаки;
  • --table-max - максимальная длина пароля для табличной атаки;
  • --table-file - файл таблицы, для атаки по таблице.

Мы рассмотрели все основные опции, которые сегодня будем использовать. Многие из параметров, например, тип хэша и атаки, задаются в виде цифр. Я не буду рассматривать цифровые коды для типа хэша подробно. Вы можете найти эту информацию, выполнив man hashcat. Рассмотрим типы атак:

  • Straight - обычная атака, берет слова из словаря и проверяет их;
  • Combination - комбинирует слова из словаря в разные комбинации;
  • Toggle-Case - по очереди пробует разный регистр букв для каждого символа слова;
  • Brute-force - атака простым перебором на основе маски или символов;
  • Permutation - при этом типе атаки программа берет слова из словаря и меняет в них буквы местами для получения разных комбинаций;
  • Table-Lookup - Табличная атака, берется одно слово и словаря, а затем на его основе создаются варианты из таблицы. Каждый символ из таблицы будет заменен на набор прописанных вариантов;
  • Prince - новый вид атаки перебора, которая работает быстрее, обычной.

Кроме того, при переборе на основе брутфорса нам понадобится выбрать набор символов, которые будет использовать программа для генерации возможных вариантов. Вот возможные значения:

Теперь мы разобрали все необходимое и можно переходить к практике.

Как пользоваться Hashcat?

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

1. Перебор по словарю в Hashcat

Расшифровка md5 проще всего выполняется по словарю. Поскольку полный перебор занимает очень много времени, то перебрать наиболее часто употребляемые варианты может быть намного быстрее. Для перебора нам понадобится словарь, обычно используется rockyou. Словарь можно скачать командой:

Теперь нам еще осталось подготовить хэши, которые будем перебирать. Проще всего это сделать с помощью команды Linux md5sum:

echo -n "password" | md5sum

Например, создадим три хэша. Затем сложим их в файл

2ac9cb7dc02b3c0083eb70898e549b63
5f4dcc3b5aa765d61d8327deb882cf99
b59c67bf196a4758191e42f76670ceba

Теперь, когда все собрано, мы готовы к перебору. Команда перебора по словарю будет выглядеть вот так:

hashcat -m 0 -D 1 -a 0 -t 20

/rockyou.txt -o data.txt


Здесь -m 0 указывает на то, что нужно перебирать хэш md5, а -a 0 указывает на использование обычной атаки по словарю. С помощью опции -n мы задаем количество потоков. Опция -D 1 говорит программе, что нужно использовать процессор. Если вам нужна видеокарта hashcat, используйте -D 0.

Затем, мы указываем файл с хэшами, которые будем перебирать - hashes и словарь. Перебор может занять долгое время, но когда комбинация будет найдена, программа запишет ее в файл data.txt.

Что касается других алгоритмов, то для них нужно будет указать только другой номер типа хєша. Например, для SHA это будет 100. Чтобы узнать нужный номер вы можете использовать такую команду:

hashcat --help | grep SHA1


2. Расшифровка md5 полным перебором

Анализ по словарю выполняется достаточно быстро. На моем железе, такой небольшой словарь анализировался меньше минуты. Программа выдала скорость около 1300 kHash в секунду, а это очень много. Но в словаре есть далеко не все комбинации. Поэтому вы можете попытаться выполнить полный перебор нужной последовательности символов. Например:

hashcat -m 300 -a 3 -n 32 --custom-charset=?l?d

Здесь мы просто указали набор символов, буквы в нижнем регистре и цифры, а затем запустили перебор. Также можно указать ограничения на минимальное и максимальное количество символов:

hashcat -m 0 -a 3 --force -D 1 --potfile-disable --increment-min 5 --increment --increment-max 6 --custom-charset1=?l?d


Здесь мы говорим программе, что нужно начинать с размера слова 5 символов и завершить размером 6. Также можно использовать маски. Маска позволяет точно указать какой набор символов использовать, в какой последовательности и сколько. Указывать маску нужно на месте словаря. Например, маска слова из четырех цифр будет ?d?d?d?d, а маска из четырех любых цифр, букв разного регистра и специальных символов будет выглядеть ?a?a?a?a. Также можно комбинировать маску с известной частью: abc?a?a. Рассмотрим пример команды:

hashcat -m 0 -a 3 --force -D 1 --potfile-disable


Маска уменьшает в разы количество вариантов, тем самым увеличивая скорость. Таким образом, расшифровка хеша md5 длиной 4 символа была выполнена меньше чем за секунду. С помощью следующей команды вы можете проверить не перебирали ли вы раньше эти хэши:

hashcat -m 0 --show

Выводы

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

Linux хранить зашифрованные пароли пользователей, также как и другую информацию связанную с безопасностью, например сроки действия аккаунтов или паролей, в файле /etc/shadow .

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

В отличие от файла /etc/passwd , который могут читать все, файл /etc/shadow должен быть доступен для чтения ИСКЛЮЧИТЕЛЬНО пользователю ROOT.

Для этого вам придется сгенерировать хэш пароля в формате, который будет совмести с /etc/shadow .

Нет необходимости устанавливать дополнительные утилиты, так как это может быть легко сделано из командной строки в Linux с помощью Python.

Создать Хэш Пароля для /etc/shadow

Зашифрованные пароли в /etc/shadow хранятся в следующем формате:

$ID обозначает тип шифрования, $SALT — это случайная (до 16 символов) строка и $ENCRYPTED — хэш пароля.

Тип ХэшаIDДлина Хэша
MD5$122 символов
SHA-256$543 символов
SHA-512$686 символов

Используйте следующие команды из терминала в Linux для создания хэшированых паролей со случайной солью для /etc/shadow .

Создать MD5 Хэш пароля:

Создать SHA-256 Хэш пароля:

Создать SHA-512 Хэш пароля:

Надеюсь эти команды будут вам полезны.

Только не забудьте поменять MySecretPassword на ваш YourSecretPassword.

Как вы видите, это действительно очень легко генерировать хэши для /etc/shadow из командной строки в Linux с помощью Python.

В частности потому, что Python, по умолчанию, установлен в большинстве Linux дистрибутивах.

Узнать тип хэша

Существуют два основных параметра, которые могут помочь распознать тип используемой хэш-функции:

  • Длина ХЭШа (каждая хэш-функция имеет определенную выходную длину);
  • Используемый алфавит (есть ли английские буквы? числа 0-9 и A-F … возможно это hex? используются ли специальные символы?).

Step 1: Скачиваем последнюю версию (v1.1 на текущий момент)

Step 2: Запускаем скрипт и копируем интересующие нас ХЭШи

Данная глава содержит дополнительную информацию о паролях локальных пользователей.

В главе подробно описаны три метода установки паролей; с использованием утилиты passwd , с использованием реализации алгоритма шифрования passwd из библиотеки openssl , а также с использованием функции crypt в программе на языке C.

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

Утилита passwd

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

Файл shadow

Пароли пользователей хранятся в зашифрованном виде в файле /etc/shadow . Файл /etc/shadow доступен только для чтения и может читаться исключительно пользователем root. В разделе, посвященном правам доступа к файлам, мы поговорим о том, как пользователям удается изменять свои пароли. На текущий момент вам нужно знать лишь о том, что пользователи могут изменять свои пароли с помощью утилиты /usr/bin/passwd .

Файл /etc/shadow содержит таблицу с девятью разделенными двоеточиями столбцами. Эти девять столбцов (слева направо) содержат имя пользователя, зашифрованный пароль, время последнего изменения пароля (первый день соответствует 1 января 1970 года), количество дней, в течение которых пароль должен оставаться неизменным, день истечения срока действия пароля, количество дней перед истечением срока действия пароля, в течение которых должно выводиться предупреждение, количество дней после истечения срока действия пароля, по прошествии которых учетная запись должна быть отключена, а также день, когда учетная запись была отключена (также с начала 1970 года). Последнее поле пока не имеет значения.

Все пароли в примере выше являются хэшами фразы hunter2 .

Шифрование ключевых фраз с помощью утилиты passwd

Пароли пользователей системы хранятся в зашифрованном формате. Их шифрование осуществляется средствами функции crypt . Простейший (и рекомендованный) способ добавления пользователя с заданным паролем в систему заключается в добавлении пользователя в систему с помощью команды useradd -m имя_пользователя с последующей установкой пароля с помощью утилиты passwd .

Шифрование ключевых фраз с помощью утилиты openssl

Другой способ создания учетных записей пользователей с паролями заключается в использовании параметра -p утилиты useradd, но в случае использования данного параметра утилите необходимо передавать уже зашифрованный пароль. Вы можете зашифровать пароль с помощью команды openssl passwd .

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

Помните о том, что после выполнения данной команды ваш пароль в открытом виде будет сохранен в файле истории команд командной оболочки!

Шифрование ключевых фраз с помощью функции crypt

Третий вариант заключается в создании вашей собственной программы на языке программирования C, которая будет использовать функцию crypt с ее последующей компиляции в бинарный файл. Эта простая программа может быть скомпилирована средствами компилятора gcc с помощью команды, аналогичной следующей: При использовании описанной программы MyCrypt нам придется передавать два параметра. Первым параметром является незашифрованный пароль, а вторым - значение salt. Значение salt используется для изменения алгоритма шифрования в соответствии с одним из 4096 различных вариантов. Данная вариация используется для предотвращения ситуаций, в которых два пользователя с одним и тем же паролем могут использовать одну и ту же запись в файле /etc/shadow .

Обратили ли вы внимание на то, что первые два символа зашифрованного пароля являются значением salt ?

Стандартный вывод функции crypt генерируется с использованием алгоритма DES, который давно устарел и может быть взломан за считанные минуты. Более предпочтительным алгоритмом для шифрования паролей является алгоритм md5 , который может быть распознан по начальным символам значения salt $1$. Длина значения salt для алгоритма md5 может достигать восьми символов. Значения salt хранятся в открытом виде в строках файла /etc/shadow между вторым и третьим символами $, поэтому никогда не используйте строку пароля в качестве значения salt!

Файл /etc/login.defs

Файл /etc/login.defs содержит некоторые стандартные значения параметров паролей пользователей, таких, как период устаревания паролей или ограничения длины паролей. (Там же вы можете обнаружить числовые ограничения идентификаторов пользователей и идентификаторов групп, а также указание на то, должна ли создаваться домашняя директория пользователя по умолчанию).

Утилита chage

Утилита chage может использоваться для установки даты истечения срока действия пользовательской учетной записи (-E), установки минимального (-m) и максимального (-M) срока действия пароля, даты истечения срока действия пароля, а также установки количества дней, в течение которых выводятся предупреждения об истечении срока действия пароля. Многие из этих функций реализованы также и в рамках утилиты passwd . Параметр -l утилиты chage позволяет ознакомиться с текущими значениями этих параметров для указанного пользователя.

Блокировка учетных записей

Пароли из файла /etc/shadow не могут начинаться с символа восклицательного знака. Если второе поле в строке из файла /etc/passwd начинается с символа восклицательного знака, пароль не может использоваться.

Использование данной особенности обычно называется блокировкой , деактивацией или отключением пользовательской учетной записи. Помимо текстового редактора vi (или vipw) вы можете использовать утилиту usermod для этой цели.

Первая команда из следующего примера предназначена для вывода хэшированного пароля пользователя laura из файла /etc/shadow . Следующая команда позволяет деактивировать пароль пользователя laura , после чего Laura не сможет пройти фазу аутентификации при условии использования данного пароля. Как видно в примере ниже, в результате перед хэшем пароля просто добавляется символ восклицательного знака. Пользователь root (а также пользователи с доступом к команде su посредством sudo ) все так же будут иметь возможность использовать команду su для работы с учетной записью пользователя laura (так как в этом случае пароль пользователя не требуется). Кроме того, следует учитывать тот факт, что Laura все еще сможет войти в систему в том случае, если она заранее настроила доступ по ssh без использования пароля! Вы можете снова разблокировать учетную запись с помощью команды usermod -U .

Следует подходить с осторожностью к работе и учитывать различия параметров интерфейса командной строки утилит passwd , usermod и useradd в различных дистрибутивах Linux. Проверяйте содержимое локальных файлов при использовании таких возможностей, как "деактивация, отключение или блокировка" учетных записей пользователей и их паролей.

Редактирование локальных файлов

В том случае, если вы все еще хотите отредактировать вручную файл /etc/passwd или /etc/shadow , располагая информацией о командах для управления паролями, используйте утилиту vipw вместо непосредственного использования текстового редактора vi(m). Утилита vipw осуществляет корректную блокировку данного файла.

Практическое задание: пароли пользователей

1. Установите пароль hunter2 для пользователя serena .

2. Также установите пароль для пользователя venus , после чего заблокируйте учетную запись пользователя venus с помощью утилиты usermod . Проверьте наличие признаков блокировки в файле /etc/shadow до и после осуществления блокировки.

3. Используйте команду passwd -d для деактивации пароля пользователя serena . Проверьте наличие строки для пользователя serena в файле /etc/shadow до и после осуществления деактивации.

4. Каковы различия между операцией блокировки пользовательской учетной записи и операцией деактивации пароля пользовательской учетной записи, которые мы только что осуществляли с помощью команд usermod -L и passwd -d ?

5. Попытайтесь изменить пароль serena на пароль serena as serena.

6. Сделайте так, чтобы пользователь serena был обязан изменять пароль через каждые 10 дней.

7. Сделайте так, чтобы каждый новый пользователь был обязан изменять свой пароль через каждые 10 дней.

8. Воспользуйтесь учетной записью пользователя root для создания резервной копии файла /etc/shadow . Используйте текстовый редактор vi для копирования хэша пароля hunter2 из строки пользователя venus в строку пользователя serena . Может ли после этого пользователь serena войти в систему с паролем hunter2 ?

9. В каких случаях следует использовать утилиту vipw вместо vi ? Какая проблема может возникнуть при использовании текстового редактора vi или vim для редактирования файла паролей?

10. Используйте команду chsh для вывода списка доступных командных оболочек (данная команда будет работать исключительно в дистрибутивах RHEL/CentOS/Fedora) и сравните вывод с выводом команды cat /etc/shells .

11. Какой параметр утилиты useradd позволяет установить имя домашней директории пользователя?

12. Как можно определить, заблокирован или разблокирован пароль пользователя serena ? Предложите решение на основе утилиты grep , а также решение на основе утилиты passwd .

Корректная процедура выполнения практического задания: пароли пользователей

1. Установите пароль hunter2 для пользователя serena .

2. Также установите пароль для пользователя venus , после чего заблокируйте учетную запись пользователя venus с помощью утилиты usermod . Проверьте наличие признаков блокировки в файле /etc/shadow до и после осуществления блокировки.

Обратите внимание на то, что в результате выполнения команды usermod -L перед хэшем пароля добавляется символ восклицательного знака.

3. Используйте команду passwd -d для деактивации пароля пользователя serena . Проверьте наличие строки для пользователя serena в файле /etc/shadow до и после осуществления деактивации.

4. Каковы различия между операцией блокировки пользовательской учетной записи и операцией деактивации пароля пользовательской учетной записи, которые мы только что осуществляли с помощью команд usermod -L и passwd -d ?

Блокировка предотвратит вход пользователя в систему с использованием установленного пароля благодаря добавлению символа ! перед хэшем пароля в файле /etc/shadow .

Деактивация с помощью утилиты passwd приведет к удалению хэша пароля из файла /etc/shadow .

5. Попытайтесь изменить пароль serena на пароль serena as serena.

Войдите в систему с именем пользователя serena , после чего выполните команду: passwd serena . Исполнение команды должно завершиться неудачей!

6. Сделайте так, чтобы пользователь serena был обязан изменять пароль через каждые 10 дней.

7. Сделайте так, чтобы каждый новый пользователь был обязан изменять свой пароль через каждые 10 дней.

8. Воспользуйтесь учетной записью пользователя root для создания резервной копии файла /etc/shadow . Используйте текстовый редактор vi для копирования хэша пароля hunter2 из строки пользователя venus в строку пользователя serena . Может ли после этого пользователь serena войти в систему с паролем hunter2 ?

9. В каких случаях следует использовать утилиту vipw вместо vi ? Какая проблема может возникнуть при использовании текстового редактора vi или vim для редактирования файла паролей?

Утилита vipw выведет предупреждение в том случае, если кто-либо еще в данный момент редактирует данный файл (с помощью утилиты vipw ).

10. Используйте команду chsh для вывода списка доступных командных оболочек (данная команда будет работать исключительно в дистрибутивах RHEL/CentOS/Fedora) и сравните вывод с выводом команды cat /etc/shells .

11. Какой параметр утилиты useradd позволяет установить имя домашней директории пользователя?

12. Как можно определить, заблокирован или разблокирован пароль пользователя serena ? Предложите решение на основе утилиты grep , а также решение на основе утилиты passwd .

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

Что такое хеширование?

Хеширование — это превращение каких-либо данных (малого или большого объема) в относительно короткий кусок информации как строка или число.

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

Использование хеш-функций для хранения паролей

Обычный процесс при регистрации пользователей:

  1. Пользователь заполняет форму, включая поле для ввода пароля;
  2. Скрипт сохраняет информацию в базе данных;
  3. Но пароль перед записью обрабатывается хеш-функцией;
  4. Изначальный пароль нигде не сохраняется.

Процесс входа под своей учетной записью:

  1. Пользователь вводит имя (или e-mail) и пароль;
  2. Скрипт обрабатывает пароль той же хеш-фунцией;
  3. Скрипт находит запись пользователя в базе данных и читает сохраненный хешированный пароль;
  4. Оба значения сравниваются, и если они совпадают, доступ дается.

Позже в этой статье мы рассмотрим лучшие методы хеширования. Обратите внимание, что нехешированные пароли нигде не хранятся. Если база данных была украдена, логинами пользователей не удастся воспользоваться, так? Ответ — возможно. Давайте рассмотрим некоторые потенциальные проблемы.

Проблема №1: коллизия хеша

Коллизия хеша случается когда две разные исходные строки дают одинаковый хеш. Вероятность этого зависит от той функции, которая используется. Например, некоторые старые скрипты используют функцию crc32() для генерации хеша. Она генерирует 32-битовое число как результат. Давайте хешируем пароль:

Теперь предположим что кто то похитил нашу базу данных и получил хеш пароля. Он не сможет превратить число 323322056 в supersecretpassword, но он может подобрать другой пароль который будет иметь тот же хеш с помощью простого скрипта:

Через некоторое время мы получим некоторую строку. Мы можем использовать эту строку вместо supersecretpassword и успешно войдем под именем пользователя с этим паролем. К примеру строка MTIxMjY5MTAwNg== выдала тот же хеш, что и слово supersecretpassword.

Как это предотвратить?

А еще лучше использовать функцию sha1(), которая генерирует 160-битный хеш.

Проблема №2: радужные таблицы

Радужная таблица составляется из часто используемых слов (и иногда их комбинаций) и их хешей. У этих таблиц могут быть миллионы рядов. Например, вы можете обрабатывать словарь и генерировать хеши для каждого слова. Вы можете комбинировать слова вместе и генерировать хеши для их комбинаций. Но и это еще не все: вы можете добавлять до (после и между) слов цифры и также записывать в таблицу. А так как хранение информации дешево, можно создавать гигантские радужные таблицы. А если база данных была украдена, то довольно легко подобрать пароли некоторых пользователей.

Как это предотвратить?

Существует метод защиты от этого путем добавления «соли» до или после пароля перед генерацией хеша. «Соль» — это случайный набор цифр, букв и знаков:

Проблема №3: скорость хеширования

Большинство хеш-функций имеют высокую скорость выполнения, потому что разрабатывались для подсчета контрольных сумм для больших файлов, в целях проверки целостности информации. Как уже упоминалось, персональные компьютеры могут генерировать миллиард хешей в секунду. Таким образом может использоваться обычная переборка символов для взлома пароля. И даже длина пароля в 8 символов не является надежной защитой:

Если пароль состоит из больших, маленьких латинских букв и цифр, это составляет 62 (26+26+10) возможных символов. Из строки длиной в 8 символов получается 628 возможных вариантов. Это составляет чуть более 218 триллионов. Со скоростью в 1 миллиард хешей в секунду, эти значения возможно перебрать за 60 часов.

Для пароля длиной в 6 символов понадобиться около 1 минуты. А требование паролей с длиной 9–10 символов может вызвать раздражение у ваших пользователей.

Как это предотвратить?

А представьте что вы используете хеш-функцию, которая занимает в 1000 раз больше времени для своего выполнения. Теперь потенциальный взломщик будет иметь скорость только в миллион хешей. А 60 часов превратятся в 7 лет:

Читайте также: