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

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

9 голосов
/ 05 сентября 2011

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

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

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

Ответы [ 4 ]

6 голосов
/ 05 сентября 2011

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

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

3 голосов
/ 20 июля 2014

Всегда солите ваши файлы 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, поэтомудля дешифрования файла приходится полагаться на собственный код (особенно если вы потеряете код в будущем, шифрование может помешать вам так же, как и злоумышленнику).

2 голосов
/ 09 октября 2015

В 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.

1 голос
/ 05 сентября 2011

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

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

...