Я хочу зашифрувати та розшифрувати один файл за допомогою одного пароля.
Як я можу використовувати OpenSSL для цього?
Я хочу зашифрувати та розшифрувати один файл за допомогою одного пароля.
Як я можу використовувати OpenSSL для цього?
Відповіді:
Попередження про безпеку : AES-256-CBC не забезпечує автентифіковане шифрування і є вразливим для атаки оракула . Ви повинні використовувати щось на зразок віку .
Шифрувати:
openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc
Розшифрувати:
openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new
-md sha256
до своєї команди кодування та декодування, якщо плануєте використовувати цей файл на іншій машині. Це повинно покрити вас проти несумісності / відмінності версії OpenSSL
Ви, ймовірно, хочете використовувати gpg
замість openssl
цього, дивіться "Додаткові примітки" в кінці цієї відповіді. Але відповісти на питання, використовуючи openssl
:
Для шифрування:
openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data
Дешифрувати:
openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data
Примітка. Під час шифрування чи розшифрування вам буде запропоновано ввести пароль.
Найкращим джерелом інформації для openssl enc
, ймовірно, буде: https://www.openssl.org/docs/man1.1.1/man1/enc.html
Командний рядок:
openssl enc
приймає таку форму:
openssl enc -ciphername [-in filename] [-out filename] [-pass arg]
[-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename]
[-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P]
[-bufsize number] [-nopad] [-debug] [-none] [-engine id]
Пояснення найбільш корисних параметрів стосовно вашого питання:
-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.
Хоча ви спеціально запитали про OpenSSL, ви можете розглянути можливість використання GPG замість цього для шифрування на основі цієї статті OpenSSL проти GPG для шифрування резервних копій за межами сайту?
Щоб використовувати GPG, щоб зробити те саме, ви використовуєте наступні команди:
Для шифрування:
gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data
Дешифрувати:
gpg --output un_encrypted.data --decrypt encrypted.data
Примітка. Під час шифрування чи розшифрування вам буде запропоновано ввести пароль.
gpg
дозволяє мені розшифрувати файл, не запрошуючи пароль. Схоже, що пароль зберігається протягом певного періоду часу, якого я не хочу.
--no-symkey-cache
вимикає кешування під час використання gpg з --symmetric
, навіть якщо агент працює.
Шифрувати:
openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey
Розшифрувати:
openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey
Детальніше див. У openssl(1)
документах.
-k symmetrickey
з -pass stdin
або-pass 'pass:PASSWORD'
-k symmetrickey
це вводить в оману. Цей -k
параметр використовується для введення пароля, з якого OpenSSL отримує симетричний ключ. Якщо ви хочете вказати симетричний ключ, потрібно скористатися -K
параметром.
НЕ ВИКОРИСТОВУЙТЕ КОНСУЛЬТАТИВНІ КЛЮЧОВІ ПЕРЕВІРКИ ВІДКРИТТЯ
В даний час прийнята відповідь використовує її, і вона більше не рекомендується і захищена.
Для зловмисника дуже доцільно просто збити грубу силу.
https://www.ietf.org/rfc/rfc2898.txt
PBKDF1 застосовує хеш-функцію, яка має бути MD2 [6], MD5 [19] або SHA-1 [18], для отримання ключів. Довжина похідного ключа обмежена довжиною виводу хеш-функції, яка становить 16 октетів для MD2 і MD5 і 20 октетів для SHA-1. PBKDF1 сумісний з процесом виведення ключа в PKCS # 5 v1.5. PBKDF1 рекомендується застосовувати лише для сумісності з існуючими програмами, оскільки ключі, які він створює, можуть бути недостатньо великими для деяких програм.
PBKDF2 застосовує псевдовипадкову функцію (див. Додаток В.1 для прикладу) для отримання ключів. Довжина похідного ключа по суті не обмежена. (Однак максимально ефективний простір пошуку похідного ключа може бути обмежений структурою основної псевдовипадкової функції. Для подальшого обговорення див. Додаток В.1.) Для нових програм рекомендується використовувати PBKDF2.
Зробити це:
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. Прочитайте прокляте питання.
Для шифрування:
$ openssl bf < arquivo.txt > arquivo.txt.bf
Дешифрувати:
$ openssl bf -d < arquivo.txt.bf > arquivo.txt
bf === Укус у режимі CBC
Оновлення за допомогою випадково створеного відкритого ключа.
Енципт:
openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}
Розшифрувати:
openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}
У мене є повний підручник з цього приводу на веб-сайті http://bigthinkingapplied.com/key-based-encryption-using-openssl/
Зауважте, що OpenSSL CLI використовує слабкий нестандартний алгоритм для перетворення парольної фрази в ключ та встановлення результатів GPG у різні файли, додані до домашнього каталогу та фоновий процес gpg-агента. Якщо ви хочете отримати максимальну портативність та контроль за допомогою існуючих інструментів, ви можете використовувати PHP або Python для доступу до API нижчого рівня та безпосередньо для передачі у повному обсязі AES Key та IV.
Приклад виклику PHP через Bash:
IV='c2FtcGxlLWFlcy1pdjEyMw=='
KEY='Twsn8eh2w2HbVCF5zKArlY+Mv5ZwVyaGlk5QkeoSlmc='
INPUT=123456789023456
ENCRYPTED=$(php -r "print(openssl_encrypt('$INPUT','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$ENCRYPTED='$ENCRYPTED
DECRYPTED=$(php -r "print(openssl_decrypt('$ENCRYPTED','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$DECRYPTED='$DECRYPTED
Це виводи:
$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456
Ви також можете використовувати 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).
Для шифрування файлу:
openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename
Щоб розшифрувати файл:
openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename
Додаткові коментарі до mti2935 хорошої відповіді.
Здається, що чим більше ітерація, тим кращий захист від грубої сили, і вам слід використовувати високу ітерацію, оскільки ви можете дозволити собі ефективність / ресурс.
На моєму старому Intel i3-7100 шифрування досить великого файлу 1,5 Гб:
time openssl enc -aes256 -e -pbkdf2 -iter 10000 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
Seconds: 2,564s
time openssl enc -aes256 -e -pbkdf2 -iter 262144 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
Seconds: 2,775s
Насправді немає різниці, не перевірив використання пам'яті, хоча (?)
З сьогоднішніми графічними процесорами та ще швидшими завтрашніми днями, мабуть, мільярд жорстоких ітерацій здається можливим щосекунди.
12 років тому NVIDIA GeForce 8800 Ultra
можна було повторити понад 200 000 мільйонів / сек ітерацій (проте хешування MD5)
PKCS5_PBKDF2_HMAC
. Ви повинні використовуватиEVP_*
функції для шифрування та дешифрування. Дивіться симетричне шифрування та дешифрування EVP на вікі OpenSSL. Насправді, ймовірно, ви повинні використовувати автентифіковане шифрування, оскільки воно забезпечує як конфіденційність, так і справжність. Дивіться автентифіковані шифрування та дешифрування EVP на вікі OpenSSL.