В настоящее время я использую 256-битный Rijndael в режиме CBC для шифрования некоторых данных, которые необходимо отправить в другое место. Чтобы повысить безопасность, я беру случайно сгенерированный хэш SHA-256 и использую формулу, чтобы отрубить его разные части, чтобы использовать ключ шифрования и вектор инициализации (конечно, хеш отправляется вместе с данными). Формула для генерации ключа и IV довольно проста, и поскольку код написан на PHP, он закодирован на странице, доступной пользователю. Что мне интересно: это более или менее безопасно, чем иметь один постоянный ключ и / или IV?
Должен ли я генерировать ключ из хеша для шифрования?
Ответы (2)
Вероятно, это НЕ тот путь, по которому вы хотите идти. По сути, хорошему хакеру не понадобится много времени, чтобы выяснить вашу математическую формулу для управления HASH для генерации вашего ключа и IV. Таким образом, вы, по сути, отправляете ключи от королевства вместе с самим королевством.
Обычно способ выполнения этого типа операции заключается в генерации сеансового ключа (может быть таким же, как вы делаете это сейчас), но с использованием метода шифрования с открытым ключом для шифрования этого сеансового ключа. Затем вы используете метод шифрования с открытым ключом, чтобы отправить сеансовый ключ в то место, куда должны быть отправлены ваши данные. Получатель имеет открытый ключ и может зашифровать сообщение. ключ сеанса канала.
Теперь у обеих сторон есть связь. сеансовый ключ канала и ваши НАСТОЯЩИЕ данные могут быть зашифрованы с помощью этого ключа, поскольку сеансовый ключ не был отправлен в открытом виде.
Риджиндаэль является примером симметричного криптоалгоритма, в котором криптоалгоритмы с открытым ключом асимметричны. Примеры криптоалгоритмов с открытым ключом: RSA, ECDSA (Crypto) и т. Д.
О генерации ключей краткосрочного использования. Имейте долгосрочный ключ. Согласуйте формат даты с получателем. Каждый день объединяйте свой долгосрочный ключ с датой дня и хешируйте его с помощью SHA-256, чтобы сгенерировать дневной ключ для использования только в эту дату:
dayKey <- SHA256("my very secret long term key" + "2012-06-27")
Получатель будет иметь всю информацию, необходимую для генерации точно такого же ключа на своей стороне. Любой злоумышленник будет знать дату, но не знает долгосрочного ключа.
Вам нужно будет согласовать протоколы примерно на полночь и некоторые другие детали.
Меняйте долгосрочный ключ раз в месяц или два, в зависимости от количества передаваемых зашифрованных данных. Чем больше данных вы передаете, тем чаще вам нужно менять долгосрочный ключ.