LINUX.ORG.RU

Не стоит использовать слишком длинные пароли, т.к. коллизии?

 ,


0

3

Например, F(x) = x mod 10. Т.е. использование числового пароля >10 нецелесообразно. Или я что-то не учел?



Последнее исправление: letni (всего исправлений: 1)

Хеш-функции обычно лучше, чем mod 10. Так что можешь использовать длинные пароли, их сложнее подобрать.

sholom
()

Например, F(x) = x mod 10. Т.е. использование числового пароля >10 нецелесообразно.

то вероятность коллизии будет >50% после ~ sqr(10) = 3 паролей. Если выход хеша 256 бит, то вероятность коллизии будет >50%, после 2^128 разных паролей вне зависимости от их длины.

ivlad ★★★★★
()
>>> import math
>>> b = 26*2+10 # 26 букв в 2 регистрах + 10 цифр, если со спецсимволами, то больше
>>> a = 2**128 # для 128-битной хеш-функции
>>> math.log(a, b)
21.497443706501368
>>> a = 2**160 # для 160-битной
>>> math.log(a, b)
26.87180463312671
>>> a = 2**256 # для 256-битной
>>> math.log(a, b)
42.994887413002736
Klymedy ★★★★★
()
Ответ на: комментарий от ivlad

Получается, 2^256 = 100%. Ну да, логично.

Но выход этой хэш-функции = 4 бита(1001(2) = 9(10)). Т.е. 2^2 разных пароля дает вероятность коллизии >50 процентов, т.е. 4 пароля, а не 3. Что я не так сделал?

letni
() автор топика

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

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

Esteban_Garcia
()
Ответ на: комментарий от anonymous

Почему не нужно?

Кэш-функиция, которую я привел выше, дает коллизии после 10. т.е. вывод-то одинакового кэша будет независимо от того, password == 1 or 11; 2 or 12...

Например, пароль 1 дает кэш 1, 11 - тоже 1. То есть нет различия между паролем 100002 и 12, т.к. кэш всегда будет 2.

letni
() автор топика
Ответ на: комментарий от letni

Например, пароль 1 дает кэш 1, 11 - тоже 1. То есть нет различия между паролем 100002 и 12, т.к. кэш всегда будет 2.

А теперь переведи это на человеческие цифры. При длине хэша в 256 бит и длине входных данных в 256 бит имеем пароль примерно 32 символа, где символы — латиница в верхнем и нижнем регистрах, цифры и спецсимволы (если довериться тому, как считает битность keepassx). Вот в случае с mod в качестве хэш-функции можешь считать, что использование более длинных паролей нецелесообразно. Но использовать более короткие пароли ты не можешь, потому что уже не сможешь считать хэш 256 битным. Так как результат mod предсказуем.

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

Если честно, я не особо понял о чем ты. «Длина хэша 256 бит» - что это значит? Ведь максимальная в моей хэш-функции длина - 4 бита(т.к. число 9 в двоичной системе весит 4 бита). Или остальные 252 бита - нули? Но зачем они?

letni
() автор топика
Ответ на: комментарий от Esteban_Garcia

Да дело не в этом. Я хочу понять, существует ли коллизия после перебора определенного количества символов(в моем случае 10)? А эта хэш-функция - лишь пример, чтобы было понятно.

letni
() автор топика
Ответ на: комментарий от letni

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

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

Ясно, спасибо. Что-то начал понимать. Да, довольно сложно в этой теме(криптография) без знания теор.вер.

letni
() автор топика

Есть еще неустойчивые к коллизиям алгоритмы?

Reedych ★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.