在Bash脚本中自动化密码短语(steghide,gpg等)

时间:2014-08-15 17:30:28

标签: bash security scripting automation passwords

我一直在研究一系列bash脚本,我需要自动输入密码来批量处理文件和操作。

这不仅适用于一个程序,例如,有时需要为GPG完成,有时需要为steghide完成。

有一个特定的原因,我正在理解它背后的安全元素。这被考虑并被脚本的存储和工作方式所否定。

密码或密码通过命令行参数传递给脚本,密码/短语必须以编程方式重复多次。

以下是我在脚本中使用的示例:

for f in $dir
do
    steghide embed -cf $f -ef /path/to/secret.txt
done

然而,这只是交互式地询问每个图像: 输入密码: 重新输入密码短语:

对于目录中的每个图像,都会请求此密码,因此密码应该能够存储在变量中并重复使用。

我最近一直在使用steghide,但是也需要在以后使用GPG自动化密码短语,尽管这些方法不需要相同。

2 个答案:

答案 0 :(得分:1)

man steghide

   -p, --passphrase
          Use  the  string  following  this  argument  as the
          passphrase. If your passphrase contains whitespace,
          you  have  to enclose it in quotes, for example: -p
          "a very long passphrase".

man gpg

   --passphrase string
          Use  string  as  the  passphrase. This can only be used if only one
          passphrase is supplied. Obviously, this  is  of  very  questionable
          security  on  a multi-user system. Don't use this option if you can
          avoid it.

答案 1 :(得分:0)

公开未经测试,边缘粗糙,可以改进......但是这里是我的一些研究脚本的预览,这些脚本还没有被合并到其中一个GitHub项目中我正在写...绝对对下面的脚本运行shellcheck以捕获任何拼写错误。

#/usr/bin/env bash
Var_stego_out_dir="${1}"
Var_stego_in_dir="${2}"
Var_stego_cover_dir="${3}"
Var_passphrase_file="${4}"
Var_passphrase="${5}"
Var_auto_pass_length="${6:-64}"
Func_build_array_of_paths(){
    _dir="${1}"
    _arr="${2}"
    _file_extension_list="${3}"
    if [ -d "${_dir}" ] && [ "${#${_arr}[@]}" = "0" ]; then
        find "${_dir}" -xtype f | while read _path; do
            case "${_path##*.}" in
                ${_file_extension_list//,/|})
                    declare -ag "${_arr}+=( ${_path} )"
                ;;
            esac
        done
    fi
}
Func_enc_stego(){
     _cover_file="${1}"
     _enc_file="${2}"
     _pass_file="${3}"
     _output_file="${Var_stego_out_dir}/${_cover_file##*/}"
    if [ -f "${_cover_file}" ] && [ -f "${_enc_file}" ]; then
        _auto_passphrase="${Var_passphrase:-$(base64 /dev/random | tr -cd '[:print:]' head -c${Var_auto_pass_length})}"
         if ! [ -f "${_output_file}" ]; then
             steghide -p ${_auto_passphrase} -ef ${_enc_file} -cf ${_cover_file} -sf ${_output_file}
             cat <<<"### ${_output_file} ### ${_auto_passphrase}" >> "${_pass_file}"
         else
            steghide -p ${_auto_passphrase} -ef ${_enc_file} -cf ${_cover_file} -sf ${_output_file}_$(date -u +%s)
             cat <<<"### ${_output_file}_$(date -u +%s) ### ${_auto_passphrase}" >> "${_pass_file}"
        fi
    fi
}
Func_main(){
    ## Build array of file paths for cover file use
    Func_build_array_of_paths "${Var_stego_cover_dir}" "Arr_cover_list" "au,AU,bmp,BMP,jpeg,JPEG,wav,WAV"
    ## Build array of file paths for embed file use
    Func_build_array_of_paths "${Var_stego_in_dir}" "Arr_input_list" "gpg,GPG,txt,TXT"
    let _arr_input_count=0
    let _arr_cover_count=0
    until [ "${_arr_input_count}" = "${#Arr_input_list}" ]; do
        if [ -f "${Arr_cover_list[${_arr_cover_count}]}" ]; then
            Func_enc_stego "${Arr_cover_list[${_arr_cover_count}]}" "${Arr_input_list[${_arr_input_count}]}" "${Var_passphrase_file}"
            let _arr_cover_count++
            let _arr_input_count++
        elif  [ -f "${Arr_cover_list[$((${_arr_cover_count}-1))]}" ]; then
            Func_enc_stego "${Arr_cover_list[$((${_arr_cover_count}-1))]}" "${Arr_input_list[${_arr_input_count}]}" "${Var_passphrase_file}"
            let _arr_input_count++
            _arr_cover_count="$((${_arr_cover_count}-1))"
        if

    done
}
Func_main

在上面填写以下部分

script.sh "/path/to/stego_out_dir" "/path/to/stego_in_dir" "/path/to/stego_cover_dir" "/path/to/passphrase_file"
## or define static passphrase
#script.sh "/path/to/stego_out_dir" "/path/to/stego_in_dir" "/path/to/stego_cover_dir" "/path/to/passphrase_file" "passphrase"

注意如上所述以纯文本格式保存密码和文件是非常糟糕的做法,并且因为OP表示他们也在考虑GnuPG自动化,读者和OP的作者应该查找Perinoid_Pipes;特别是GnuPG_Gen_Key.sh脚本和函数,以Paranoid_Pipes.sh开头Func_dec_*为工作/测试的自动化涉及GnuPG密码的例子;并保护上述脚本编写的密码短语查找函数以Func_enc_*脚本中的Paranoid_Pipes.sh开头,用于mkfifo命令和结果命名管道如何用于自动加密大多数数据类型。提示第四个示例参数"/path/to/passphrase_file"将指向由链接脚本创建的加密命名管道,以使事情更安全; - )