答案 0 :(得分:26)
答案 1 :(得分:9)
我使用base64来克服同样的问题,即人们可以看到我的密码。
这是我做的 - 我创建了一个新的" db_auth.cfg"文件和创建的参数,其中一个是我的db密码。我为该文件设置了750的权限。
DB_PASSWORD=Z29vZ2xl
在我的shell脚本中,我使用了" source"命令获取文件,然后将其解码回来在我的脚本中使用。
source path_to_the_file/db_auth.cfg
DB_PASSWORD=$(eval echo ${DB_PASSWORD} | base64 --decode)
我希望这会有所帮助。
答案 2 :(得分:3)
虽然这不是内置的Unix解决方案,但我已经使用shell脚本为此实现了一个解决方案,该脚本可以包含在您正在使用的任何shell脚本中。这“应该”适用于符合POSIX标准的设置。完整描述可在github repo中获得 - > https://github.com/ahnick/encpass.sh。此解决方案将自动为您的脚本生成密钥,并将密钥和密码(或其他机密)存储在用户下的隐藏目录中(即〜/ .encpass)。
在您的脚本中,您只需要获取encpass.sh,然后调用get_secret方法。例如:
#!/bin/sh
. encpass.sh
password=$(get_secret)
为encpass.sh粘贴代码以便于查看:
#!/bin/sh
################################################################################
# Filename: encpass.sh
# Description: This script allows a user to encrypt a password (or any other
# secret) at runtime and then use it, decrypted, within another
# script. This prevents shoulder surfing passwords and avoids
# storing the password in plain text, which could inadvertently
# be sent to or discovered by an individual at a later date.
#
# This script generates an AES 256 bit symmetric key for each
# script (or user-defined label) that stores secrets. This key
# will then be used to encrypt all secrets for that script or
# label. encpass.sh sets up a directory (.encpass) under the
# user's home directory where keys and secrets will be stored.
#
# Subsequent calls to retrieve a secret will not prompt for a
# secret to be entered as the file with the encrypted value
# already exists.
#
# Author: Xan Nick
#
# Usage: . ./encpass.sh
# ...
# $password=$(get_secret)
################################################################################
checks() {
if [ -n "$ENCPASS_CHECKS" ]; then
return
fi
if [ ! -x "$(command -v openssl)" ]; then
echo "Error: OpenSSL is not installed or not accessible in the current path." \
"Please install it and try again." >&2
exit 1
fi
ENCPASS_HOME_DIR=$(get_abs_filename ~)/.encpass
if [ ! -d $ENCPASS_HOME_DIR ]; then
mkdir -m 700 $ENCPASS_HOME_DIR
mkdir -m 700 $ENCPASS_HOME_DIR/keys
mkdir -m 700 $ENCPASS_HOME_DIR/secrets
fi
if [ ! -z $1 ] && [ ! -z $2 ]; then
LABEL=$1
SECRET_NAME=$2
elif [ ! -z $1 ]; then
LABEL=$(basename $0)
SECRET_NAME=$1
else
LABEL=$(basename $0)
SECRET_NAME="password"
fi
ENCPASS_CHECKS=1
}
generate_private_key() {
KEY_DIR="$ENCPASS_HOME_DIR/keys/$LABEL"
if [ ! -d $KEY_DIR ]; then
mkdir -m 700 $KEY_DIR
fi
if [ ! -f $KEY_DIR/private.key ]; then
(umask 0377 && printf "%s" "$(openssl rand -hex 32)" > $KEY_DIR/private.key)
fi
}
get_private_key_abs_name() {
PRIVATE_KEY_ABS_NAME="$ENCPASS_HOME_DIR/keys/$LABEL/private.key"
if [ ! -f "$PRIVATE_KEY_ABS_NAME" ]; then
generate_private_key
fi
}
get_secret_abs_name() {
SECRET_ABS_NAME="$ENCPASS_HOME_DIR/secrets/$LABEL/$SECRET_NAME.enc"
if [ ! -f "$SECRET_ABS_NAME" ]; then
set_secret $1 $2
fi
}
get_secret() {
checks $1 $2
get_private_key_abs_name
get_secret_abs_name $1 $2
dd if=$SECRET_ABS_NAME ibs=1 skip=32 2> /dev/null | openssl enc -aes-256-cbc \
-d -a -iv $(head -c 32 $SECRET_ABS_NAME) -K $(cat $PRIVATE_KEY_ABS_NAME)
}
set_secret() {
checks $1 $2
get_private_key_abs_name
SECRET_DIR="$ENCPASS_HOME_DIR/secrets/$LABEL"
if [ ! -d $SECRET_DIR ]; then
mkdir -m 700 $SECRET_DIR
fi
echo "Enter $SECRET_NAME:" >&2
stty -echo
read -r SECRET
stty echo
echo "Confirm $SECRET_NAME:" >&2
stty -echo
read -r CSECRET
stty echo
if [ "$SECRET" = "$CSECRET" ]; then
printf "%s" "$(openssl rand -hex 16)" > \
$SECRET_DIR/$SECRET_NAME.enc
echo "$SECRET" | openssl enc -aes-256-cbc -e -a -iv \
$(cat $SECRET_DIR/$SECRET_NAME.enc) -K \
$(cat $ENCPASS_HOME_DIR/keys/$LABEL/private.key) 1>> \
$SECRET_DIR/$SECRET_NAME.enc
else
echo "Error: secrets do not match. Please try again." >&2
exit 1
fi
}
get_abs_filename() {
# $1 : relative filename
filename=$1
parentdir=$(dirname "${filename}")
if [ -d "${filename}" ]; then
echo "$(cd "${filename}" && pwd)"
elif [ -d "${parentdir}" ]; then
echo "$(cd "${parentdir}" && pwd)/$(basename "${filename}")"
fi
}
答案 3 :(得分:2)
答案 4 :(得分:1)
另一个解决方案,不考虑安全性(我还认为将凭据保存在另一个文件或数据库中更好)是使用gpg加密密码并将其插入脚本中。
我使用无密码的gpg密钥对,我保留在USB中。 (注意:导出此密钥对时,请不要使用--armor,以二进制格式导出它们。)
首先加密密码:
编辑:在此命令前放置一个空格,因此bash历史记录不会记录该空格。
echo -n "pAssw0rd" | gpg --armor --no-default-keyring --keyring /media/usb/key.pub --recipient someone@mail.com --encrypt
这将在标准输出中打印出gpg加密密码。复制整个邮件并将其添加到脚本中:
password=$(gpg --batch --quiet --no-default-keyring --secret-keyring /media/usb/key.priv --decrypt <<EOF
-----BEGIN PGP MESSAGE-----
hQEMA0CjbyauRLJ8AQgAkZT5gK8TrdH6cZEy+Ufl0PObGZJ1YEbshacZb88RlRB9
h2z+s/Bso5HQxNd5tzkwulvhmoGu6K6hpMXM3mbYl07jHF4qr+oWijDkdjHBVcn5
0mkpYO1riUf0HXIYnvCZq/4k/ajGZRm8EdDy2JIWuwiidQ18irp07UUNO+AB9mq8
5VXUjUN3tLTexg4sLZDKFYGRi4fyVrYKGsi0i5AEHKwn5SmTb3f1pa5yXbv68eYE
lCVfy51rBbG87UTycZ3gFQjf1UkNVbp0WV+RPEM9JR7dgR+9I8bKCuKLFLnGaqvc
beA3A6eMpzXQqsAg6GGo3PW6fMHqe1ZCvidi6e4a/dJDAbHq0XWp93qcwygnWeQW
Ozr1hr5mCa+QkUSymxiUrRncRhyqSP0ok5j4rjwSJu9vmHTEUapiyQMQaEIF2e2S
/NIWGg==
=uriR
-----END PGP MESSAGE-----
EOF)
这样,只有在系统中安装了USB,才能解密密码。当然,您也可以将密钥导入系统(安全性较低,或根本没有安全性),或者您可以使用密码保护私钥(因此无法实现自动化)。
答案 5 :(得分:-3)
答案 6 :(得分:-3)
以上代码中的以下行无效
DB_PASSWORD=$(eval echo ${DB_PASSWORD} | base64 --decode)
正确的行是:
DB_PASSWORD=`echo $PASSWORD|base64 -d`
并将密码保存在PASSWORD的其他文件中。
答案 7 :(得分:-3)
有一种更方便的方法可以在脚本中存储密码,但是您必须对脚本进行加密和混淆,以便无法读取。为了成功加密和混淆shell脚本并实际让该脚本可执行,请尝试在此处复制并粘贴它:
http://www.kinglazy.com/shell-script-encryption-kinglazy-shieldx.htm
在上面的页面上,您只需提交脚本并为脚本指定正确的名称,然后点击下载按钮即可。将为您生成一个zip文件。右键单击下载链接并复制您提供的URL。然后,转到UNIX框并执行以下步骤。
<强>安装:强>
1. wget link-to-the-zip-file
2. unzip the-newly-downloaded-zip-file
3. cd /tmp/KingLazySHIELD
4. ./install.sh /var/tmp/KINGLAZY/SHIELDX-(your-script-name) /home/(your-username) -force
以上安装命令将为您做的是:
注意:强>
这不适用于提示并等待用户响应的交互式脚本。应将用户期望的值硬编码到脚本中。加密确保没有人能够真正看到这些值,因此您无需担心这一点。
<强>关系:强>
此帖中提供的解决方案可以解决您的问题,因为它会加密包含您想要加密的密码的实际脚本。您可以按原样保留密码(未加密),但密码所在的脚本是如此深入模糊和加密,您可以放心,没有人能够看到它。如果尝试撬动脚本,您将收到有关它们的电子邮件通知。