避免在 http_proxy 中使用纯文本密码

Cap*_*Man 9 command-line security password http-proxy

我在公司防火墙后面,这在代理领域带来了很多痛苦。我发现有两种主要方法有效:

  1. 使用 Cntlm 的代价是无法(从命令行)连接到 HTTPS 和外部 SSH 位置。(Cntlm 允许您使用 PassNTLMv2 散列您的用户名和密码(从而避免纯文本)并设置http://localhost:3128/为您的代理,然后重定向到您的“真实”代理。正如我所提到的,我无法使用这种方法连接到 HTTPS 和外部 SSH。)
  2. 将我的用户名和密码以纯文本格式放入http_proxy变量中,代价是我的用户名和密码为纯文本格式。

显然,如果安全性不是问题,我只会选择选项 2。

我找到了一些解决方案,在我的.babrunrc(我使用 Babun,它基本上是 Cygwin 有一点额外,同样可以在一个.bashrc.zshrc虽然)

export http_proxy="http://`echo "Y21hbjpwYXNzd29yZA==" | base64 -d`@20.20.20.20:20/"
Run Code Online (Sandbox Code Playgroud)

这样我的密码至少是经过编码的。如果有人来到我的电脑并输入echo $http_proxy他们会看到我的密码,但我认为没有办法解决这个问题。

有没有其他方法可以解决这个问题?或者也许是一种加密字符串而不是编码字符串的方法?如果无法绕过它,我不介意在打开提示时输入一些密码。

Gil*_*il' 9

使用base64是没有用的,它只是一个简单的转换。使用与加密数据一起存储的密钥进行加密也是无用的,因为它仍然只是一个简单的转换。如果您担心有人会访问您的配置文件,那么您需要使用不在您的配置文件中的密钥进行加密,这意味着您必须在登录时输入密码¹。

使用现有的加密机制,而不是自己制作。

在 Linux 上,如果您使用文件加密,请使用eCryptfs加密您的主目录,或者使用 Linux 的磁盘加密层(dm-crypt,cryptsetup命令)加密整个磁盘,或者使用encfs创建一个小的每个文件的加密文件系统。在后一种情况下,有一个安装 encfs 文件系统的脚本,然后运行存储在那里的脚本。

在 Windows 上,将文件放在TrueCrypt / VeraCrypt 上

或者,使用密码管理器(当然要设置主密码)。可以使用该secret-tool实用程序从命令行查询 Gnome 的密码管理器 (gnome-keyring) 。Seahorse提供了一个方便的 GUI 来探索和修改密钥环以及设置主密码。

secret-tool store --label='Corporate web proxy password' purpose http_proxy location work.example.com

export http_proxy="http://cman:$(secret-tool lookup purpose http_proxy location work.example.com)@192.0.2.3/"
Run Code Online (Sandbox Code Playgroud)

这需要 D-Bus,它通常在 Linux 下默认可用(大多数现代桌面环境都需要它),但需要在 Cygwin 下手动启动(我不知道具体如何)。

¹或以其他方式提供秘密材料,例如存储在智能卡上。


Cap*_*Man 8

我找到了一个解决方案:添加openssl enc -aes-128-cbc -a -d到组合中。但是,如已接受的答案中所述,此选项可能不是很安全。

首先,将用户名密码组合(或 base64 编码的等效项)放入此处,

echo "<put it here>" | openssl enc -aes-128-cbc -a
Run Code Online (Sandbox Code Playgroud)

它会提示输入密码两次。此密码是您每次http_proxy设置时必须输入的密码。

然后,在.babunrc(或任何你放的地方),

export http_proxy="http://`echo "<output from above command>" | openssl enc -aes-128-cbc -a -d`@20.20.20.20:20/"
Run Code Online (Sandbox Code Playgroud)

如果输入是 base64 编码的,你将需要这个:

export http_proxy="http://`echo "<output from above command>" | openssl enc -aes-128-cbc -a -d | base64 -d`@20.20.20.20:20/"
Run Code Online (Sandbox Code Playgroud)

如果<output from above command>有一条新线路,\n将为其工作。