Есть ли способ узнать, какой тип шифрования/кодирования используется?
Например, я тестирую веб-приложение, которое хранит пароль в базе данных в зашифрованном формате (WeJcFMQ/8+8QJ/w0hHh+0g==
). Как определить, какое хеширование или шифрование используется?
Ваш пример строки (WeJcFMQ/8+8QJ/w0hHh+0г==
) - это кодировка base64 последовательность из 16 байт, которые совершенно не похожи на осмысленные ASCII или UTF-8. If это хранится значение пароля verification (т. е. не совсем на "зашифрованы" и пароль, а на "хешированные" и пароль), то это, вероятно, результат хэш-функции, вычисленной по пароль; одна классическая хэш-функции с 128-битным выходом является MD5. Но это может быть о чем угодно.
В "нормальных" и так знал, что это посмотреть на код приложения. Код приложения воплощается в материальном, жира путем (исполняемые файлы на сервер, исходный код где-то...), которая не является и не может быть, как сильно охраняется как секретный ключ. Таким образом, обратный инжиниринг-это в "Путь" по.
Запрет обратного инжиниринга, вы можете сделать несколько экспериментов, чтобы попытаться сделать обоснованные предположения:
Edit: Я только что заметил очень классный скрипт под названием hashID. Название практически полностью описывает его.
Вообще говоря, использование опыта для создания обоснованных предположений - вот как делаются такие вещи.
Вот список с очень большим количеством хэш-выходов, чтобы вы знали, как выглядит каждый из них, и могли создавать подписи/паттерны или просто проверять оптически.
- [Online Hash Crack Hashes Generator](https://www.onlinehashcrack.com/hash-generator.php)
- [InsidePro Software Forum > Hash Types](https://web.archive.org/web/20160403135857/https://forum.insidepro.com/viewtopic.php?t=8225) (via Archive.org)
Есть две *основные* вещи, на которые вы в первую очередь обращаете внимание:
- длина хэша (каждая хэш-функция имеет определенную длину выхода)
- используемый алфавит (все ли буквы английские? цифры 0-9 и A-F в шестнадцатеричном формате? какие есть специальные символы, если есть?)
Некоторые программы для взлома паролей (например, John the ripper) применяют сопоставление шаблонов на входе, чтобы угадать используемый алгоритм, но это работает только для общих хэшей. Например, если взять любой выходной хэш и повернуть каждую букву на 1, большинство схем сопоставления шаблонов не сработают.
То что вы выложили это 16 байт (128 бит) базовая 64 закодированных данных. Тот факт, что он в кодировке base-64 Не'т рассказать нам много, потому что базовая 64 не шифрования/хэширования алгоритм-это способ закодировать двоичные данные в текст. Это означает, что этот блок включает в себя одна порция полезной информации, а именно, что выход составляет 16 байт. Мы можем сравнить это с размером блока наиболее часто используемых схем и выяснить, что он может'т быть. На сегодняшний день наиболее распространенными схемами являются:
Следующее, что нам нужно сделать, это посмотреть на другие блоки зашифрованного текста, чтобы выяснить ответ на следующий вопрос:
Если не все блоки имеют одинаковую длину, то вы не'т смотреть на алгоритм хэширования, но шифрования один. Поскольку на выходе всегда будет умножен на базовый блок размер наличие блока, который не делится нацело на 16 байт будет означать, что он не может быть AES, и поэтому необходимо des или 3DES.
Если у вас есть возможность поставить пароль и наблюдать выход это можно определить очень быстро. Просто положите в 17 символьный пароль и посмотри на длину. Если ее 16 байт у вас есть алгоритм MD5, 20 байт означает ша-1, 24 байта означает, des или 3DES, 32 байта означает, ня.
Это зависит от формата - некоторые протоколы для хранения зашифрованного текста есть часть открытого текста, который определяет, как это'ы, зашифрованные. Из вашего примера, я'м сомнительно, поскольку строка вы ссылку так коротка, что, похоже, это's просто зашифрованный текст.
Я'd предлагает пару мыслей:
В "==" в конце, несомненно, будет дополнением, так Дон'т включать, что при любых попытках расшифровки.
Вы можете иметь дело с хэш или соленый хеш, а не шифрование. В этом случае, пытаясь "расшифровать" в данных выиграл't РАБОТА - Вы должны соответствовать пароли, используя один и тот же хэш и/или Солт-значение, который использовался изначально. Нет никакого способа с подсоленной пароль, чтобы получить исходное значение.
Ваш абсолютный лучший выбор, чтобы получить копию кода, который используется для хранения паролей. Где-то там, пароли проходят криптографической операции. Найти код, чтобы узнать, что'ы происходит здесь. В 9 случаях из 10, они с помощью какой-то API для хэширования/соление/шифрования, и вы можете подражать или повернуть его вспять, используя тот же самый API.
Кодирование обычно можно угадать. Например, строки, которые вы отправили свой вопрос в кодировке base64. Равняется знаки padding в схеме base64. Что's что-то я знаю, на взгляд из опыта.
Если ты дал мне строку, которая была зашифрована, я, возможно, смогу сказать вам кодировку, но я могу'т рассказать вам алгоритм, используемый, чтобы зашифровать его, если какой-то метаданных. Причина такова: алгоритмы шифрования работают, производя то, что кажется случайными данными. Если я зашифрованы два предложения с двумя шифрами (четыре выхода), вы не могли бы сказать мне с уверенностью, что шифротекст принадлежал какой шифр, если вы не расшифровал его или взломали шифр.
Что касается вашего конкретного экземпляра, пароли обычно хэширован. Это означает, что вы можете'т восстановить пароль из хэша, но вы можете проверить, если хэш совпадает пароль. В этой связи, @Джон'ы ответ золотой. Если вы можете ввести пароль, который вы знаете, и затем попробовать общие схемы в отношении его, вы можете узнать, что используется хэш.
Если это действительно простой хэш пароля, мы могли бы использовать Google, чтобы взломать его](http://www.lightbluetouchpaper.org/2007/11/16/google-as-a-password-cracker/). В base64-это трудно, хотя и запросам, все эти слеши и знаков "плюс", так давайте'ы сначала преобразовать хэш в шестнадцатеричное:
$ perl -MMIME::Base64 -le 'print unpack "H*", decode_base64 "WeJcFMQ/8+8QJ/w0hHh+0g=="'
59e25c14c43ff3ef1027fc3484787ed2
ОК, теперь мы можем гуглит. На данный момент, я'м получаю только один hitот md5this.com &ампер;mdash; не хотя очевидно, что совсем скоро будет больше, в том числе этот пост.
К сожалению (а может к счастью, в зависимости от вашей точки зрения), мы'вновь не повезло достаточно, чтобы на самом деле найти прообраз (на данный момент сайт списки хеш-это как "трескать...и"), но то, что это's на этот список совсем убедительно свидетельствуют, что это'ы действительно несоленые MD5-хэш настоящий пароль.
Единственный способ - угадать. С опытом угадывание будет более правильным.
Например: На основании длины выходного сигнала: MD5 - 128 бит, или 16 байт, SHA1 - 160 бит, или 20 байт. На основе кодовой таблицы вывода: BASE64 обеспечивает вывод печатаемых символов.
В конце концов, именно метод проб и ошибок научит вас тому, как.
Единственный способ - это когда есть метаданные, которые говорят вам об этом. Например, в последнее время я работаю с PDF, и формат включает в себя словарь, содержащий фильтр, алгоритм, размер ключа и т.д. Но если у вас есть только шифротекст, то все, что у вас есть - это непрозрачный сгусток данных.