Всегда солите ваши файлы AES.Причина этого в том, что у вас есть каталог файлов JPEG, которые зашифрованы с тем же паролем, но не содержат соли.Если кто-то завладеет этими файлами, они увидят, что все файлы начинаются с одинаковых байтов (так как это заголовок JPEG, и одна и та же фраза-пароль всегда будет зашифровываться с одинаковыми значениями, пока байты не начнут различаться, по крайней мере, с CBC)Они также будут знать, как будут выглядеть первые блоки файла в незашифрованном виде.Даже если они не знают, к какому типу файлов они относятся, они, вероятно, могут угадать тип по длине отведения, которые похожи, и по различным форматам файлов.
Зная это, они могут повернуть вспятьспроектируйте свой пароль способом, подобным радужным таблицам / грубой силе.Соление не остановит это, но будет очень трудно взломать, так как каждый файл (после соли) будет отличаться, так что идентификация типа файла будет трудной, плюс им придется генерировать радужную таблицу для каждой соли или вычислительных затрат.создания вектора инициализации для соли.
OpenSSL сохраняет соль в файле
например, я создал файл, используя эту команду с паролем «пароль»:
эхо "randomprhase" |openssl aes-128-cbc -out message.enc
Вот hexdump полученного файла: -
[james @ web openssltest] $ hexdump message.enc
0000000 6153 746c 6465 5f5f 7eaa c4fd 63d8 8c8c
0000010 9519 75c9 0497 d449 27f5 2c91 0d34 5ceb
0000020
и те же данные, когда я бежалснова шифрование: -
[james @ web openssltest] $ hexdump message1.enc
0000000 6153 746c 6465 5f5f a876 5394 53f1 bf1a
0000010 adcb e1cd dba98034 cf13 8b3f c37c 5048
0000020
Первые 4 байта говорят, что файл засолен ( 6153 746c 6465 5f5f ) и всегда будет таким же.
Следующие 4 байта являются случайной солью ( 7eaa c4fd 63d8 8c8 для первого файла & a876 5394 53f1 bf1a для второго файла) OpenSSL примет эту соль исоздайте вектор инициализации (IV), используя MD5-хэш пароля + соль, повторенный 3 раза.Этот IV затем используется для шифрования файла.Обратите внимание, что полезная нагрузка последних 8 байтов в каждом случае различна.
Если мы выполнили одну и ту же команду, но не салитировали:
[james @ web openssltest] $ echo "randomprhase" |openssl aes-128-cbc -nosalt -out nosalt.enc
[james @ web openssltest] $ echo "randomprhase" |openssl aes-128-cbc -nosalt -out nosalt1.enc
[james @ web openssltest] $ hexdump nosalt.enc
0000000 947e f4ab 6dd7 c548 89e4 b587 82f4 5136
0000010
[james @ web openssltest] $ hexdump nosalt1.enc
0000000 947e f4ab 6dd7 c548 89e4 b587 82f4 5136
0000010
Обратите внимание, что когдаЯ повторил его, используя тот же пароль, и указал, что солитоны не нужны.
В реализации Java вы можете хранить свою соль отдельно, но стоит потратить свое время на написание чего-то, что эмулирует реализацию OpenSSL, поэтомудля дешифрования файла приходится полагаться на собственный код (особенно если вы потеряете код в будущем, шифрование может помешать вам так же, как и злоумышленнику).