Вы должны получить ключ и IV из пароля, используя PKCS5_PBKDF2_HMAC. Вы должны использовать EVP_*функции для шифрования и дешифрования. См. Симметричное шифрование и дешифрование EVP на вики OpenSSL. В самом деле, вы , вероятно , следует использовать проверку подлинности шифрования , поскольку она обеспечивает как конфиденциальность и подлинность. См. Шифрование и дешифрование с аутентификацией EVP на вики OpenSSL.
jww
3
Не понимаю из вашего вопроса, почему вы хотите OpenSSL. Комментарий ниже показывает, что GPG лучше - также из-за безопасности. stackoverflow.com/a/31552829/952234 Я голосую вниз.
Ответ, вероятно, не является оптимальным (на момент написания статьи) в зависимости от варианта использования OP. В частности, параметры "-a", вероятно, не являются оптимальными, и ответ не объясняет их использование. «-a» обычно используется, когда зашифрованный вывод должен быть передан в ASCII / текстовой форме и имеет эффект увеличения размера вывода по сравнению с двоичной формой. Оригинальный постер не определяет формат вывода, и поэтому я чувствую, что по крайней мере это должно быть упомянуто. См. Ответ: stackoverflow.com/a/31552829/952234, который также содержит примечание о том, почему вы должны использовать gpg вместо openssl для этой задачи.
Moo
7
Не используйте вышеупомянутую команду, поскольку нет получения ключа. Подробнее читайте здесь: openssl
вывод
Также следует указать ключ или указать, откуда он берется. Это усилено?
Добавляя к комментарию @Kebman, вы можете добавить -md sha256к своей команде кодирования и декодирования, если вы планируете использовать этот файл на другом компьютере. Это должно охватить вас против несовместимости / различий в версиях OpenSSL
dev-rowbot
162
Короткий ответ:
Вы, вероятно, хотите использовать gpgвместо opensslтак, чтобы увидеть «Дополнительные заметки» в конце этого ответа. Но чтобы ответить на вопрос, используйте openssl:
Объяснение наиболее полезных параметров по вашему вопросу:
-e
Encrypt the input data: this is the default.
-d
Decrypt the input data.
-k <password>
Only use this if you want to pass the password as an argument.
Usually you can leave this out and you will be prompted for a
password. The password is used to derive the actual key which
is used to encrypt your data. Using this parameter is typically
not considered secure because your password appears in
plain-text on the command line and will likely be recorded in
bash history.
-kfile <filename>
Read the password from the first line of <filename> instead of
from the command line as above.
-a
base64 process the data. This means that if encryption is taking
place the data is base64 encoded after encryption. If decryption
is set then the input data is base64 decoded before being
decrypted.
You likely DON'T need to use this. This will likely increase the
file size for non-text data. Only use this if you need to send
data in the form of text format via email etc.
-salt
To use a salt (randomly generated) when encrypting. You always
want to use a salt while encrypting. This parameter is actually
redundant because a salt is used whether you use this or not
which is why it was not used in the "Short Answer" above!
-K key
The actual key to use: this must be represented as a string
comprised only of hex digits. If only the key is specified, the
IV must additionally be specified using the -iv option. When
both a key and a password are specified, the key given with the
-K option will be used and the IV generated from the password
will be taken. It probably does not make much sense to specify
both key and password.
-iv IV
The actual IV to use: this must be represented as a string
comprised only of hex digits. When only the key is specified
using the -K option, the IV must explicitly be defined. When a
password is being specified using one of the other options, the
IV is generated from this password.
-md digest
Use the specified digest to create the key from the passphrase.
The default algorithm as of this writing is sha-256. But this
has changed over time. It was md5 in the past. So you might want
to specify this parameter every time to alleviate problems when
moving your encrypted data from one system to another or when
updating openssl to a newer version.
Отличный комментарий о предпочтении GPG над OpenSSL. Я нахожу невероятным, что OpenSSL использует такой слабый хеш, полученный из пароля!
Mark
2
Обязательно используйте опцию «-md md5» для совместимости с файлами, которые были зашифрованы в более старом openssl без указания опции -md, в противном случае вы обнаружите, что файлы не будут расшифровываться в более новых системах: github.com/libressl-portable/ портативные / проблемы / 378
Сэм Лиддикотт
1
Значения по умолчанию изменяются между версиями openssl. 1.0.x использует значение по умолчанию md5 для опции -md. Версия 1.1.x использует sha256. Если вы расшифровываете и получаете ошибку «: digital envelope: EVP_DecryptFinal_ex: bad decrypt». попробуйте указать "-md md5" или "-md sha256".
txyoji
1
«Вам будет предложено ввести пароль при шифровании или дешифровании». gpgпозволяет мне расшифровать файл без запроса пароля. Похоже, что пароль хранится в течение некоторого периода времени, который я не хочу.
user76284
1
@moo Также кажется, что эта опция --no-symkey-cacheотключает кэширование при использовании gpg с --symmetric, даже если агент работает.
Чтобы использовать незашифрованный пароль, замените его -k symmetrickeyна -pass stdinили-pass 'pass:PASSWORD'
Zenexer
3
Не используйте вышеупомянутую команду, поскольку нет получения ключа. Подробнее читайте здесь: openssl
вывод
4
Относительно комментария @ jonasl, обратите внимание, что -k symmetrickeyвводит в заблуждение. Эта -kопция используется для указания пароля, из которого OpenSSL получает симметричный ключ. Если вы хотите указать симметричный ключ, вы должны использовать эту -Kопцию.
user1071847
13
НЕ ИСПОЛЬЗУЙТЕ ОТКЛЮЧЕНИЕ КЛЮЧЕВЫХ КЛЮЧЕВ.
В настоящее время принятый ответ использует его, и он больше не рекомендуется и не безопасен.
PBKDF1 применяет хеш-функцию, которая должна быть MD2 [6], MD5 [19] или SHA-1 [18], для получения ключей. Длина полученного ключа ограничена длиной вывода хеш-функции, которая составляет 16 октетов для MD2 и MD5 и 20 октетов для SHA-1. PBKDF1 совместим с процессом получения ключей в PKCS # 5 v1.5. PBKDF1 рекомендуется только для совместимости с существующими приложениями, поскольку производимые им ключи могут быть недостаточно большими для некоторых приложений.
PBKDF2 применяет псевдослучайную функцию (см. Приложение B.1 для примера) для получения ключей. Длина полученного ключа практически не ограничена. (Тем не менее, максимально эффективное пространство поиска для производного ключа может быть ограничено структурой базовой псевдослучайной функции. Для дальнейшего обсуждения см. Приложение B.1.) PBKDF2 рекомендуется для новых приложений.
Обратите внимание, что OpenSSL CLI использует слабый нестандартный алгоритм для преобразования ключевой фразы в ключ, и установка GPG приводит к добавлению различных файлов в ваш домашний каталог и запуску фонового процесса gpg-agent. Если вы хотите максимальной переносимости и контроля с помощью существующих инструментов, вы можете использовать PHP или Python для доступа к API более низкого уровня и напрямую передать полный ключ AES и IV.
Openssl CLI теперь внедряет и предупреждает пользователей, что они должны использовать PBKDF2 для хэширования паролей. Однако число итераций по умолчанию очень мало и должно быть намного больше.
Энтони
2
Я нахожу в Интернете программу с открытым исходным кодом, которая использует openssl для шифрования и дешифрования файлов. Это делается с помощью одного пароля. Самое замечательное в этом скрипте с открытым исходным кодом заключается в том, что он удаляет исходный незашифрованный файл, уничтожая его. Но опасная вещь заключается в том, что после того, как исходный незашифрованный файл исчезнет, вы должны убедиться, что вы запомнили свой пароль, иначе они больше не смогут расшифровать ваш файл.
Ситуация изменилась при использовании openssl для шифрования файлов, их гораздо больше, о которых нужно помнить, чтобы вы могли успешно расшифровать зашифрованные файлы. Одним из решений этой проблемы является "keepout" antofthy.gitlab.io/software/#keepout
Энтони
2
Как упоминалось в других ответах, в предыдущих версиях openssl использовалась функция получения слабого ключа для получения ключа шифрования AES из пароля. Тем не менее, openssl v1.1.1 поддерживает более сильную функцию деривации ключа, где ключ извлекается из пароля pbkdf2с использованием случайно сгенерированной соли и нескольких итераций хеширования sha256 (по умолчанию 10 000).
Что из-за того, что эти параметры постоянно меняются, означает, что вам также необходимо вести учет того, какие параметры использовались при создании каждого зашифрованного файла openssl. Тем более что количество итераций должно увеличиваться со временем! В качестве одного решения можно увидеть относительно простую обертку вокруг openssl enc ... "keepout" antofthy.gitlab.io/software/#keepout. Может расширяться и включать больше openssl со временем.
Дополнительные комментарии к mti2935 хороший ответ.
Кажется, чем выше итерация, тем лучше защита от перебора, и вам следует использовать высокую итерацию, поскольку вы можете позволить себе производительность / ресурсы.
На моем старом Intel i3-7100 шифрование довольно большого файла 1.5GB:
PKCS5_PBKDF2_HMAC
. Вы должны использоватьEVP_*
функции для шифрования и дешифрования. См. Симметричное шифрование и дешифрование EVP на вики OpenSSL. В самом деле, вы , вероятно , следует использовать проверку подлинности шифрования , поскольку она обеспечивает как конфиденциальность и подлинность. См. Шифрование и дешифрование с аутентификацией EVP на вики OpenSSL.Ответы:
Шифрование:
Расшифровать:
Подробнее о различных флагах
источник
-md sha256
к своей команде кодирования и декодирования, если вы планируете использовать этот файл на другом компьютере. Это должно охватить вас против несовместимости / различий в версиях OpenSSLКороткий ответ:
Вы, вероятно, хотите использовать
gpg
вместоopenssl
так, чтобы увидеть «Дополнительные заметки» в конце этого ответа. Но чтобы ответить на вопрос, используйтеopenssl
:Зашифровать:
Расшифровать:
Примечание. Вам будет предложено ввести пароль при шифровании или дешифровании.
Длинный ответ:
Ваш лучший источник информации для
openssl enc
, вероятно, будет: https://www.openssl.org/docs/man1.1.1/man1/enc.htmlКомандная строка:
openssl enc
принимает следующую форму:Объяснение наиболее полезных параметров по вашему вопросу:
Дополнительные замечания:
Хотя вы специально задали вопрос об OpenSSL, возможно, вы захотите использовать вместо этого GPG для целей шифрования на основе этой статьи. OpenSSL против GPG для шифрования резервных копий вне сайта?
Чтобы использовать GPG для того же, вы должны использовать следующие команды:
Зашифровать:
Расшифровать:
Примечание. Вам будет предложено ввести пароль при шифровании или дешифровании.
источник
gpg
позволяет мне расшифровать файл без запроса пароля. Похоже, что пароль хранится в течение некоторого периода времени, который я не хочу.--no-symkey-cache
отключает кэширование при использовании gpg с--symmetric
, даже если агент работает.Шифрование:
Расшифровать:
Для получения дополнительной информации см.
openssl(1)
Документы.источник
-k symmetrickey
на-pass stdin
или-pass 'pass:PASSWORD'
-k symmetrickey
вводит в заблуждение. Эта-k
опция используется для указания пароля, из которого OpenSSL получает симметричный ключ. Если вы хотите указать симметричный ключ, вы должны использовать эту-K
опцию.НЕ ИСПОЛЬЗУЙТЕ ОТКЛЮЧЕНИЕ КЛЮЧЕВЫХ КЛЮЧЕВ.
В настоящее время принятый ответ использует его, и он больше не рекомендуется и не безопасен.
Злоумышленнику очень просто взломать ключ.
https://www.ietf.org/rfc/rfc2898.txt
Сделай это:
openssl enc -aes-256-cbc -pbkdf2 -iter 20000 -in hello -out hello.enc -k meow
openssl enc -d -aes-256-cbc -pbkdf2 -iter 20000 -in hello.enc -out hello.out
Примечание . Итерации при дешифровании должны быть такими же, как итерации при шифровании.
Количество итераций должно быть не менее 10000. Вот хороший ответ о количестве итераций: https://security.stackexchange.com/a/3993
Также ... у нас достаточно людей, которые рекомендуют GPG. Прочитайте этот чертов вопрос.
источник
Зашифровать:
Расшифровать:
bf === Blowfish в режиме CBC
источник
Обновление с использованием случайно сгенерированного открытого ключа.
Encypt:
Расшифровать:
У меня есть полное руководство по этому вопросу на http://bigthinkingapplied.com/key-based-encryption-using-openssl/
источник
Обратите внимание, что OpenSSL CLI использует слабый нестандартный алгоритм для преобразования ключевой фразы в ключ, и установка GPG приводит к добавлению различных файлов в ваш домашний каталог и запуску фонового процесса gpg-agent. Если вы хотите максимальной переносимости и контроля с помощью существующих инструментов, вы можете использовать PHP или Python для доступа к API более низкого уровня и напрямую передать полный ключ AES и IV.
Пример вызова PHP через Bash:
Это выводит:
Вы также можете использовать
openssl_pbkdf2
функцию PHP для безопасного преобразования ключевой фразы в ключ.источник
Я нахожу в Интернете программу с открытым исходным кодом, которая использует openssl для шифрования и дешифрования файлов. Это делается с помощью одного пароля. Самое замечательное в этом скрипте с открытым исходным кодом заключается в том, что он удаляет исходный незашифрованный файл, уничтожая его. Но опасная вещь заключается в том, что после того, как исходный незашифрованный файл исчезнет, вы должны убедиться, что вы запомнили свой пароль, иначе они больше не смогут расшифровать ваш файл.
Вот ссылка это на github
https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py
источник
Как упоминалось в других ответах, в предыдущих версиях openssl использовалась функция получения слабого ключа для получения ключа шифрования AES из пароля. Тем не менее, openssl v1.1.1 поддерживает более сильную функцию деривации ключа, где ключ извлекается из пароля
pbkdf2
с использованием случайно сгенерированной соли и нескольких итераций хеширования sha256 (по умолчанию 10 000).Чтобы зашифровать файл:
Чтобы расшифровать файл:
источник
Дополнительные комментарии к mti2935 хороший ответ.
Кажется, чем выше итерация, тем лучше защита от перебора, и вам следует использовать высокую итерацию, поскольку вы можете позволить себе производительность / ресурсы.
На моем старом Intel i3-7100 шифрование довольно большого файла 1.5GB:
На самом деле нет никакой разницы, хотя не проверял использование памяти (?)
Я полагаю, что при использовании современных графических процессоров и даже более скором завтрашнем дне миллиарды переборов возможны каждую секунду.
12 лет назад a
NVIDIA GeForce 8800 Ultra
мог выполнять итерацию со скоростью более 200 000 миллионов в секунду (хотя хэширование MD5)Источник: Айнан-Барретт-Джонсон-Вивар-OpenSSL.pdf
источник