Рейтинг:3

Будет ли это считаться безопасным хэшем пароля?

флаг ng

Я думаю, что правильно понял, но я хочу убедиться, что это потребует денег.

  1. Пароль должен состоять не менее чем из 16 символов и должен содержать по одному из [Верхний, нижний, цифровой, другой].
  2. Моя соль - это Crypto RNG, сгенерированный 64 байта
  3. Я конвертирую соль в Base64 (без трейлинга ==)
  4. Затем я получаю объединенные байты UTF8 (SaltString + Password)
  5. Затем я SHA512 зацикливаю эти байты 100 тысяч раз.
частный статический байт [] SaltPassphrase (байт [] соль, строковый пароль)
{
    var sha512 = SHA512.Create();
    // Соль в виде строки Base64 (без == в конце), за которой следует пароль
    ввод строки = $"{Convert.ToBase64String(salt)[0..^2]}{пароль}";
    byte[] bytes = sha512.ComputeHash(Encoding.UTF8.GetBytes(input));
    для (целое я = 0; я < 100_000; я ++)
        байты = sha512.ComputeHash (байты);
    возвращаемые байты;
}

РЕДАКТИРОВАТЬ Спасибо всем за подробные разъяснения и полезные комментарии!

флаг jp
Вы слишком много внимания уделяете соли — все, что ей действительно нужно, — это быть уникальной, чтобы злоумышленник не мог проводить параллельные атаки на несколько учетных записей с одной и той же солью. Кроме того, это перебор.
флаг hm
Согласен, что соли больше, чем нужно, но соли нужны не только для сопротивления параллельным вычислениям, но и для сопротивления *предварительному* вычислению. Таким образом, они должны быть не только уникальными в рамках целевого хеш-листа/платформы, но и практически уникальными *глобально* — достаточно, чтобы сделать невозможным предварительное вычисление и последующее их сохранение. Например, bcrypt и scrypt используют 128-битную (16-байтовую) соль — все еще немного меньше, чем 64 байта, но достаточно, чтобы сделать создание списка всех значений практически невозможным.
marcelm avatar
флаг cn
**[Не создавайте собственную функцию хеширования паролей](https://security.stackexchange.com/a/31846/99775), точка.**
Persistence avatar
флаг br
@marcelm - Если бы все следовали этому совету, у нас не было бы функций хеширования паролей ... Может быть, сформулировать это с помощью «если вы не эксперт в криптографии»
marcelm avatar
флаг cn
@Persistence Нет, потому что люди склонны думать, что они являются экспертами в том, чем они не являются. Этот комментарий сделан в контексте бесчисленных вопросов SE о самодельной криптовалюте, и ответ всегда: _не_. Настоящих криптографов, занимающихся этим профессионально, в любом случае не остановит комментарий к crypto.SE.
Persistence avatar
флаг br
Вы правы... Эффект Даннинга Крюгера силен
Seth R avatar
флаг in
Эксперты @Persistence в области криптографии не ищут совета на Stack Exchange. Если вы читаете это, значит, вам не следует создавать хеш-функции.
Persistence avatar
флаг br
@SethR - Это не обязательно так ... Я опытный инженер-программист и инженер-электронщик до уровня аспиранта.Я до сих пор использую Stack Overflow и Electronics SE, потому что их используют и другие эксперты, и никто, даже эксперты, не могут знать всего.
Peter Morris avatar
флаг ng
Я не создавал функцию хеширования криптовалюты, я использовал уже существующие.
marcelm avatar
флаг cn
@PeterMorris Нет, вы создали свою собственную функцию хеширования паролей. Тот факт, что вы использовали SHA512 в качестве примитива в своей функции, не имеет значения. Довольно легко создать небезопасный алгоритм, используя безопасные строительные блоки. [AES-ECB] (https://crypto.stackexchange.com/a/20946/32547) может быть хорошо известным примером этого. Криптографию очень трудно сделать правильно, поэтому люди, которые знают, что делают, используют только хорошо проверенные алгоритмы, которые выдержали общественное внимание. Создание собственной криптовалюты подвергает вас гораздо большим рискам, чем использование известных алгоритмов.
Peter Morris avatar
флаг ng
@marcelm А, понятно, спасибо за информацию, я ценю это!
флаг in
«и должен содержать по одному [верхний, нижний, цифровой, другой]» -> обычно я позволяю своему менеджеру паролей генерировать случайный пароль для каждого веб-сайта, но для веб-сайтов, которые заставляют меня использовать определенные специальные символы, у меня есть один пароль, который в основном просто состоит из специальных символов. Обычно это сайты, которые не имеют значения.
marcelm avatar
флаг cn
@PeterMorris Нет проблем! Я также заметил интересный дефект в вашем алгоритме. Все это становится слишком много для комментариев, поэтому я написал ответ.
Wernfried Domscheit avatar
флаг za
Почему вы обрезаете `==` из своей соли?
Wernfried Domscheit avatar
флаг za
Помимо всей теории, приведенной в различных ответах: по крайней мере, некоторые люди думают, что разработать алгоритм хеширования легко. Но посмотрите, сколько, или лучше, как мало [алгоритмов хеширования паролей] (https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms) действительно доступны, это кажется сложной работой, и лишь немногие эксперты во всем мире способен их развивать.Кажется, гораздо проще разработать [язык программирования](https://en.wikipedia.org/wiki/List_of_programming_languages)
Рейтинг:32
флаг in

За исключением количества итераций (мы можем утверждать, что это тоже мало ¡ и некоторая потеря энтропии *), ответ - нет!

  • Здесь нет твердость памяти что в основном предотвращает массовые поиски ASIC/GPU
  • Нет нескольких потоков, которые в основном наносят ущерб массивным поискам ЦП.

Уже существуют алгоритмы хеширования паролей, отличные от криптографических хэшей, таких как серия SHAx. Некоторые важные Скрипт (2009), ПБКДФ2 (2000), Аргон2 (2015), и Перемешивание воздушных шаров (2016). Аргон2 стал победителем соревнование по хешированию паролей состоялось в 2015 году. Теперь Balloon Hashing может бороться с Argon2. Используйте Balloon Hashing или Argon2 для безопасного хеширования паролей.

Для каждого уже есть библиотеки, которые вам нужно только параметризовать, как для Аргон2 вместо того, чтобы писать подробности самостоятельно.

Хорошая библиотека Argon2

Вот параметры;

Использование: ./argon2 [-h] соль [-i|-d|-id] [-t итераций] [-m память] [-p параллелизм] [-l длина хеша] [-e|-r] [- v (10|13)]
        Пароль считывается со стандартного ввода
Параметры:
        соль Используемая соль, не менее 8 символов
        -i Использовать Argon2i (по умолчанию)
        -d Использовать Argon2d вместо Argon2i
        -id Использовать Argon2id вместо Argon2i
        -t N Устанавливает количество итераций равным N (по умолчанию = 3)
        -m N Устанавливает использование памяти 2^N КиБ (по умолчанию 12)
        -p N Устанавливает параллелизм для N потоков (по умолчанию 1)
        -l N Устанавливает длину вывода хеша в N байт (по умолчанию 32)
        -e Выводить только закодированный хеш
        -r Выводить только необработанные байты хеша
        -v (10|13) Версия Argon2 (по умолчанию самая последняя версия, в настоящее время 13)

        -h Распечатать использование аргона2

Я мог бы спросить, что такое $я,д,$ и $id$ в Аргоне2. Ответ от черновик-irtf-cfrg-argon2-03;

Если вы не знаете разницы между ними или считаете атаки по сторонним каналам реальными угрозами, выберите Argon2id.

  • Аргон2d работает быстрее и использует доступ к памяти, зависящий от данных. Зависимость от данных немедленно включает побочный канал. Это подходит для криптовалют и приложений без угроз атак по сторонним каналам.

  • Аргон2i использует независимый от данных доступ к памяти, и это предпочтительнее для хеширования паролей и создания ключей на основе паролей.

  • Argon2id В первой половине первой итерации работает как Argon2i, а остальная часть работает как Argon2d. Это обеспечивает как защиту побочного канала, так и компромисс между временем и памятью.

Хеширование воздушных шаров

Теперь это в Специальная публикация NIST 800-63B и ему нужно некоторое время для адаптации. Есть некоторые библиотеки готовы к использованию.

Основные свойства:

  • Твердость памяти была доказана
  • Он разработан на основе стандартных примитивов: он может использовать любые жесткие криптографические хэш-функции без памяти, такие как SHA2, SHA3 и BLAKE2.
  • Он имеет встроенную защиту от атак по сторонним каналам, требующих, чтобы шаблон доступа к памяти не зависел от битов данных, подлежащих хэшированию.

Немного о паролях

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

Немного о менеджерах паролей

Кроме того, практически у каждого есть смартфон. Можно использовать менеджеры паролей для хранения паролей, которые являются почти случайными паролями, сгенерированными менеджерами паролей и сохраненными. Сообщите об этом и пользователям. Некоторые из них бесплатны, например ЛастПасс, 1Пароль, и KeePass.


Ответ на комментарий:

Я не могу использовать алгоритм, который использует много памяти (если я правильно понял жесткость памяти), потому что это сервер. Правилен ли подход, подходит ли SHA512 и подходят ли итерации с учетом длины пароля?

SHA-512 очень мало использует память для паролей, нужно хранить только 1024 бита для создания хэша пароля. Параметр памяти Argon2 по умолчанию: $2^{12}$КиБ = 4МБ. Если учесть, что система может запускать любое количество потоков, то мощность перебора алгоритма на основе SHA-512 уменьшается в 32768 раз. Таким образом, даже небольшое использование памяти увеличивает сложность хеширования пароля на $2^{15}$. 4МиБ вполне достаточно для серверов, и можно настроить память в соответствии с количеством доступов для входа в систему в секунду или лучше купить еще немного памяти. Помните, что алгоритмы хеширования паролей оставляли память системе. Узким местом, которое следует учитывать, является количество запросов на вход в секунду.


✓) Результат скорости OpenSSL, показывающий, что SHA-512 100K мал.

Выполнение sha512 в течение 3 с на блоках размером 64: 10896142 sha512 за 3,00 с
Выполнение sha512 за 3 с на блоках размера 256: 4673961 sha512 за 2,99 с

*) Сколько энтропии мы теряем энтропии за итерацию криптографической хэш-функции

Брезгливый Оссифрэйдж написал отличный ответ об этом.. В основе результата лежит

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

Peter Morris avatar
флаг ng
Я не могу использовать алгоритм, который использует много памяти (если я правильно понял жесткость памяти), потому что это сервер. Правилен ли подход, подходит ли SHA512 и подходят ли итерации с учетом длины пароля?
kelalaka avatar
флаг in
Функция хеширования паролей @PeterMorris имеет настраиваемые параметры. Вам нужно установить цель безопасности, а затем настроить параметры. Если вы не можете использовать большую память, вам необходимо увеличить количество итераций. Вы можете найти производительность на форумах hashcat, особенно для графических процессоров.
stefreak avatar
флаг jp
Алгоритмы хэширования паролей @PeterMorris используются на серверах почти в 100% случаев. Быстрый поиск в Google показывает, что Argon2 по умолчанию использует 1 МБ памяти. Это совершенно нормально и обычно не проблема. Пожалуйста, не сворачивайте собственное хеширование паролей, это сложно сделать правильно. Особенно, если ставки высоки.
Cort Ammon avatar
флаг gb
Чтобы представить комментарий stefreak в перспективе, при текущих рыночных ценах вы говорите о чем-то порядка четырех десятых цента памяти DDR4. Если это неприемлемо, то, я думаю, стоит долго и упорно думать о том, есть ли у вас инфраструктура, необходимая для системы, в которой задействованы деньги.
флаг il
@kelalaka есть ли причина, по которой вы предлагаете «argon2» вместо чего-то вроде https://en.wikipedia.org/wiki/Bcrypt?
kelalaka avatar
флаг in
@ N3buchadnezzar большую часть времени Bcrypt работает нормально, как указано в [Википедии] (https://en.wikipedia.org/wiki/Bcrypt#Comparison_to_other_password_hashing_algorithms). Тем не менее, Argon2 имеет коэффициент параллелизации, сопротивление боковому каналу и независимую параметризацию (см. параметр библиотеки и сравните с BCrypt), а Argon2 также не является A KDF Bcrypt.
Peter Morris avatar
флаг ng
@kelalaka Спасибо за подробный ответ. Я обновил свой вопрос относительно аргона2. Не могли бы вы дать мне знать, что вы думаете, пожалуйста? Спасибо!
kelalaka avatar
флаг in
@PeterMorris однажды ответил, не меняйте источник, особенно после всего этого. Вместо этого вы можете задать новый вопрос. Я откатил его.
kelalaka avatar
флаг in
@PeterMorris И ваше издание вполне может подойти и для [security.se]. Ищите ответы там же.
Peter Morris avatar
флаг ng
@kelalaka Хорошо, я подумал, что можно добавить. Какие параметры мне понадобятся для размера памяти + итераций? Я не хочу, чтобы мой сервер вышел из строя, но и не хочу, чтобы его слишком легко сломать.
kelalaka avatar
флаг in
Параметры @PeterMorris по умолчанию? Вы можете измерить время на своем сервере. В общем, мы требуем, чтобы все процессы завершались через 1 секунду, так как мы не хотим, чтобы у пользователей была задержка. Вы можете измерить свой сервер и спросить об этом на [security.se], см. [это] (https://security.stackexchange.com/questions/210982/what-are-the-minimum-parameters-for-argon2) или [ поиск](https://security.stackexchange.com/search?q=argon2+параметр)
polfosol avatar
флаг in
Придирка: Lastpass **НЕ** бесплатен. Притворяется таким
Рейтинг:10
флаг in

Помимо отличного ответа @kelalka, стоит указать на ключевые различия между вашей реализацией и более стандартными подходами к итеративному хешированию, такими как PBKDF2. Хотя PBKDF2 не требователен к памяти, как и некоторые более новые алгоритмы хеширования паролей, я считаю его (или bcrypt) достаточным для большинства целей. Возможно, оно больше всего похоже на предложенное вами решение, поэтому его будет легче понять. https://en.wikipedia.org/wiki/PBKDF2

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

Также вредными считаются требования к сложности пароля. Рассмотрим современную политику паролей: https://auth0.com/blog/dont-pass-on-the-new-nist-password-guidelines/

Maarten Bodewes avatar
флаг in
Что вы имеете в виду под сходимостью хэша? Цикл (кажется так)? И если да, то как включение константы (в рамках итерации, разумеется) спасает от этого?
флаг ar
@MaartenBodewes: я предполагаю, что Меир имеет в виду под конвергенцией тот факт, что, поскольку криптографические хеш-функции (ограниченные своим выходным диапазоном) не являются биекциями, повторение хэша будет постепенно уменьшать количество возможных выходов и, таким образом, увеличивать риск таких столкновение повторяющихся хэшей: если $H^{(m)}(a)=H^{(m)}(b)$ для некоторого $m$, то $H^{(n)}(a)=H^{ (n)}(b)$ для всех $nâ¥m$. Включение исходного ввода в хеш-функцию (т. е. замена $H$ чем-то вроде $H_a(x) =H(x\ ||\ a)$ предотвращает это: $H_a^{(m)}(a)=H_b^ {(m)}(b)$ _не_ подразумевает $H_a^{(n)}(a)=H_b^{(n)}(b)$ для $n>m$.
флаг ar
… Тем не менее, пока хэш-функция $H$ имеет приличную длину вывода, коллизии не являются серьезной проблемой даже для хэш-функций, повторяемых без таких настроек. Я думаю, что у меня где-то здесь есть старый ответ, где я занимаюсь математикой, но в основном, если размер _фактического_ входного пространства повторяемого хэша (включая как фактические пароли, так и все, что пробовали злоумышленники) значительно ниже границы дня рождения, коллизии в основном не имеют значения. Для современных хэшей с 256-битными или более длинными выводами это почти наверняка так.
Maarten Bodewes avatar
флаг in
Ах, хорошо, это имеет смысл, хотя я думаю, что ожидание 256-битной коллизии все еще довольно надуманное. Теперь я понимаю, почему соль или пароль обычно повторяются при вводе. .... ну да, что вы говорите :P
Meir Maor avatar
флаг in
Если бы у нас был настоящий PRF, проблема действительно казалась бы незначительной. Но мы беспокоимся, что на самом деле у нас нет истинного PRF, а наивное итеративное хеширование может усилить незначительные недостатки нашего PRF. Я также не вижу причин оставлять тривиально исправимые мелкие проблемы.
ilkkachu avatar
флаг ws
Несколько связанный с этим вопрос заключается в том, что, поскольку их штуковина уже довольно близка к PBKDF2, они могли бы также _использовать PBKDF2_, чтобы хотя бы что-то узнать.
Meir Maor avatar
флаг in
Я определенно сказал, что это похоже на PBKDF2, и, очевидно, люди должны использовать стандартные вещи. PBKDF2 не является современным, но все же достаточен при правильной настройке ИМХО. Хотя лично это мой наименее любимый из разумных вариантов, я предпочитал bcrypt, и у него есть преимущества, заключающиеся в том, что он всегда безупречен, и теперь у нас есть семейства argon и scrypt. Так что, хотя я считаю PBKDF2 достаточным, это ИМХО худший разумный вариант.
kelalaka avatar
флаг in
@IlmariKaronen есть один [здесь] (https://crypto.stackexchange.com/q/15068/18298).
Рейтинг:9
флаг cn

Плохая идея — создавать собственный хэш пароля.

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

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

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

Используя самые известные современные криптографические алгоритмы, мы можем использовать этот коллективный опыт и, возможно, избежать повторения прошлых ошибок. Могут быть обнаружены новые ошибки, но с этим ничего не поделаешь. Однако тот, кто создает свои собственные криптографические функции, скорее всего, повторит некоторые из этих ошибок или создаст совершенно новые.

Я знаю, я знаю, это забавно создавать такие штуки самостоятельно. И приятно создавать что-то, что кажется безопасным. Stack Exchange завален вопросами о пользовательском шифровании и (особенно) хэшах паролей. Проблема в том, что легко построить то, что сам не сможешь сломать. Но это не значит, что другие не могут.Эта пословица древняя и встречается достаточно часто, поэтому теперь известна как закон Шнайера.

Что может пойти не так?

Таким образом, могут быть проблемы с самим ядром криптоалгоритма. Это то, что сломало MD5 и RC4.

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

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

В вашей хеш-функции?

Ваша собственная функция хеширования паролей также становится жертвой чего-то вроде этого здесь:

повторить 100_000:
    хэш = sha512 (хеш)

SHA-512 прекрасно работает (насколько нам известно). Использование его таким образом осуждается.

SHA-512 генерирует «неотличимый от случайного» 512-битный вывод для каждого ввода. Он может генерировать один и тот же результат для двух разных входов, это называется коллизией. Проблема в том, что N-битные хеш-функции на N-битных входных данных обычно не работают. биективный. Это означает, что при передаче вывода SHA-512 самому себе некоторые из возможных 512-битных значений будут конфликтовать с другими, создавая тот же результат. К необходимость, это также означает, что некоторые другие хеш-значения вообще не могут быть сгенерированы.

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

Пробуя все 16 возможных входных данных в течение нескольких раундов, мы получаем следующие цепочки:

в 1. 2. 3. 4. 5. 6. 7.
00 -> 08 -> 06 -> 08 -> 06 -> 08 -> 06 -> 08
06 -> 08/
07 -> 06 -> 08 -> 06 -> 08 -> 06 -> 08 -> 06
08 -> 06/   
03 -> 04 -> 05\
13 -> 15 -> 05 -> 09 -> 02 -> 10 -> 14 -> 14
04 -> 05 -> 09 -> 02 -> 10 -> 14 -> 14/
15 -> 05 -> 09 -> 02 -> 10 -> 14/
05 -> 09 -> 02 -> 10 -> 14 -> 14  
01 -> 11 -> 02 -> 10 -> 14/
09 -> 02 -> 10 -> 14 -> 14  
11 -> 02 -> 10 -> 14/
02 -> 10 -> 14 -> 14  
12 -> 10//
10 -> 14 -> 14   
14 -> 14/

Всего после 6 раундов 16 возможных выходов сократились до 3. Тот же эффект можно увидеть и для больших усечений. Я выполнил несколько симуляций для SHA-512, усеченного до первого 1 байта (2 ), 2 байта (2 ) и 3 байта (2 ²):

                байт: 1 2 3
          поле ввода: 256 65536 16777216
сошлись к значениям M: 13 330 2765
       после N раундов: 31 518 7114

Вы можете видеть, что эффект конвергенции присутствует во всех трех сценариях. Что касается неразрезанного SHA-512, мой компьютер недостаточно быстр, чтобы вычислить это, я не смог найти никакой информации о силе и определенности эффекта, и я недостаточно умен, чтобы построить доказательство (если доказательство даже возможно). Но есть вероятность, что вы увидите эффект и в полном SHA-512. Мой инстинкт подозревает, что это уменьшает хеш-пространство на его квадратный корень (уменьшая вдвое длину бита), но я могу сильно ошибаться [обновление: см. ссылки в комментариях: один, два, три]. 100 тысяч патронов, вероятно, тоже ограничивают урон.

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

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

Другие ответы уже дают некоторые рекомендации по использованию хэшей; Хорошо: pbkdf2, bcrypt. Лучше: аргон2, скрипт. Я слышал, что Balloon — вещь, но я ничего о ней не знаю, поэтому у меня нет о ней мнения.

kelalaka avatar
флаг in
к вашему сведению. Существует один расчет для общего случая [Энтропия при повторении криптографических хеш-функций] (https://crypto.stackexchange.com/q/15068/18298). Помню еще один, но найти не смог.
chux - Reinstate Monica avatar
флаг cn
Хороший ответ, который напрямую касается кода ОП.
kelalaka avatar
флаг in
Хорошо, [я нашел то, что искал] (https://crypto.stackexchange.com/a/51029/18298), и ответ должен вас удивить. Мы не ожидаем, что повторяющиеся криптографические хеш-функции теряют слишком много энтропии из-за [ожидаемых больших циклов] (https://crypto.stackexchange.com/a/68442/18298) работы Харриса.
marcelm avatar
флаг cn
@kelalaka Очень интересно, спасибо за ссылки! Но если я правильно понимаю [третью ссылку] (https://crypto.stackexchange.com/a/68442), там говорится, что ожидается, что относительно _few_ элементов будет в циклах. На самом деле, примерно - из них, так что итерация в конечном итоге уменьшит его эффективное пространство до квадратного корня из элементов, уменьшив эффективную битовую длину вдвое. Или я что-то неправильно истолковываю?
kelalaka avatar
флаг in
Момент, который вы можете упустить, заключается в том, что 1M слишком мал, чтобы увидеть этот эффект. Первая ссылка говорит о 256 итерациях, а третья ссылка говорит о том, когда итерация переходит к квадратному корню. Большинство элементов все еще на хвостах...
marcelm avatar
флаг cn
Справедливо. Этот тип математики всегда интересен, но трудно получить хорошее представление о задействованных масштабах. Я заметил ограниченный эффект из-за количества раундов в моем первоначальном ответе, но в любом случае вся эта часть была просто догадкой :)
Рейтинг:1
флаг cn

Он думает, что ответ: "Надежно" относительно. Одни только 512 бит соли (8 * 64 бита) дают примерно 6 * 10 ^ 57 возможностей. Преобразование соли (через BASE64) не меняет ее силы.

Тогда у вас есть 992 бита (62 * 16 бит), которые составляют пароль (26 * 2 буквы плюс 10 цифр), или примерно 4 * 10 ^ 28 возможностей. Предполагая равномерную вероятность (довольно маловероятную, если она выбрана человеком), у вас будет около 1504 входных битов для получения 512 выходных битов, до (возможны конфликты) 5 * 10 ^ 452 возможностей. Это огромный количество.

Цифры предполагают, что соль нельзя «вынести» из хэша, поэтому соль расширяет диапазон поиска.

Повторение хэша только замедлит построение таблицы, а не поиск результата (результирующая таблица будет иметь не более 2 ^ 512 записей).

kelalaka avatar
флаг in
Мы считаем, что соль общественная. Для злоумышленников грубой силы это только предотвращает радужные таблицы, и они будут искать только пароль, а не пароль и соль. Злоумышленник получит соль и хэш. Обычно они хранятся в виде строки. Поэтому важны только надежность пароля и механизмы хэширования паролей.
kelalaka avatar
флаг in
Соль убивает радужные столы. Это очевидно. Однако безопасность хеширования пароля не основана на секретности соли.

Ответить или комментировать

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