Детерминированная хеш-функция может быть легко дешифрована? [дубликат]

7
задан Community 23 May 2017 в 11:47
поделиться

11 ответов

Я понимаю вашу точку зрения на том факте, что вы пытаетесь скрыть номера социального страхования. Если кто-то знает, что вы используете SHA1HASH в SSN для создания уникального идентификатора, то можете просто сгенерировать быстрый список всех номеров SSN, SHA1HASH их, а затем сравнить, чтобы автоматически получить SSN человека в записи. Хуже того, они могут предварительно сгенерировать все это в таблице поиска хэшей и иметь ключ из 1 хеша для каждого SSN.Это называется хэш-таблицей поиска, а более сложные формы называются радужными таблицами.

Вот почему была изобретена вторая функция хеширования. Это называется засолкой. Посол в основном таков; вы создаете соль, а затем изменяете свои данные с помощью соли. Например, скажем, у вас есть SSN 123-45-6789. Вы можете посолить его строкой «ЛУННЫЙ ЛУЧ». Ваша новая строка для хеширования - «123-45-6789MOONBEAM»

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

Наконец, если вы используете только 1 соль для всего и держите ее в секрете, вместо того, чтобы видеть соль и генерировать соответствующий SSN, выполнив приращение SSN + соль 100 миллионов раз и выбрав совпадение, они должны сделать гораздо больше для получения SSN. Это потому, что 100 миллионов номеров SSN имеют относительно низкую энтропию. (10 ^ 9 комбинаций). Добавляя свою соль и сохраняя ее в секрете, вместо того, чтобы просто запускать

SHA1HASH(111-11-1111) -> check hash match
SHA1HASH(111-11-1112) -> check hash match
SHA1HASH(111-11-1113) -> check hash match

Им пришлось бы запускать

SHA1HASH(111-11-1111a) -> check hash match
SHA1HASH(111-11-1111b) -> check hash match
SHA1HASH(111-11-1111c) -> check hash match
...
SHA1HASH(111-11-1111azdfg) -> check hash match
SHA1HASH(111-11-1111azdfh) -> check hash match
....
SHA1HASH(111-11-1111zzzzzzzzzzzzzzzz) -> check hash match
SHA1HASH(111-11-1112a) -> check hash match
SHA1HASH(111-11-1112b) -> check hash match

... и так далее, пока они, наконец, не дойдут до

SHA1HASH(123-45-6789MOONBEAM) -> check hash match

, и в этот момент им наконец удалось взломать SSN + SALT

Они даже не знают, сколько символов в вашей соли Таким образом, им в 10 ^ (количество символов вашей соли) раз больше работы, чтобы получить только 1 SSN, не говоря уже о том, чтобы получить всю таблицу.

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

9
ответ дан 6 December 2019 в 04:44
поделиться

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

Очень распространенным вариантом использования криптографических хэшей является проверка пароля. Представьте, что у меня есть пароль «mypass123» и хэш «aef8976ea17371bbcd». Затем программа или веб-сайт, желающие проверить мой пароль, могут хранить в своей базе данных хэш «aef8976ea17371bbcd» вместо пароля, и каждый раз, когда я хочу войти в систему, сайт или программа повторно хешируют мой пароль и проверяют, что хеши соответствие. Это позволяет сайту или программе избежать сохранения моего фактического пароля и, таким образом, защищает мой пароль (в случае, если это пароль, который я использую в другом месте) в случае кражи данных или иного взлома - хакер не сможет вернуться назад. от хеша до пароля.

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

Однако следует помнить об очень важном различии между хешированием и шифрованием: хеширование теряет информацию . Вот почему вы не можете вернуться назад (расшифровать) хеш. Вы можете хешировать файл размером 20 ГиБ и получить хэш из 40 символов. Очевидно, что при этом было потеряно много информации. Как можно «расшифровать» 40 символов в 20 ГиБ? Нет такой вещи, как сжатие, которое работало бы так хорошо! Но это также является преимуществом, потому что для проверки целостности файла размером 20 ГиБ вам нужно всего лишь распределить хеш-код из 40 символов.

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

18
ответ дан 6 December 2019 в 04:44
поделиться

Общий ответ

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

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

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

Для криптографических хэшей, таких как SHA1, очень сложно даже найти один вход, который производит этот вывод.

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

Относительно использования хеширования для шифрования SSN

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

23
ответ дан 6 December 2019 в 04:44
поделиться

Шифрование и хеширование - это разные вещи.

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

5
ответ дан 6 December 2019 в 04:44
поделиться

Нет, вы не можете вернуться. Посчитайте, сколько разных хэшей у вас может быть. Теперь посчитайте, сколько разных струн у вас может быть. Первое конечно, второе бесконечно. Существует множество (точнее, бесконечно много) строк с одинаковой суммой SHA1. Дело, однако, в том, что очень сложно найти два текста с одинаковым хешем.

Вы можете думать о хешировании как о сокращении чего-либо. Например, возьмем хеш-функцию, которая суммирует все коды ASCII букв в строке. Вы не можете сказать, что было до хеширования, просто зная сумму кодов ASCII букв. Это похоже на SHA1, но посложнее.

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

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

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

2
ответ дан 6 December 2019 в 04:44
поделиться

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

2
ответ дан 6 December 2019 в 04:44
поделиться

Нет. Суть хэша в том, что это одностороннее шифрование (как отмечали другие, на самом деле это не «шифрование», но оставайтесь здесь со мной). Обратной стороной является теоретически небольшая вероятность «коллизий», когда две или более строк возвращают один и тот же хеш. Но обычно это стоит того.

3
ответ дан 6 December 2019 в 04:44
поделиться

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

1
ответ дан 6 December 2019 в 04:44
поделиться

То, что он шифрует один и тот же текст каждый раз одинаково, - это весь смысл хэша. Это особенность.

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

1
ответ дан 6 December 2019 в 04:44
поделиться

Нет, вы не можете вернуться назад, потому что функция хэширования сохраняет недостаточно информации.

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

alt text

Если бы исходное сообщение было зашифровано, тогда да, вы могли бы вернуться назад.

7
ответ дан 6 December 2019 в 04:44
поделиться

Нет. По крайней мере, не легко.

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

2
ответ дан 6 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: