gpg는 --passphrase를 사용해도 비밀번호를 묻습니다.


65

다음 명령은 암호를 요구하지 않고 gpg 파일을 추출 할 것으로 예상합니다.

  gpg --passphrase 1234 file.gpg

그러나 암호를 묻습니다. 왜?

이것은 또한 같은 행동을합니다 :

  gpg --passphrase-file passfile.txt file.gpg

나는 그놈 3과 함께 우분투를 사용하고 그것이 페도라에서 작동하고 있음을 기억합니다.


1
당신은시겠습니까 gpg올바른 명령이 아닌 별명도 래퍼를 실행? 보십시오 /usr/bin/gpg --passphrase 1234 file.gpg, type gpg, gpg --versionset | grep '^.\{0,9\}PG'
F. 하우리

당신이하지 않으면 그냥 기록을 위해 그러나, 그들은 그것을 사용 억제는 GPG의 이전 버전을 사용하는 경우, 그것은 우분투 (작동해야하며, 그것은 gnupg1 패키지의에..

또한 GPG 2.x gpg --list-packets --batch myFile.gpg에서는 암호문을 요구하지만 GPG 1.x에서는 그렇지 않습니다. 그것은 내 문제 (내가 작성중인 프로그램에서) 였지만, 나는 당신의 문제가 있다고 생각했지만 (--list-packets 일이 먼저 해독되기 전에 실행되었지만 눈치 채지 못했습니다). 그래서 파일이 암호화되었는지 확인하는 새로운 방법을 만들었습니다.
Shule

답변:


58

나는 당신의 똑같은 보트에 있습니다 (우분투가 아닌 페도라에서 일했습니다). 다음은 내가 발견 한 명백한 해결책입니다.

echo your_password | gpg --batch --yes --passphrase-fd 0 your_file.gpg

설명 : 전달 0--passphrase-fd파일이 아닌 STDIN에서 읽습니다. 따라서 암호문을 파이핑하면 --passphrase-fd지정된 암호 문자열을 사용할 수 있습니다.


16
--batch --yes위의 내용을 추가 하면 나를 위해 일했습니다.
Ryan Tuck

1
그러나 gpg에 파이프 된 데이터를 암호화하려면 문제가 발생합니다 (예 :) echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpg. 이 문제를 어떻게 해결합니까?
콘 - F-사용

2
글쎄, gpg의 우분투 버전에서는 echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpg작동하는 것 같습니다.
콘 - F-사용

1
나는 여기 Inappropriate ioctl for device와없이 --batch(gpg (GnuPG) 2.1.18에서) 점점지고 있습니다.
Nico Schlömer

2
@RyanGriggs 나는 그렇게 생각하지 않습니다. echo "hello" | cat그리고 echo "hello"| cat모두 동일한 문자열을 얻을 수 있습니다.
Torsten Bronger

36

2017-12-04로 업그레이드되었습니다. (암호 프롬프트를 방지하기 위해 --batch 추가)

--batch옵션 을 추가해야 할 수도 있습니다 .

의 버전 2부터는 프롬프트가 표시되지 않도록 GPG옵션 --batch이 필요합니다.

$ gpg --version
gpg (GnuPG) 2.1.18
libgcrypt 1.7.6-beta
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /home/user /.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

견딜 수 없는:

$ newdir=$(mktemp -d)
$ cd $newdir
$ seq 1 10 | gpg -c --batch --passphrase 1234 -o file.gpg -
$ ls -ltr
total 4
-rw-r--r-- 1 user  user  91 Dec  4 15:42 file.gpg
$ hd file.gpg 
00000000  8c 0d 04 07 03 02 ea fa  d0 d3 2b 9a ea 06 df d2  |..........+.....|
00000010  4a 01 ed 50 74 ff 27 45  0e 6c 94 74 db e9 8a a5  |J..Pt.'E.l.t....|
00000020  03 9f 67 a0 73 97 e9 15  6b 56 a0 f0 88 71 85 a8  |..g.s...kV...q..|
00000030  dc 41 71 9f fa 3b f9 9d  af ac 80 eb f4 f7 28 19  |.Aq..;........(.|
00000040  9f be 75 47 e6 d8 00 3e  f6 60 f1 00 5e 63 57 ef  |..uG...>.`..^cW.|
00000050  14 c3 4b 20 ff 94 03 03  c1 fc 98                 |..K .......|
0000005b

좋은 소리! 물론 지금:

$ gpg -d --batch --passphrase 1234 file.gpg
gpg: AES encrypted data
gpg: encrypted with 1 passphrase
1
2
3
4
5
6
7
8
9
10

-d매개 변수가 주어 지지 않지만 (SO의 질문과 동일한 구문), 해독 된 데이터 file.gpg는 new로 추출됩니다 file.

$ gpg --batch --passphrase 1234 file.gpg
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
gpg: AES encrypted data
gpg: encrypted with 1 passphrase

$ ls -ltr
total 8
-rw-r--r-- 1 user  user  91 Dec  4 15:42 file.gpg
-rw-r--r-- 1 user  user  21 Dec  4 15:44 file

$ cat file
1
2
3
4
5
6
7
8
9
10

이것은 잘 작동합니다!

$ cd -
$ rm -fR $newdir
$ unset newdir

"gpg : gpg-agent를이 세션에서 사용할 수 없습니다"라는 경고가 표시되지 않으므로 에이전트에 암호가 저장되어 있습니까?
Asfand Qazi

@AsfandYarQazi 아니요, 암호는 명령 줄에 입력됩니다.
F. Hauri

이 답변은 저에게 효과적이었습니다. gpg 1.4.16의 우분투. 이 --passphrase매개 변수는 일괄 작업에 사용되며 암호를 묻지 않습니다.
Trevor Sullivan

성가신 gpg 에이전트가 암호문을 캐싱하고 있기 때문에 이것이 작동하는 것처럼 보일 수 있습니다. 시스템을 완전히 재부팅하고 새로 시작하거나 잘못된 --passphrase 5678 (잘못된 암호)을 입력하십시오.
yahermann

@yahermann : 그냥 후 지금 시도 unset GPG_AGENT_INFO조차 GPG_AGENT_INFO=/dev/null,이 작업 (계속) ... 어쩌면 반환하기는 $GPG_AGENT_INFO도움이 될 수 있습니다!? (알려주세요. 답변 해 주시면 수정하겠습니다!)
F. Hauri

22

GPG 버전 2.x 위해 당신은 사용할 필요가 없습니다 --batch만,

--pinentry-mode loopback  

--passphrase& 와 함께 작동하며 --passphrase-file파일 이름이 충돌하는 경우 새 정보를 입력 할 수 있습니다. 예를 들면 다음과 같습니다.

gpg --pinentry-mode loopback --passphrase-file=file encrypted.gpg

...
File 'encrypted' exists. Overwrite? (y/N)n
Enter new filename: f2

그렇지 --batch않으면 빨리 실패 할 것입니다....failed: File exists

(Debian Stable / Stretch의 gpg 2.1.18에서 테스트되었습니다. 중요한 --passphrase옵션 을 무시하는이 동작은 실제로 버그가 아닌 경우 버그 여야합니다)


1
이것은 gpg (GnuPG) 2.2.4의 Ubuntu 18.04 Bionic에서도 잘 작동합니다.
디스어셈블러

이것은 homebrew와 함께 gpg를 설치 한 후 MacOS에서 작동합니다
Joel

15

gpg2를 사용하는 것 같습니다. --batch옵션도 던져야 합니다. (이것을 스크립트에 추가 할 계획이라면 --no-tty아마도 에 추가하고 싶을 것입니다 --yes.)


3
1.4입니다. --batch를 사용해도 아무런 효과가 없습니다.
Omid

죄송합니다. @Nima. 무엇을 말해야할지 모르겠습니다. GnuPG v1.4를 사용하면 해당 옵션 중 하나를 사용하여 암호를 전달하기 위해 다른 작업을 수행 할 필요가 없습니다.
rsaw

@rsaw는 암호 프롬프트 (그리고 약간 덜 우아한 echo / STDIN 옵션)를 방지하는 데 도움이되었습니다.
ryanm

-일괄 창에서도 도움이되었습니다. 우후.
Sin

9

나를 위해 "--no-use-agent"를 추가하면 "gpg (GnuPG) 1.4.16"에 대해이 문제가 해결되었습니다.

date > foo
echo pass > passphrase
# w/o --no-use-agent
> rm -f foo.gpg; gpg --cipher-algo aes256 --output foo.gpg --passphrase-file ./passphrase --batch --yes --symmetric foo
gpg: gpg-agent is not available in this session
gpg: can't query passphrase in batch mode
gpg: error creating passphrase: invalid passphrase
gpg: symmetric encryption of `foo' failed: invalid passphrase


> rm -f foo.gpg; gpg --cipher-algo aes256 --output foo.gpg --passphrase-file ./passphrase --batch --yes --no-use-agent --symmetric foo
> ls -al
total 20
drwxr-xr-x  2 root root 4096 Aug 22 13:59 .
drwx------ 18 root root 4096 Aug 22 13:58 ..
-rw-r--r--  1 root root   30 Aug 22 13:58 foo
-rw-r--r--  1 root root  103 Aug 22 13:59 foo.gpg
-rw-r--r--  1 root root    5 Aug 22 13:58 passphrase

8

gpg (GnuPG) 2.2.7을 사용하는 경우 매뉴얼 페이지에 따라

-암호 문구 -fd n

파일 디스크립터 n에서 비밀번호 문구를 읽으십시오. 파일 디스크립터 n에서 첫 번째 행만 읽습니다. n에 0을 사용하면 STDIN에서 암호를 읽습니다. 암호문이 하나만 제공되는 경우에만 사용할 수 있습니다.

--passphrase-file 파일

파일 파일에서 비밀번호 문구를 읽으십시오. 파일 파일에서 첫 번째 줄만 읽습니다. 암호문이 하나만 제공되는 경우에만 사용할 수 있습니다. 다른 사용자가이 파일을 읽을 수 있다면 파일에 저장된 암호는 보안에 문제가됩니다. 이 옵션을 피할 수 있으면 사용하지 마십시오.

-암호 문자열

문자열을 암호로 사용하십시오. 암호문이 하나만 제공되는 경우에만 사용할 수 있습니다. 분명히 이것은 다중 사용자 시스템에서 매우 의심스러운 보안입니다. 이 옵션을 피할 수 있으면 사용하지 마십시오.

--pinentry-mode loopback일하기 위해 추가

버전 2.0부터이 암호는 --batch 옵션도 제공 한 경우에만 사용됩니다. 버전 2.1부터 --pinentry-mode도 루프백으로 설정해야합니다.

예를 들면 다음과 같습니다.

gpg --batch --yes --passphrase="pw" --pinentry-mode loopback -o out -d in

--passphrase ... 옵션이 작동 하려면 --batch--pinentry-mode loopback옵션 이 모두 필요합니까? v.2.1.18에서 정보 페이지는 배치 및 핀 텐트 리가 필요하다는 것과 동일한 내용 (맨 페이지는 아님)을 말하지만 여전히 --pinentry 와만 작동합니다 ... v.2.2.7에 실제로 필요한 경우 말도지고, 개발자는 목적에 심각한 버그를 소개합니다
Xen2050

4

그것은 나를 위해 마술처럼 작동했습니다.

echo "YOUR_PASS_PHRASE" | gpg --batch --yes  --passphrase-fd 0 /home/somewhere/your_file.pgp

오류 : gpg: no valid OpenPGP data found. gpg: processing message failed: eof. 어떤 아이디어?
Gabriel Staples

3
read -sp "Enter passphrase: " pass
echo "${pass}" | gpg --batch --no-tty --yes --passphrase-fd 0 --symmetric -o /path/to/saved/file.jpg.gpg /path/to/file.jpg
echo "${pass}" | gpg --batch --no-tty --yes --passphrase-fd 0 --decrypt -o /path/to/decrypted/file.jpg /path/to/encrypted/file.jpg.gpg

2

시도해 보셨습니까?

gpg --batch --passphrase-fd 0 --decrypt-files *.gpg
gpg --passphrase-fd 0 1234 file.gpg 

출처 : 여기


1

암호를 명령 줄에 전달하는 매우 안전한 방법은 다음과 같습니다.

gpg --passphrase-file <(echo password) --batch --output outfile -c file

이 작업은 "echo"명령을 생성하고 파일 디스크립터를 경로 이름으로 gpg에 전달하는 것입니다 (예 : / dev / fd / 63). gpg는 거기서 키를 읽습니다. 그 동안 echo 명령은 병렬로 실행되고 즉시 종료되어 fd의 버퍼에 키를 남겨 두어야합니다.

이점은 다음과 같습니다.

  • gpg 명령의 명령 행에 비밀번호가 없습니다.
  • 반향이 짧습니다. 사실, 그것은 거의 즉각적이어야한다
  • 암호는 디스크에 상주하지 않으며 삭제할 파일이 없으며 명령이 중단되면 남은 부분이 없습니다.

1

우분투에서 gpg가 $ DISPLAY가 설정되어 있는지 암호를 묻고 설정하지 않으면 명령 줄에서 암호를 가져 오는 것을 믿지 않습니다. 이것은 예상대로 작동합니다.

DISPLAY=    gpg --symmetric --passphrase pass --batch

과잉 엔지니어링의 또 다른 예라고 생각합니다.


1

다음 은 추가 지원 이 필요한 stackoverflow 답변에 대한 링크입니다 . 대량의 암호 해독 / 암호화를 수행하는 프로젝트가 있는데 암호 구문에 대해 GnuPG 가 매우 엄격 하기 때문에 드문 경우에만 작동 하는 어려운 방법을 배웠습니다 . 대신 옵션을보다 안정적으로 고려하십시오 .--passphrase--passphrase-fd

스크립트 는 옵션 을 적절하게 사용하며 Travis-CI--passphrase -fd 를 통해 공개적으로 테스트되었으며 해당 로그를 실제로 확인할 수 있습니다.

이제 여기에 예제 코드를 제공하지 않고 답변에 대한 링크를 게시하지 않을 것이므로 다음과 같이 사용할 수있는 업데이트 된 "독립형"스크립트가 있습니다.

#!/usr/bin/env bash
# Set some variables for easy modding
Var_fd='9'
Var_pass="/path/to/passphrase.file"
Var_gpg_opts="--passphrase-fd ${Var_fd} --decrypt"
Var_output_location="out.txt"
Arr_string=( "$@" )
# Open file descriptor and shove the passphrase file into it
if [ -f "${Var_pass}" ]; then
    exec ${Var_fd}<"${Var_pass}"
else
    exec ${Var_fd}<(echo "${Var_pass}")
fi
# Pipe input array though gpg and append to output file
cat <<<"${Arr_string[*]}" | $(which gpg) ${Var_gpg_opts} >> ${Var_output_location}
# Do not forget to close the file descriptor
exec ${Var_fd}>&-

위는이 GitHub의에서 보호 링크 된만큼 화려한 것은 아니지만 해야 이 글의 시작 부분에 링크 대답보다 더 많은 기능합니다.

행복한 해킹.


1

man gpg에서 언급했듯이 다음 옵션을 사용할 수 있습니다

--pinentry-mode mode pinentry 모드를 mode로 설정하십시오. mode에 허용되는 값은 다음과 같습니다.

          default
                 Use the default of the agent, which is ask.

          ask    Force the use of the Pinentry.

          cancel Emulate use of Pinentry's cancel button.

          error  Return a Pinentry error (``No Pinentry'').

          loopback
                 Redirect Pinentry queries to the caller.  Note that in contrast to Pinentry the user is not prompted again if he enters a bad password.

따라서 gpg의 기본 동작은이 사용자 에이전트 모드를 "--pinentry-mode loopback"으로 변경하면 비밀번호 문구를 입력하라는 메시지를 표시하는 것입니다. 완벽하게 작동합니다. 완전한 명령

gpg --pinentry-mode loopback --passphrase <passphrase> -d <file to decrypt>

0

내가 리눅스 머신에서 작업하는 것을 발견 한 간단한 방법은 다음과 같다. 1) gpg로 키 가져 오기 : => shell> gpg —import private_key.key

2) outfile 이름을주는 해독 : => shell> gpg —output -d

