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

алэтот уроки я столкнулся со следующим обсуждением о шифровании. В конце написано

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

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

Итак, где я не прав?

Спасибо!

$ rails console
>> require 'digest'
>> def secure_hash(string)
>>   Digest::SHA2.hexdigest(string)
>> end
=> nil
>> password = "secret"
=> "secret"
>> encrypted_password = secure_hash(password)
=> "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b"
>> submitted_password = "secret"
=> "secret"
>> encrypted_password == secure_hash(submitted_password)
=> true

Здесь мы определили функцию secure_hash, которая использует криптографическую хеш-функцию SHA2, часть семейства хеш-функций SHA, которую мы включаем в Ruby через библиотеку дайджестов. 7 Не важно точно знать, как работают эти хеш-функции; для наших целей важно, чтобы они были односторонними: в вычислительном отношении не существует способа обнаружить, что

2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b - это хэш SHA2 строки «секрет».

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

>> hash = "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b"
>> secure_hash("secede") == hash
=> false
>> secure_hash("second") == hash
=> false
>> secure_hash("secret") == hash
=> true

Таким образом, у нашего злоумышленника есть совпадение - плохие новости для любого пользователя с паролем «секрет». Этот метод известен как атака радуги.

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

>> Time.now.utc
=> Fri Jan 29 18:11:27 UTC 2010
>> password = "secret"
=> "secret"
>> salt = secure_hash("#{Time.now.utc}--#{password}")
=> "d1a3eb8c9aab32ec19cfda810d2ab351873b5dca4e16e7f57b3c1932113314c8"
>> encrypted_password = secure_hash("#{salt}--#{password}")
=> "69a98a49b7fd103058639be84fb88c19c998c8ad3639cfc5deb458018561c847"

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

Ответы на вопрос(4)

Ваш ответ на вопрос