wget http://example.com/install.sh -O - | bash
自动运行脚本,但由于可能的 (TLS) MITM 攻击等,这是不安全的。是否可以构建一个下载脚本的单行程序,但仅当它的哈希与单行程序中指定的哈希匹配时才执行它?如果单行程序会打印出类似Warning! Hash mismatch
哈希检查失败的内容,那就太好了。
wget http://example.com/install.sh -O - | bash
自动运行脚本,但由于可能的 (TLS) MITM 攻击等,这是不安全的。是否可以构建一个下载脚本的单行程序,但仅当它的哈希与单行程序中指定的哈希匹配时才执行它?如果单行程序会打印出类似Warning! Hash mismatch
哈希检查失败的内容,那就太好了。
所以你要下载并运行
http://example.com/install.sh
.现在我假设您将其 SHA256 哈希存储在本地一个名为
my-sha256.txt
. 该文件仅包含散列本身和 Unix 样式的换行符,因此其大小必须正好为 65 个字节。您可以通过简单地运行它来创建它:您如何将此哈希文件从您的开发机器分发到客户端不是此答案的一部分(但是,您可能会澄清您的问题并要求我根据您的详细规范更新此部分)。
您的客户端必须运行以下载、验证和成功执行脚本的实际命令可能如下所示:
没有空格的稍微缩短和丑陋的版本:
放置在多行以提高可读性:
如果您想直接将命令中的哈希作为字符串提供而不是从文件中读取,只需使用我上面的原始命令版本之一并将出现的替换为
my-sha256.txt
,<(echo YOUR_HASH)
插入您的真实哈希而不是“YOUR_HASH”占位符当然。解释:
脚本/单线首先使用
mktemp
(使用系统的临时文件夹/tmp
)创建一个临时文件。然后它用于
wget
从指定的 URL 下载安装脚本并将其保存在临时文件中。现在我们计算它的哈希和,仅从输出中过滤哈希值,
sha256sum
并将其与我们存储在 out 中的值进行比较my-sha256.txt
。如果两个哈希值相等,我们将
bash
使用我们的临时脚本文件作为参数调用,否则我们echo FAIL
或您可以输出自定义错误消息。最后,我们通过在这两种情况下删除我们的临时文件来进行清理。
然而,回到安全分发散列来验证原始脚本的问题,上面的这个解决方案对你没有多大帮助,因为它通过创建另一个相同类型的问题来解决一个问题。
您实际上应该做的是创建一个 GPG 密钥对(并将您的公钥发布到密钥服务器),用它签署您的脚本并提供压缩的签名二进制文件以供下载。然后让客户端
gpg
再次使用验证和解密脚本并成功运行它。由于 GPG 指纹使用不安全的 SHA-1 散列,这里有一个单行,允许使用从公钥计算的非官方 SHA256 散列进行身份验证
gpg --export <key ID> | sha256sum
命令:
h="<SHA256 hash of exported public key>"; fp="<PGP key SHA1 fingerprint>"; f='key.pub'; gpg --keyserver pgp.mit.edu --recv $fp && gpg --export $fp > $f && if sha256sum $f | grep -Eo '^\w+' | cmp -s <(echo $h); then rm $f && wget https://example.com/install.sh{,.asc} -q && gpg --verify install.sh{.asc,} && bash install.sh; else rm $f; echo "ERROR: Signing key had invalid SHA256 hash"; fi;