2.1) 위의 명령을 내리면 문구를 입력하라는 메시지가 표시됩니다. 이 문구를 입력하면 gpg 파일이 해독됩니다.


0
gpg2 -se --passphrase yourpassword --batch --yes -r user@example.com filename

1
이것이 왜 문제를 해결해야하는지 설명 할 수 있다면 좋을 것입니다.
Zanna

1
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다 . 지금 질문하는 사람뿐만 아니라 앞으로 독자들에게 질문에 대답하고 있음을 기억하십시오! 제발 편집 설명을 추가하고, 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Toby Speight

0

끝에 ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

(아마도 새로운) 파일의 끝에 넣으십시오 ~/.gnupg/gpg-agent.conf:

allow-loopback-pinentry

그런 다음이 명령을 실행하십시오.

echo RELOADAGENT | gpg-connect-agent

이제 비밀번호를 묻지 않고이를 실행할 수 있습니다.

echo "$1" | gpg2 --trust-model always --clearsign --batch --no-tty --quiet --no-verbose --yes -u $2 --digest-algo SHA512
--s2k-digest-algo SHA512 --passphrase "$3"

$ 1은 암호화 할 텍스트이고, $ 2는 사용자 ID이고 $ 3은 암호입니다.

참고 : 왜 작동하는지 기억할 수 없지만 작동합니다. 자세한 내용을 알고 있다면 여기에서 편집하고 삽입하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.