Возможно ли поменять ша1? - PullRequest
       42

Возможно ли поменять ша1?

37 голосов
/ 10 февраля 2010

Можно ли повернуть ша1?

Я думаю об использовании sha1 для создания простой облегченной системы для аутентификации небольшой встроенной системы, которая обменивается данными через незашифрованное соединение.

Допустим, я создаю sha1, подобный этому, с помощью ввода "секретного ключа" и добавляю в него метку времени, так что sha будет меняться все время.

sha1("My Secret Key"+"a timestamp")

Затем я включаю этот sha1 в коммуникацию и сервер, который может сделать тот же расчет. И, надеюсь, никто не сможет выяснить «секретный ключ».

Но так ли это на самом деле?

Если вы знаете, что это то, как я это сделал, вы бы знали, что я поставил там временную метку, и вы увидите sha1. Можете ли вы использовать эти два и выяснить «секретный ключ»?

secret_key = bruteforce_sha1(sha1, timestamp)

Спасибо Johan


Note1 : Я полагаю, вы могли бы каким-то образом использовать грубую силу, но сколько это будет на самом деле?

Примечание2 : Я не планирую шифровать какие-либо данные, я просто хотел бы знать, кто их отправил.

Ответы [ 9 ]

39 голосов
/ 10 февраля 2010

Нет, вы не можете изменить SHA-1, именно поэтому он называется Secure Hash Algorithm.

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

И вам, вероятно, сейчас следует использовать SHA-256 для новых систем.

sha("My Secret Key"+"a timestamp" + the whole message to be signed)

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

Если возможна атака грубой силой, зависит от длины вашего секретного ключа.

Безопасность всей вашей системы будет зависеть от этого общего секрета (потому что и отправитель, и получатель должны знать, но никто другой). Злоумышленник будет пытаться использовать ключ (либо угадывать грубой силой, либо пытаясь получить его с вашего устройства), а не пытаться взломать SHA-1.

24 голосов
/ 10 февраля 2010

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

Однако у SHA-1 есть недавно обнаруженные слабые стороны , которые позволяют быстрее находить входные данные, чем при переборе всех входных данных. Вам следует рассмотреть возможность использования чего-то более сильного, например SHA-256 для новых приложений.

Джон Каллас на SHA-1:

Пора идти, но не бежать, к выходу из огня. Вы не видите дыма, но пожарная сигнализация сработала.

15 голосов
/ 10 февраля 2010

Вопрос на самом деле как пройти аутентификацию в небезопасном сеансе.

Стандарт, почему это сделать, это использовать дайджест сообщения, например, HMAC .

Вы отправляете открытый текст сообщения, а также сопровождающий хэш того сообщения, в котором был замешан ваш секрет.

Так что вместо твоего:

sha1("My Secret Key"+"a timestamp")

У вас есть:

msg,hmac("My Secret Key",sha(msg+msg_sequence_id))

Идентификатор последовательности сообщений представляет собой простой счетчик, который отслеживает обе стороны количество сообщений, которыми они обменялись в этом «сеансе» - это не позволяет злоумышленнику просто воспроизвести ранее просмотренные сообщения.

Это отраслевой стандарт и безопасный способ аутентификации сообщений, независимо от того, зашифрованы они или нет.


(вот почему вы не можете перебрать хэш :))

Хэш - это односторонняя функция, означающая, что все входные данные выдают одинаковый выходной.

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

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

Так что, по сути, нет способа отменить хэш с какой-либо определенностью.

9 голосов
/ 10 февраля 2010

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

Таким образом, нет, хеш-функции нельзя отменить.Но вы можете искать такие коллизии.


Редактировать

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

И для проверки подлинности ответа на конкретный запрос я бы отправил nonce вместе с запросом, который требуетиспользоваться как соль для аутентификации ответа.

3 голосов
/ 09 февраля 2017

Не совсем верно, что вы не можете перевернуть зашифрованную строку SHA-1.

Вы не можете напрямую изменить один, но это можно сделать с помощью радужных таблиц.

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

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

Вы можете проверить свои зашифрованные строки SHA-1 здесь: http://sha1.gromweb.com/

В Интернете есть и другие радужные таблицы, которые вы можете использовать, поэтому Google обратит SHA1.

2 голосов
/ 12 февраля 2010

Обратите внимание, что лучшими атаками на MD5 и SHA-1 были нахождение любых двух произвольных сообщений m1 и m2, где h (m1) = h (m2), или нахождение m2 таких, что h (m1) = h (m2) и м1! = м2. Найти m1 с учетом h (m1) все еще невозможно в вычислительном отношении.

Кроме того, вы используете MAC (код аутентификации сообщения), поэтому злоумышленник не может забыть сообщение, не зная секрета, с одной оговоркой - общая конструкция MAC, которую вы использовали, подвержена атаке с удлинением длины - злоумышленник может некоторые обстоятельства подделывают сообщение m2 | m3, h (секрет, m2 | m3), учитывая m2, h (секрет, m2). Это не проблема только с отметкой времени, но это проблема, когда вы вычисляете MAC для сообщений произвольной длины. Вы можете добавить секрет к метке времени вместо предварительного ожидания, но в целом вам лучше использовать HMAC с дайджестом SHA1 (HMAC является просто конструкцией и может использовать MD5 или SHA в качестве алгоритмов дайджеста).

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

Лучше всего отправить сообщение, HMAC (сообщение) с достаточно длинным секретом. Сервер может быть уверен в целостности сообщения и подлинности клиента.

Вы можете в зависимости от сценария угрозы добавить защиту от повторного воспроизведения или заметить, что в этом нет необходимости, поскольку сообщение при полном воспроизведении не вызывает проблем.

1 голос
/ 19 мая 2011

Хэши зависят от входа, и для одного и того же входа будут выдаваться одинаковые результаты.

Итак, в дополнение к другим ответам, пожалуйста, помните следующее:

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

Так, а не использовать sha1 («Мой секретный ключ» + «отметка времени»)

пойти на sha1 («временная метка» + «мой секретный ключ»)

0 голосов
/ 19 мая 2017

SHA1 был разработан для предотвращения восстановления исходного текста из хеша.Тем не менее, Базы данных SHA1 существуют , которые позволяют искать общие пароли по их хешу SHA.

0 голосов
/ 11 июня 2016

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

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

Этот сценарий похож на то, как взломщики Wi-Fi могут взломать пароли Wi-Fi после того, как они захватят достаточно пакетов данных. После того, как вы соберете достаточно данных, сгенерировать секретный ключ будет тривиально, даже если вы технически не обращаете SHA1 или даже SHA256. ЕДИНСТВЕННЫЙ способ убедиться, что ваши данные не были подделаны, или проверить, с кем вы разговариваете на другом конце, - это зашифровать весь большой двоичный объект данных с помощью GPG и т. П. (Открытый и закрытый ключи). Хеширование по своей природе ВСЕГДА небезопасно, когда хэшируемые данные видны.

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

Примечание: это был один из способов, которым британцы смогли взломать код Enigma во время Второй мировой войны, что привело к поддержке союзников.

Есть мысли по этому поводу?

...