Действительно ли возможно инвертировать sha1?

Действительно ли возможно инвертировать sha1?

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

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

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

Тогда я включаю этот sha1 в коммуникацию и сервер, который может сделать то же вычисление. И надо надеяться никто не был бы в состоянии выяснить "секретный ключ".

Но это действительно верно?

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

secret_key = bruteforce_sha1(sha1, timestamp)

Спасибо Johan


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

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

38
задан Johan 10 February 2010 в 07:22
поделиться

5 ответов

Нет, вы не можете отменить SHA-1, именно поэтому он называется алгоритмом безопасного хеширования.

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

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

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

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

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

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

41
ответ дан 27 November 2019 в 03:16
поделиться

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

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

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

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

25
ответ дан 27 November 2019 в 03:16
поделиться

Вопрос в на самом деле , как аутентифицироваться в незащищенном сеансе.

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

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

Итак, вместо вашего:

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

У вас есть:

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

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

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


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

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

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

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

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

15
ответ дан 27 November 2019 в 03:16
поделиться

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

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


Править

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

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

9
ответ дан 27 November 2019 в 03:16
поделиться

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

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

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

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

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

2
ответ дан 27 November 2019 в 03:16
поделиться
Другие вопросы по тегам:

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