使用 gpg 编辑对称加密文件

使用 gpg 编辑对称加密文件

我正在编写一个脚本,让用户使用 vim 编辑 gpg 加密文件。我已经使用非对称加密完成了此操作,如下所示:

#!/bin/sh

# TODO: add support for symmetric encryption

if [ $# -ne 1 ]; then
    echo "Needs two arguments, exiting"
    exit
else
    file="$1"
fi

if [ -z "$EDITOR" ]; then
    editor="vim"
else
    editor=$EDITOR
fi

tmp_file="$(mktemp)"

gpg -d --yes -o "$tmp_file" "$file"

gpg_exit=$?

if [ $gpg_exit -ne 0 ]; then
    echo "Decryption failed, exiting"
    rm $tmp_file
    exit
fi

original_mod_time=$(stat -c %Y "$tmp_file")

$editor "$tmp_file"

new_mod_time=$(stat -c %Y "$tmp_file")

if [ "$original_mod_time" -ne "$new_mod_time" ]; then
    gpg -o "$file" -e --yes -r recipient "$tmp_file"

    gpg_exit=$?

    if [ $gpg_exit -ne 0 ]; then
        echo "Encryption failed, exiting"
    fi
fi

shred -u "$tmp_file"

但是,当我想编写一个支持对称加密的脚本时,我不希望让用户输入两次密码,因为这可能会导致输入错误,而且很烦人。因此,我必须以某种方式存储密码。我可以,read passphrase但运行gpg --passphrase $passphrase并不安全,因为任何进程都可以读取命令行参数。还有其他方法可以做到这一点吗?我不想将密码存储在文件中。

另外,有没有办法可以编写这样的脚本而无需创建任何文件(没有临时文件)?这样会更安全。像这样的东西会很好: gpg -d $file | vim --some-option | gpg -c -o $file

答案1

有一些 vim 插件可用于此目的,例如vim‑gnupg用于透明编辑 gpg 加密文件的插件。


没有太多选项可以隐藏命令行参数中的秘密。这些都是有效的,它们通常需要从 stdin 读取。我首选的是临时文件描述符:

read -s secret
cat <( s=$secret printenv s )
# cmdline only shows pseudo-file path like  
cat /dev/fd/67

如果添加-类似内容,Vim 可以从 stdin 读取gpg -d $file | vim -

:w !gpg -c -o $file您可以使用vim 内部将vim 的输出写入另一个命令(对于其他人将使用的东西没有用),但是如果没有像这个答案这样的一些尴尬的流操作,您就无法在管道中使用 vim:https://stackoverflow.com/a/10686895/7411885. 你也可以vipe使用更多工具将输出到管道。

您可以在配置中禁用 vim 的临时文件.vimrc

set nobackup       "no backup files
set nowritebackup  "only in case you don't want a backup file while editing
set noswapfile     "no swap files

相关内容