stringtranslate.com

Соль (криптография)

В криптографии соль это случайные данные, подаваемые в качестве дополнительных входных данных в одностороннюю функцию , которая хеширует данные , пароль или парольную фразу . [1] Соль помогает защититься от атак, использующих предварительно вычисленные таблицы (например, радужные таблицы ), значительно увеличивая размер таблицы, необходимой для успешной атаки. [2] [3] [4] Она также помогает защитить пароли, которые встречаются в базе данных несколько раз, поскольку для каждого экземпляра пароля используется новая соль. [5] Кроме того, соль не накладывает никакой нагрузки на пользователей.

Обычно для каждого пароля случайным образом генерируется уникальная соль. Соль и пароль (или его версия после растяжения ключа ) объединяются и передаются в криптографическую хэш-функцию , а выходное значение хэша затем сохраняется вместе с солью в базе данных. Соль не нужно шифровать, поскольку знание соли не поможет злоумышленнику. [5]

Соль широко используется в кибербезопасности: от учетных данных систем Unix до интернет-безопасности .

Соли связаны с криптографическими одноразовыми числами .

Пример

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

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

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

На практике соль обычно генерируется с помощью криптографически безопасного генератора псевдослучайных чисел . CSPRNG предназначены для создания непредсказуемых случайных чисел, которые могут быть буквенно-цифровыми. Хотя обычно это не рекомендуется из-за низкой безопасности, некоторые системы используют временные метки или простые счетчики в качестве источника соли. Иногда соль может быть сгенерирована путем объединения случайного значения с дополнительной информацией, такой как временная метка или пользовательские данные, чтобы обеспечить уникальность в разных системах или временных периодах.

Распространенные ошибки

Повторное использование соли

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

Генерация предварительно вычисленных таблиц для баз данных с уникальными солями для каждого пароля нецелесообразна из-за вычислительных затрат на это. Но если для всех записей используется общая соль, создание такой таблицы (которая учитывает соль) становится жизнеспособной и, возможно, успешной атакой. [6]

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

Длина соли

Если соль слишком короткая, злоумышленник может заранее вычислить таблицу всех возможных солей, добавленных к каждому вероятному паролю. Использование длинной соли гарантирует, что такая таблица будет непозволительно большой. [7] [8] 16 байт (128 бит) или более обычно достаточно для предоставления достаточно большого пространства возможных значений, что минимизирует риск коллизий (т. е. двух разных паролей с одинаковой солью).

Преимущества

Чтобы понять разницу между взломом одного пароля и набора паролей, рассмотрим файл с пользователями и их хешированными паролями. Допустим, файл не содержит соли. Тогда злоумышленник может выбрать строку, назвать ее attempt[0], а затем вычислить hash(attempt[0]). Пользователь, хеш которого хранится в файле , hash(attempt[0])может иметь или не иметь пароль attempt[0]. Однако даже если attempt[0]это не фактический пароль пользователя, он будет принят так, как если бы он был таковым, потому что система может проверять пароли, только вычисляя хеш введенного пароля и сравнивая его с хешем, сохраненным в файле. Таким образом, каждое совпадение взламывает пароль пользователя, и вероятность совпадения возрастает с количеством паролей в файле. Напротив, если используются соли, злоумышленнику придется вычислять hash(attempt[0] || salt[a]), сравнивать с записью A, затем hash(attempt[0] || salt[b]), сравнивать с записью B и т. д. Это предотвращает любую попытку взлома нескольких паролей, учитывая, что повторное использование соли исключается. [9]

Соли также борются с использованием предварительно вычисленных таблиц для взлома паролей. [10] Такая таблица может просто сопоставлять общие пароли с их хэшами или может делать что-то более сложное, например, хранить начальные и конечные точки набора предварительно вычисленных цепочек хешей . В любом случае, соление может защитить от использования предварительно вычисленных таблиц, удлиняя хеши и заставляя их извлекать из более крупных наборов символов, что снижает вероятность того, что таблица покроет полученные хеши. В частности, предварительно вычисленная таблица должна будет покрывать строку, [salt + hash]а не просто [hash].

Современная система теневых паролей , в которой хэши паролей и другие данные безопасности хранятся в непубличном файле, несколько смягчает эти опасения. Однако они остаются актуальными в многосерверных установках, которые используют централизованные системы управления паролями для передачи паролей или хэшей паролей в несколько систем. В таких установках учетная запись root в каждой отдельной системе может рассматриваться как менее доверенная, чем администраторы централизованной системы паролей, поэтому по-прежнему стоит гарантировать, что безопасность алгоритма хэширования паролей, включая генерацию уникальных значений соли, является адекватной. [ необходима цитата ]

