有哪些方法可以对环境变量中的密码进行加密

有哪些方法可以对环境变量中的密码进行加密

我有这个文件,用于在导出值之前设置用户名和密码。

#!/bin/bash
echo -n "User:";
read user
echo -n "Password:";
read -s password

export http_proxy=http://$user:$password@$domain:$portnum

if curl -silent http://www.google.com | grep authentication_failed;
then
        echo NO CONNECT
        unset http_proxy
else
        echo OK
fi

history, printenv, 中,export -p我可以看到我设置的值

此外,我想要在 $password 中使用加密形式的密码,而不是逐字包含我的密码的值。

我熟悉使用 openssh 来加盐密码,或使用 perl 的 crypt() 打印哈希,但就我的目的而言,我看不到它的用法?有什么建议吗?

答案1

我无法重现您提到的问题,密码显示在history命令的输出中。

密码显示在 和 的输出中,printenv并且export -p按预期工作。这些命令显示环境变量,这就是您放置字符串的位置http_proxy

环境变量会自动由子进程继承,但不会由任何其他进程继承。我不明白为什么您认为这是一个主要问题,因为它仅对同一安全域内的进程可见。

但是您可以停止将其放入环境变量中,而是使用普通的 shell 变量。那么它就不会被子进程继承。由于您可能希望curl 能够访问环境变量,因此您可以将环境变量仅传递给该命令而不是所有其他命令。

#!/bin/bash
echo -n "User:";
read user
echo -n "Password:";
read -s password

proxy="http://$user:$password@$domain:$portnum"

if http_proxy="$proxy" curl -silent http://www.google.com | grep authentication_failed;
then
    echo NO CONNECT
else
    echo OK
fi

答案2

如果您要传递敏感信息并经常使用它,您可能最好使用 openssl 对其进行加密

把类似的东西

#create key as follows - will prompt for password
#echo -n 'secret you want encrypted' | openssl enc -aes-256-cbc  -a -salt -pbkdf2|base64
export MY_SECRET='VTJGc2RHVmtYMTlzVnBGWXNYUitLWlpYT3BWdStaQXJXeUVwc1JORnFsNWswZXJKT1dkRWpsWkxLWVFnK1hONQo='

进入您的 .bashrc 将为您提供一个加密的环境变量,您可以在需要机密的任何地方访问该变量,并且系统将提示您输入创建环境变量时使用的密码。

在上面的例子中它是“秘密”

您访问它的命令如下

`echo $MY_SECRET|base64 --decode|openssl enc -aes-256-cbc -a -d -salt -pbkdf2 `

例如

xfreerpd /parameters.... /p:`echo $MY_SECRET|base64 --decode|openssl enc -aes-256-cbc -a -d -salt -pbkdf2` 

对于您正在创建环境变量并将密码内置到环境变量中的查询

您可以按如下方式创建变量

password_encrypted=`echo -n 'secret you want encrypted' | openssl enc -aes-256-cbc  -a -salt -pbkdf2|base64`

然后使用如下

export http_proxy=http://$user:`echo $password_encrypted|base64 --decode|openssl enc -aes-256-cbc -a -d -salt -pbkdf2 `@$domain:$portnum

base64部分是为了让你可以设置变量

MY_SECRET='VTJGc2RHVmtYMTlzVnBGWXNYUitLWlpYT3BWdStaQXJXeUVwc1JORnFsNWswZXJKT1dkRWpsWkxLWVFnK1hONQo='

并且不要将您的秘密困在命令历史记录等中。

当您生成秘密时,有时 Base64 输出将有多行,因此您需要为变量进行换行。

echo -n 'secret you want encrypted' | openssl enc -aes-256-cbc  -a -salt -pbkdf2|base64
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
VTJGc2RHVmtYMTlzVnBGWXNYUitLWlpYT3BWdStaQXJXeUVwc1JORnFsNWswZXJKT1dkRWpsWkxL
WVFnK1hONQo=

#take the above line break out 
MY_SECRET='VTJGc2RHVmtYMTlzVnBGWXNYUitLWlpYT3BWdStaQXJXeUVwc1JORnFsNWswZXJKT1dkRWpsWkxLWVFnK1hONQo='

openssh 每次都会提示您输入密码来加密和解密,您可以提供一个密码作为命令的一部分,但这样您就只是从历史记录中隐藏了一些内容等。看看https://www.howtoing.com/generate-encrypt-decrypt-random-passwords-in-linux/有关使用 openssh 执行此操作的一些信息。https://www.serverlab.ca/tutorials/linux/administration-linux/how-to-base64-encode-and-decode-from-command-line/对于 Base64 和https://stackoverflow.com/questions/16072351/how-to-assign-an-output-to-a-shellscript-variable对于命令替换的不同选项,我在上面使用了反勾号 `

PS 添加一个功能,例如

get-key()
{
 echo -n "$1"|base64 --decode|openssl enc -aes-256-cbc -a -d -salt -pbkdf2
}

如果您需要的话,您的 bashrc 可以让您快速访问秘密

答案3

您应该将 paasword 存储在仅当前用户可读的安全文件中。

然后通过管道输入该文件内容或使用目标应用程序提供的机制。

恕我直言,它本身curl就提供了这样的选项。

相关内容