Cách sử dụng dòng lệnh gpg để kiểm tra cụm mật khẩu có đúng không


88

Tôi đang cố gắng tự động hóa các bản sao lưu duplicity, nhưng khi kiểm tra kết quả, tôi nhận được

gpg: giải mã khóa công khai không thành công: cụm mật khẩu không hợp lệ

Tôi muốn kiểm tra xem cụm mật khẩu tôi đang sử dụng có thực sự là cụm mật khẩu được liên kết với khóa bí mật gpg tương ứng hay không, nhưng tôi không thể thấy trong tùy chọn dòng lệnh gpg thông báo "Không mã hóa hoặc giải mã bất kỳ thứ gì. Chỉ cần xác nhận Tôi đang sử dụng cụm mật khẩu phù hợp. "

Điều này cho thấy rằng có thể tôi (một lần nữa) đang hiểu lầm Gnu Privacy Guard. (Nó có xu hướng chế nhạo tôi cho đến khi tôi khóc.)

Có hợp lý không khi yêu cầu gpg xác minh cụm mật khẩu? Nếu vậy, làm thế nào?

Câu trả lời:


114

Không có phương pháp cài sẵn nào để thực hiện việc này, nhưng nó đủ đơn giản để tạo một bài kiểm tra không sửa đổi bất cứ điều gì và cho phép bạn chỉ cần kiểm tra cụm mật khẩu của mình.

Bạn không chỉ định, vì vậy tôi sẽ giả sử bạn đang sử dụng phiên bản GnuPG nhỏ hơn v2 và đang sử dụng Linux với Bash cho trình thông dịch dòng lệnh của bạn.

Tôi sẽ đưa ra lệnh ở đây và bên dưới tôi sẽ giải thích những gì mỗi phần thực hiện - (lưu ý: phần sau dành cho dòng GnuPG phiên bản 1, xem bên dưới cho dòng GnuPG v2)

echo "1234" | gpg --no-use-agent -o /dev/null --local-user <KEYID> -as - && echo "The correct passphrase was entered for this key"

Điều đó làm là đầu tiên, viết một số văn bản để ký vào GnuPG echo "1234" |- bởi vì chúng tôi không thực sự muốn ký bất cứ điều gì, đây chỉ là một bài kiểm tra, vì vậy chúng tôi sẽ ký một số văn bản vô dụng.

Tiếp theo, chúng tôi yêu cầu gpg không sử dụng tác nhân chính với --no-use-agent; điều này rất quan trọng sau này vì tùy thuộc vào tác nhân chính của bạn, nó có thể không trả về "0" khi thành công và đó là tất cả những gì chúng tôi muốn làm - xác minh thành công của cụm mật khẩu của bạn.

Tiếp theo, chúng tôi yêu cầu gpg đưa dữ liệu đã ký trực tiếp vào /dev/nulltệp, nghĩa là chúng tôi loại bỏ nó và không ghi kết quả vào thiết bị đầu cuối - LƯU Ý: nếu bạn không sử dụng một số biến thể của Linux / Unix, tệp này có thể không tồn tại. Trên windows, bạn có thể chỉ cần cho phép nó ghi dữ liệu đã ký vào màn hình bằng cách bỏ qua -o /dev/nullphần đó.

Tiếp theo, chúng tôi chỉ định khóa chúng tôi muốn thực hiện kiểm tra bằng cách sử dụng --local-user 012345. Bạn có thể sử dụng KeyID để có độ đặc hiệu cao nhất hoặc sử dụng tên người dùng, tùy theo nhu cầu của bạn.

Tiếp theo, chúng tôi chỉ định -as, bật chế độ đầu ra ascii và đặt chế độ ngữ cảnh cho việc ký. Sau -đó, chỉ yêu cầu GnuPG lấy dữ liệu được ký từ standard-in, đây là phần đầu tiên của lệnh chúng tôi đã đưa ra echo "1234" |.

Và cuối cùng, chúng ta có && echo "A message that indicates success"- "&&" có nghĩa là, nếu lệnh trước đó thành công, hãy in thông báo này. Điều này chỉ được thêm vào để rõ ràng, bởi vì sự thành công của lệnh trên nếu không sẽ được chỉ ra bởi không có đầu ra nào cả.