Другое (меньшее) преимущество соли заключается в следующем: два пользователя могут выбрать одну и ту же строку в качестве своего пароля. Без соли этот пароль будет сохранен как одна и та же хэш-строка в файле паролей. Это раскроет тот факт, что у двух учетных записей один и тот же пароль, что позволит любому, кто знает пароль одной из учетных записей, получить доступ к другой учетной записи. При добавлении соли в пароли с помощью двух случайных символов, даже если две учетные записи используют один и тот же пароль, никто не сможет узнать это, просто прочитав хэши. Использование соли также чрезвычайно затрудняет определение того, использовал ли человек один и тот же пароль для нескольких систем. [11]

Реализации Unix

1970-е–1980-е годы

Более ранние версии Unix использовали файл паролей /etc/passwd для хранения хэшей соленых паролей (паролей с префиксом из двухсимвольных случайных солей). В этих старых версиях Unix соль также хранилась в файле passwd (в виде открытого текста) вместе с хешем соленого пароля. Файл паролей был доступен для чтения всем пользователям системы. Это было необходимо для того, чтобы привилегированные программные инструменты пользователя могли находить имена пользователей и другую информацию. Поэтому безопасность паролей защищена только односторонними функциями (шифрованием или хешированием), используемыми для этой цели. Ранние реализации Unix ограничивали пароли восемью символами и использовали 12-битную соль, что допускало 4096 возможных значений соли. [12] Это был подходящий баланс для вычислительных и складских затрат 1970-х годов. [13]

1980-е годы–настоящее время

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

Реализации веб-приложений

Обычно веб-приложения хранят в базе данных хэш-значение пароля пользователя. Без соли успешная атака с использованием SQL-инъекции может привести к получению легко взламываемых паролей. Поскольку многие пользователи повторно используют пароли для нескольких сайтов, использование соли является важным компонентом общей безопасности веб-приложений . [14] Некоторые дополнительные ссылки по использованию соли для защиты хэшей паролей в определенных языках или библиотеках (PHP, библиотеки .NET и т. д.) можно найти в разделе внешних ссылок ниже.

Смотрите также

Ссылки

  1. ^ Фентон, Джеймс Л.; Грасси, Пол А.; Гарсия, Майкл Э. (июнь 2017 г.). "Специальная публикация NIST 800-63-3" (PDF) . Технические серии публикаций NIST .
  2. ^ Андерсон, Росс (2020). Инженерия безопасности: руководство по созданию надежных распределенных систем (третье изд.). Индианаполис, Индиана. ISBN 978-1-119-64281-7. OCLC  1224516855.{{cite book}}: CS1 maint: отсутствует местоположение издателя ( ссылка )
  3. ^ Годвин, Энтони (10 сентября 2021 г.). «Пароли имеют значение». The Bug Charmer (блог) . Получено 09.12.2016 .
  4. ^ Бонех, Дэн; Шуп, Виктор (4 января 2020 г.). Выпускной курс по прикладной криптографии (PDF) . стр. 693–695.
  5. ^ ab Rosulek, Mike (3 января 2021 г.). «Глава 11: Хэш-функции» (PDF) . Радость криптографии . стр. 204–205.
  6. ^ «Безопасное хеширование паролей с солью — как это сделать правильно». crackstation.net . Получено 19.03.2021 .
  7. ^ Менезес, Альфред Дж.; Ооршот, Пол К. ван; Ванстоун, Скотт А. (1997). Справочник по прикладной криптографии . CRC Press. стр. 288. ISBN 0-8493-8523-7.
  8. ^ «Безопасное хеширование соленых паролей — как это сделать правильно».
  9. ^ "Хранилище паролей - Серия шпаргалок OWASP". cheatsheetseries.owasp.org . Получено 19.03.2021 .
  10. ^ «Как работают радужные таблицы». kestas.kuliukas.com .
  11. ^ Столлингс, Уильям; Лори Браун (2015). Компьютерная безопасность: принципы и практика (Третье изд.). Бостон. ISBN 978-0-13-377392-7. OCLC  874734678.{{cite book}}: CS1 maint: отсутствует местоположение издателя ( ссылка )
  12. ^ Моррис, Роберт; Томпсон, Кен (1978-04-03). "Безопасность паролей: История вопроса". Bell Laboratories . Архивировано из оригинала 2013-08-21.
  13. ^ Симсон Гарфинкель; Джин Спаффорд; Алан Шварц (2003). «Как Unix реализует пароли». Practical UNIX and Internet Security (3-е изд.). O'Reilly Media. ISBN 9780596003234.
  14. ^ "ISC Diary – Hashing Passwords". Dshield.org . Получено 2011-10-15 .

Внешние ссылки