Вы правы в том, что вы можете подобрать хэш md5, чтобы получить исходный пароль, при условии, что исходный пароль и метод грубой силы пытаются хешировать одно и то же значение. Чтобы компенсировать это, системы паролей часто используют так называемую «соль», чтобы значительно усложнить задачу. (См. также: Что такое SALT и как его использовать? а>)
Ответ на ваш вопрос, в общем, нет, нет простого способа получить хэш некоторого значения, не имея сначала это значение.
Первоначально алгоритмы хеширования были разработаны для получения некоторых входных данных и манипулирования ими, чтобы выходные данные алгоритма можно было использовать в качестве индекса в таблице значений. Цель состоит в том, чтобы иметь хэш 1:1 (в идеале это очень быстро, надеюсь, за постоянное время). Это означает, что при заданном входном значении x
y = hash(x)
должно быть таким, чтобы ТОЛЬКО x
хешировалось до y
. Другими словами, y1 = hash(x1) = hash(x)
тогда и только тогда, когда x1 = x
.
Со временем были разработаны алгоритмы, обладающие другими свойствами. Поскольку стало обычным делом использовать алгоритмы хеширования для таких вещей, как хранение паролей и быстрое сравнение, одна из вещей, которая ценилась в алгоритме хеширования, заключалась в том, что небольшие изменения на входе должны приводить к различиям на выходе. Другими словами, хэш-функция hash(x)
должна измениться, если x
изменится полностью (как в случае not(x)
) или если она изменится на один бит.
Одним из следствий этого является то, что если hash(x)
изменяется значительно при изменении одного бита (как в случае hash(x+0x000001)
), то это делает функцию сравнения намного быстрее (поскольку вы действительно только необходимо проверить биты более высокого порядка, чтобы определить, являются ли два объекта одинаковыми в среднем случае. Это означает, что вы не можете легко вычислить хэш последовательных элементов, просто перебирая хэши (т. функция hash(x)
без предварительного наличия x
).
person
jwir3
schedule
01.06.2017