Tôi hy vọng điều đó đủ rõ ràng để bạn hiểu điều gì đang xảy ra và cách bạn có thể sử dụng nó trong quá trình kiểm tra mà bạn muốn thực hiện. Nếu bất kỳ phần nào chưa rõ ràng hoặc bạn chưa hiểu, tôi sẽ sẵn lòng làm rõ. Chúc may mắn!

[EDIT] - Nếu bạn đang sử dụng GnuPG v2, lệnh trên sẽ cần được sửa đổi một chút, như sau:

echo "1234" | gpg2 --batch --passphrase-fd 1 -o /dev/null --local-user <KEYID> -as - && echo "The correct passphrase was entered for this key"

Lý do là, GnuPG v2 mong muốn cụm mật khẩu được truy xuất thông qua một tác nhân, vì vậy chúng tôi không thể vô hiệu hóa việc sử dụng tác nhân với --no-use-agentvà có hiệu quả mong muốn; thay vào đó, chúng ta cần nói với GnuPG v2 rằng chúng ta muốn chạy quy trình "hàng loạt" và truy xuất cụm mật khẩu từ STDIN (tiêu chuẩn trong) bằng cách sử dụng tùy chọn --passphrase-fd 1.


11
Điều này không hoạt động với gpg2, vì nó luôn yêu cầu một tác nhân. Ngoài ra, tác nhân ncurses bằng cách nào đó bị nhầm lẫn bởi đầu vào đường ống. Vì vậy, tôi mới sử dụng gpg --local-user <KEYID> -as. Điều này chỉ cho phép nhân viên yêu cầu cụm mật khẩu và cho bạn biết nếu nó đúng (Sau đó không làm gì cả).
BubuIIC

1
Bạn đúng là BubullC, đối với hầu hết các phần; với sự sửa đổi nhỏ đối với các tùy chọn đã thông qua, bạn có thể có kết quả tương tự bằng cách sử dụng gpg2. Tôi đã sửa đổi câu trả lời của mình để hỗ trợ sự khác biệt giữa gpg và gpg2.
kylehuff

4
Hãy thử cái này cho GnuPG 2.1:gpg -o /dev/null --local-user <KEYID> -as <(echo 1234) && echo "The correct passphrase was entered for this key"
starfry

6
Đối với tôi trên MacOS 10.12.6, không có biến thể nào nhắc cụm mật khẩu và trả về thông báo thành công bất kể.
Stan James

1
--passphrase-fd 1? đọc từ stdout? Này làm việc cho tôi: gpg2 -aso - <(echo 1234); echo $?. Sử dụng echo RELOADAGENT | gpg-connect-agentđể quên mật khẩu.
x-yuri

20

Đây là dòng lệnh ngắn hơn để kiểm tra xem cụm mật khẩu có ổn không:

gpg --export-secret-keys -a <KEYID> > /dev/null && echo OK

3

Đối với tôi, cách đơn giản để kiểm tra cụm mật khẩu là sử dụng tốc gpg --passwdký. Nó cố gắng thay đổi cụm mật khẩu và bước là xác nhận cụm mật khẩu cũ, sau đó bạn có thể nhấp vào 'hủy' trên lời nhắc cụm mật khẩu mới và điều này sẽ giữ nguyên cụm mật khẩu.

gpg --passwd <your-user-id>

2

Cảnh báo không sử dụng echo gpg -o /dev/nulltheo gợi ý của câu trả lời hàng đầu ở đây. Điều này sẽ khiến / dev / null có quyền không hợp lệ và làm hỏng /dev/nulltệp. Bạn có thể xác minh quyền của tệp / dev / null khi chạy lệnh này để chứng minh điều này.

Bạn có thể sử dụng cái này:

echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user $KEY_ID --passphrase-fd 0 > /dev/null

Tôi cũng đã tạo tập lệnh bash cho điều này (Tập lệnh này đang làm việc với Centos 8). Tập lệnh này sẽ yêu cầu cụm mật khẩu, nếu nó không hợp lệ, nó sẽ tiếp tục yêu cầu nhập cụm mật khẩu hợp lệ. Ngoài ra, nếu bạn nhập sai hoặc KEY_ID không tồn tại làm đối số, nó cũng có thể xác thực điều đó:

