하나의 암호를 사용하여 하나의 파일을 암호화하고 해독하고 싶습니다.
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에 대해 구체적으로 요청했지만 오프 사이트 백업을 암호화하기 위해이 기사 OpenSSL vs GPG를 기반으로 암호화 목적 대신 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와 함께 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
옵션을 사용해야합니다 .
OPENSSL DEFAULT KEY DERIVATION을 사용하지 마십시오.
현재 허용되는 답변은이를 사용하며 더 이상 권장되지 않으며 안전하지 않습니다.
침입자가 키를 무차별 적으로 실행하는 것이 매우 가능합니다.
https://www.ietf.org/rfc/rfc2898.txt
PBKDF1은 키를 파생시키기 위해 MD2 [6], MD5 [19] 또는 SHA-1 [18] 인 해시 함수를 적용합니다. 파생 된 키의 길이는 해시 함수 출력의 길이에 의해 제한되는데, MD2 및 MD5의 경우 16 옥텟이고 SHA-1의 경우 20 옥텟입니다. PBKDF1은 PKCS # 5 v1.5의 키 파생 프로세스와 호환됩니다. PBKDF1은 기존 응용 프로그램과의 호환성을 위해서만 권장됩니다. PBKDF1은 생성하는 키가 일부 응용 프로그램에는 충분하지 않을 수 있기 때문입니다.
PBKDF2는 의사 난수 함수 (예 : 부록 B.1 참조)를 적용하여 키를 파생시킵니다. 파생 된 키의 길이는 기본적으로 제한이 없습니다. 그러나 파생 된 키의 최대 유효 검색 공간은 기본 의사 난수 함수의 구조에 따라 제한 될 수 있습니다. 자세한 내용은 부록 B.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 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-agent 백그라운드 프로세스가 실행됩니다. 기존 도구로 최대한의 이식성과 제어를 원한다면 PHP 또는 Python을 사용하여 하위 수준 API에 액세스하고 전체 AES 키 및 IV를 직접 전달할 수 있습니다.
Bash를 통한 PHP 호출 예 :
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
PHP의 openssl_pbkdf2
기능을 사용 하여 암호를 키로 안전하게 변환 할 수도 있습니다 .
온라인에서 찾은 오픈 소스 프로그램이 있는데 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.5GB를 암호화합니다.
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
실제로 차이는 없지만 메모리 사용량을 확인하지는 않았습니다 (?)
오늘날의 GPU와 더 빠른 내일을 통해 수십억 개의 무차별 강제 반복이 가능한 것으로 보입니다.
12 년 전NVIDIA GeForce 8800 Ultra
200.000 백만 / 초 이상의 반복을 반복 할 수있었습니다 (MD5 해싱).
PKCS5_PBKDF2_HMAC
.EVP_*
암호화 및 암호 해독 기능을 사용해야합니다 . OpenSSL 위키에서 EVP 대칭 암호화 및 암호 해독 을 참조하십시오 . 실제로 인증 된 암호화는 기밀성과 신뢰성을 모두 제공하므로 인증 된 암호화를 사용해야 합니다. OpenSSL 위키에서 EVP 인증 암호화 및 암호 해독 을 참조하십시오 .