Шифрование Java AES с солью

хорошо, оказывается, я отстой в шифровании / дешифровании. Я просто не понимаю. Как я могу сделать Java encrypt String message1 = "hello world"; с String salt = "mySalt"; использование шифрования AES? также, как я могу расшифровать его после шифрования?

Если у вас есть время, чтобы предоставить самый базовый код, это мне очень поможет.

также 1 общий вопрос о шифровании AES, используя ту же соль, будет ли одно и то же сообщение всегда иметь одно и то же шифрование?

спасибо заранее.

4 ответов


AES не имеет понятия о соли. Нужны только данные и ключ. Для одного и того же входа он всегда будет генерировать один и тот же выход.

Как вы объединяете свое сообщение с солью, зависит от вас. Конкатенация строк, вероятно, достаточна. Но обратите внимание, что соли на самом деле не имеют большого смысла для чего-то вроде AES, потому что это не хэш-алгоритм.


всегда соль ваши файлы AES. Причина этого заключается в том, что у вас есть каталог JPEG-файлов, которые зашифрованы тем же паролем, но не имеют соли. Если кто-то завладеет этими файлами, они увидят, что все файлы начинаются с одних и тех же байтов (так как это заголовок JPEG, и одна и та же парольная фраза всегда будет шифроваться до тех пор, пока байты не начнут отличаться, по крайней мере, с CBC), они также будут знать, что первые блоки файла будут выглядеть незашифрованными. Даже если они не знают, какой тип файлов они, они, вероятно, могут угадать тип по длине свинца, которые похожи и различные форматы файлов там.

зная это, они могут перепроектировать ваш пароль таким же образом, как rainbow tables/brute force. Соление не остановит это, но сделает его действительно трудно взломать, как каждый файл (после соли) будет отличаться, так что идентификация типа файла трудно, плюс они должны были бы генерировать радугу таблица для каждой соли или вычислительные затраты на создание вектора инициализации для соли.

OpenSSL хранит соль в файле

например, я создал файл с помощью этой команды с паролем "пароль":
Эхо "randomprhase" / openssl aes-128-cbc-out сообщение.enc
Вот hexdump результирующего файла: -

[james@web openssltest]$ hexdump сообщение.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 dba9 8034 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
Ноль ноль ноль ноль ноль ноль ноль 947e f4ab 6dd7 c548 89e4 b587 82f4 5136
0000010

обратите внимание, что, когда я повторил его, используя тот же пароль и указанный не в Солт-они идентичны.

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


С Spring Security Crypto он упрощен (в основном потому, что они по умолчанию используют шифрование на основе пароля, а не другие формы):

final String password = "A private password that you need to keep secret.";  
final String salt = KeyGenerators.string().generateKey();
TextEncryptor encryptor = Encryptors.text(password, salt);

String cipherText = encryptor.encrypt(textToEncrypt);

String decryptedText = encryptor.decrypt(cipherText);

AES-это просто шифр, и вы можете использовать IV с текстом, который вы шифруете. При симметричном шифровании соль используется для ключа / секрета, который вы шифруете, как вы можете видеть выше.

в реальном мире вам придется иметь дело с распределенными системами, общими ключами и солями по всему кластеру и т. д. Много веселья.

Spring Security-это тонкая абстракция над JCE, поэтому ее легко адаптировать, если вы не используете саму Spring.


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

здесь хороший пример...