#!/bin/bash
# usage ./gpgcron KEYID   | ./gpgcron 2B705B8B6FA943B1
script_path=$(dirname $(realpath -s $0))
script_name=$(basename -- "$0")
GPG_CACHE_BIN="/usr/libexec/gpg-preset-passphrase"
KEY_ID=$1
KEY_GRIP=$(gpg --with-keygrip --list-secret-keys $KEY_ID | grep -Pom1 '^ *Keygrip += +\K.*')
RETVAL=$?
if [[ $RETVAL -ne 0 || -z $KEY_ID ]]; then
    echo "Please provide correct KEY_ID. Example ./$script_name KEY_ID"
    exit 1
fi

export GPG_TTY=$(tty)

function set_gpg_cachepass {
    read -s -p "[$script_name | input]: Enter passphrase to cache into gpg-agent: " PASSPHRASE; echo
    $GPG_CACHE_BIN -c $KEY_GRIP <<< $PASSPHRASE
    RETVAL=$?
    echo "[$script_name | info ]: gpg-preset-passphrase return code: [$RETVAL]"
    if [ $RETVAL = 0 ]; then
        echo "[$script_name | info ]: A passphrase has been set and cached in gpg-agent"
        echo "[$script_name | info ]: Paraphrase set return code: [$RETVAL]"
        gpg_validatepass
    else
        echo "[$script_name | info ]: Unsuccessful error occured: [$RETVAL]"
        set_gpg_cachepass
    fi
}

function gpg_validatepass {
    echo "[$script_name | info ]: Validating passphrase cached in gpg-agent ..."
    echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user $KEY_ID --passphrase-fd 0 > /dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo "[$script_name | info ]: OK, valid passphrase has been cached in gpg-agent"
    else
        echo "[$script_name | info ]: Warning, invalid passphrase or no passphrase is cached in gpg-agent"
        set_gpg_cachepass
    fi
}

RES=$(echo "KEYINFO --no-ask $KEY_GRIP Err Pmt Des" | gpg-connect-agent | awk '{ print $7 }')
if [ "$RES" == "1" ]; then
    echo "[$script_name | info ]: OK, passphrase is already cached in gpg agent for KEY_ID of [$KEY_ID]"
    gpg_validatepass
else
    echo "[$script_name | info ]: Warning, no passphrase is cached in gpg agent for KEY_ID of [$KEY_ID]"
    set_gpg_cachepass
fi

Đầu ra mẫu nếu không có mật khẩu nào được lưu trong bộ nhớ đệm gpg-agent:

[root@earth gpg]# ./gpgcron 2B705B8B6FA943B2
[gpgcron | info ]: Warning, no passphrase is cached in gpg agent for KEY_ID of [2B705B8B6FA943B2]
[gpgcron | input]: Enter passphrase to cache into gpg-agent:

Đầu ra mẫu nếu cụm mật khẩu không hợp lệ được nhập (nó sẽ tiếp tục hỏi):

[root@earth gpg]# ./gpgcron 2B705B8B6FA943B2
[gpgcron | info ]: OK, passphrase is already cached in gpg agent for KEY_ID of [2B705B8B6FA943B2]
[gpgcron | info ]: Validating passphrase cached in gpg-agent ...
gpg: signing failed: Bad passphrase
gpg: signing failed: Bad passphrase
[gpgcron | info ]: Warning, invalid passphrase or no passphrase is cached in gpg-agent
[gpgcron | input]: Enter passphrase to cache into gpg-agent:

Đầu ra mẫu nếu cụm mật khẩu hợp lệ được nhập:

[gpgcron | input]: Enter passphrase to cache into gpg-agent:
[gpgcron | info ]: gpg-preset-passphrase return code: [0]
[gpgcron | info ]: A passphrase has been set and cached in gpg-agent
[gpgcron | info ]: Paraphrase set return code: [0]
[gpgcron | info ]: Validating passphrase cached in gpg-agent ...
[gpgcron | info ]: OK, valid passphrase has been cached in gpg-agent

Khi cụm mật khẩu hợp lệ được lưu vào bộ nhớ đệm, lần sau khi bạn chạy tập lệnh này, nó sẽ không yêu cầu bạn nhập cụm mật khẩu. Vì vậy, kịch bản này đưa ra giải pháp cho câu hỏi của bạn; "Chỉ cần xác nhận rằng tôi đang sử dụng cụm mật khẩu phù hợp"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.