Итак, если у вас есть веб-сайт и пользователь регистрируется, вы сохраняете его пароль в виде хэша. Когда они входят в систему, ваш веб-сайт берет предоставленный пароль, хеширует его и сравнивает хешированную отправку с сохраненным хэшем, верно?
Да, с тремя дополнительными деталями стандартным современным способом:
- Пароль попадает на сайт в зашифрованном виде по протоколу TLS; он расшифровывается перед хешированием.
- Соль (выбирается случайным образом при регистрации пароля или/и имя пользователя/электронная почта) хешируется вместе с паролем и сохраняется сервером вместе с хэшем пароля.
- Он использует преднамеренно медленный и, надеюсь, жесткий итеративный хэш, разработанный для паролей, например Аргон2. Это разработано в качестве защиты на случай, если сервер допустит утечку списка хэшей и соли (такие утечки случаются регулярно). Эта мера предосторожности усложняет поиск пароля (точнее, приемлемого пароля, скорее всего исходного) в словаре обычных паролей путем хеширования возможных паролей и соли и сравнения с хэшем пароля, как это делает сервер для проверки пароль при входе.
Скажем, вы хешируете предложение, используя SHA-256, вы КОГДА-ЛИБО расшифровываете такой хэш или даже имеете возможность?
Нет. Во-первых, «расшифровать» - неправильный термин для поиска ввода хэш-функции с учетом ее вывода; правильный термин - «обратный». И хеш предназначен для необратимости при нормальной работе. Если ввод хэша неизвестен и выбран случайным образом в большом наборе, а дизайн хэша хорош, практически невозможно обратить хэш.
WhatsApp говорит, что мои сообщения зашифрованы. Итак, если я шифрую их при отправке, как другие люди расшифровывают их?
Хеширование — это не то же самое, что шифрование. Хеширование преобразует сообщение необратимым образом и не использует ключ. Шифрование преобразует сообщение в соответствии с ключом шифрования способом, обратимым с помощью ключа дешифрования.
Ключ дешифрования должен быть секретным, иначе цель шифрования (сокрытие зашифрованного от злоумышленников, не знающих ключ дешифрования) не будет достигнута. В симметричном шифровании (например, AES-GCM) ключи шифрования и дешифрования совпадают. В асимметричном шифровании (например, RSA, ECIES) они другие: ключ шифрования может быть обнародован и называется открытым ключом; ключ дешифрования является закрытым ключом.
Когда вы отправляете сообщение с помощью современного приложения, использующего асимметричное шифрование (например, Whatsapp), вот общая картина:
- Ваше приложение рисует случайный симметричный ключ, уникальный для сообщения.
- Ваше приложение шифрует сообщение, используя симметричное шифрование с этим уникальным для сообщения ключом, и результат отправляется.
- Ваше приложение многократно шифрует уникальный ключ сообщения для каждого предполагаемого получателя, используя асимметричное шифрование (например, ECIES) и каждый открытый ключ предполагаемого получателя, и результаты отправляются.
- Когда получателю необходимо расшифровать сообщение, его приложение сначала получает зашифрованный уникальный для сообщения ключ, зашифрованный его открытым ключом, и расшифровывает его (по асимметричному расшифрованию) с помощью своего закрытого ключа, получая уникальный для сообщения ключ.
- Приложение получателя получает зашифрованное сообщение, расшифровывает его с помощью симметричного расшифрования с использованием уникального ключа сообщения, а затем отображает расшифрованное сообщение.
Основным механизмом защиты конфиденциальности сообщения является симметричное шифрование. Асимметричное шифрование защищает конфиденциальность уникального для сообщения ключа, таким образом косвенно защищая конфиденциальность сообщения. Хеширование обычно используется внутри в качестве строительного блока на некоторых этапах, но не является механизмом шифрования сообщения или уникального для сообщения ключа.