GPG decrypting/encrypting 字符串仅在内存中
GPG decrypting/encrypting string in memory only
背景:
我有一个 GPG 加密机密,不能将其写入未加密的文件。
假设它住在 ~/.secrets/.mysecret.gpg
.
运行 gpg ~/.secrets/.mysecret.gpg
解密 .mysecret.gpg
并将其保存到文件 .mysecret
(不可接受)。 运行 gpg -d ~/.secrets/.mysecret.gpg
仅打印解密的秘密(谢谢 JustinC
)。
为了避免 stderr 并将其编码为 base64 以供我使用,我编写了这个 shell 函数作为一种方便的方法:
keyreader() {
local gpg_file=
echo -n "$(gpg -d "$gpg_file" 2> /dev/null)" | base64
}
运行 keyreader ~/.secrets/.mysecret.gpg
,输入加密secret密码后,打印出base64编码,解密secret,无输出文件。
问题:
当 gpg -d ~/.secrets/.mysecret.gpg
为 运行 时,gpg 是否会写入包含未加密 .mysecret
的 tmp 文件?
为什么 gpg 不输出文件,.mysecret
,当我使用上面的语法时? (答案:使用了 -d
标志,再次感谢 JustinC
)。
假设我在 运行 命令之前使用了适当的 $HISTIGNORE
标识符,我如何才能将命令行中的字符串加密为 .gpg AES256 加密文件而无需首先将其未加密写入文件?
对于第 3 季度,类似于:
$ echo "secret info" | gpg --cipher-algo AES265 -c -o secrets_file.txt.gpg
而不是:
$gpg --cipher-algo AES265 -c secrets_file.txt
您确定gpg -d ~/.secrets/.mysecret.gpg
将解密的文件写入磁盘吗?它不适合我。
您可以使用 strace 检查是否创建了临时文件。
我有时会通过键入以下内容来防止在 bash 历史记录中留下密码:
PP=`cat`
secret-info ENTER Ctrl+D
echo $PP # will print "secret-info"
secret-info 字符串被发送到 cat 程序,而不是 shell,因此 bash 不会将其保存到历史文件。
再次感谢@JustinC,感谢您的回答。
为了完整起见,这里是我对 encrypting/decrypting 仅在内存中的字符串的解决方案:
加密:
# notice the space before echo here
# it is the default $HISTIGNORE flag which can be set in the ~/.bashrc
# it keeps this line from being written to the ~/.bash_history file
echo -n 'your secrets here' | gpg -c > ~/.secrets/.mysecret.gpg
# Enter passphrase:
解密:
# 2> /dev/null: skip printing strerr
gpg -d ~/.secrets/.mysecrets.gpg 2> /dev/null
注意:如果您收到错误“设备的 ioctl 不合适”,您可能 运行 在 WSL 上,这可能对您有帮助:
# https://d.sb/2016/11/gpg-inappropriate-ioctl-for-device-errors
echo -e "use-agent\npinentry-mode loopback" >> ~/.gnupg/gpg.conf
echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf
echo RELOADAGENT | gpg-connect-agent
背景:
我有一个 GPG 加密机密,不能将其写入未加密的文件。
假设它住在 ~/.secrets/.mysecret.gpg
.
运行 gpg ~/.secrets/.mysecret.gpg
解密 .mysecret.gpg
并将其保存到文件 .mysecret
(不可接受)。 运行 gpg -d ~/.secrets/.mysecret.gpg
仅打印解密的秘密(谢谢 JustinC
)。
为了避免 stderr 并将其编码为 base64 以供我使用,我编写了这个 shell 函数作为一种方便的方法:
keyreader() {
local gpg_file=
echo -n "$(gpg -d "$gpg_file" 2> /dev/null)" | base64
}
运行 keyreader ~/.secrets/.mysecret.gpg
,输入加密secret密码后,打印出base64编码,解密secret,无输出文件。
问题:
当
gpg -d ~/.secrets/.mysecret.gpg
为 运行 时,gpg 是否会写入包含未加密.mysecret
的 tmp 文件?为什么 gpg 不输出文件,
.mysecret
,当我使用上面的语法时? (答案:使用了-d
标志,再次感谢JustinC
)。假设我在 运行 命令之前使用了适当的
$HISTIGNORE
标识符,我如何才能将命令行中的字符串加密为 .gpg AES256 加密文件而无需首先将其未加密写入文件?
对于第 3 季度,类似于:
$ echo "secret info" | gpg --cipher-algo AES265 -c -o secrets_file.txt.gpg
而不是:
$gpg --cipher-algo AES265 -c secrets_file.txt
您确定gpg -d ~/.secrets/.mysecret.gpg
将解密的文件写入磁盘吗?它不适合我。
您可以使用 strace 检查是否创建了临时文件。
我有时会通过键入以下内容来防止在 bash 历史记录中留下密码:
PP=`cat`
secret-info ENTER Ctrl+D
echo $PP # will print "secret-info"
secret-info 字符串被发送到 cat 程序,而不是 shell,因此 bash 不会将其保存到历史文件。
再次感谢@JustinC,感谢您的回答。
为了完整起见,这里是我对 encrypting/decrypting 仅在内存中的字符串的解决方案:
加密:
# notice the space before echo here
# it is the default $HISTIGNORE flag which can be set in the ~/.bashrc
# it keeps this line from being written to the ~/.bash_history file
echo -n 'your secrets here' | gpg -c > ~/.secrets/.mysecret.gpg
# Enter passphrase:
解密:
# 2> /dev/null: skip printing strerr
gpg -d ~/.secrets/.mysecrets.gpg 2> /dev/null
注意:如果您收到错误“设备的 ioctl 不合适”,您可能 运行 在 WSL 上,这可能对您有帮助:
# https://d.sb/2016/11/gpg-inappropriate-ioctl-for-device-errors
echo -e "use-agent\npinentry-mode loopback" >> ~/.gnupg/gpg.conf
echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf
echo RELOADAGENT | gpg-connect-agent