AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 899847
Accepted
maqp
maqp
Asked: 2017-04-04 11:11:19 +0800 CST2017-04-04 11:11:19 +0800 CST 2017-04-04 11:11:19 +0800 CST

wget 脚本,但仅当脚本的 SHA256 与单行匹配时才将其通过管道传输到 bash

  • 772

wget http://example.com/install.sh -O - | bash自动运行脚本,但由于可能的 (TLS) MITM 攻击等,这是不安全的。是否可以构建一个下载脚本的单行程序,但仅当它的哈希与单行程序中指定的哈希匹配时才执行它?如果单行程序会打印出类似Warning! Hash mismatch哈希检查失败的内容,那就太好了。

command-line
  • 2 2 个回答
  • 4409 Views

2 个回答

  • Voted
  1. Best Answer
    Byte Commander
    2017-04-04T13:55:15+08:002017-04-04T13:55:15+08:00

    所以你要下载并运行http://example.com/install.sh.

    现在我假设您将其 SHA256 哈希存储在本地一个名为my-sha256.txt. 该文件仅包含散列本身和 Unix 样式的换行符,因此其大小必须正好为 65 个字节。您可以通过简单地运行它来创建它:

    sha256sum ORIGINAL_FILE.SH | grep -Eo '^\w+' > my-sha256.txt
    

    您如何将此哈希文件从您的开发机器分发到客户端不是此答案的一部分(但是,您可能会澄清您的问题并要求我根据您的详细规范更新此部分)。


    您的客户端必须运行以下载、验证和成功执行脚本的实际命令可能如下所示:

    t=$(mktemp) && wget 'http://example.com/install.sh' -qO "$t" && if sha256sum "$t" | grep -Eo '^\w+' | cmp -s my-sha256.txt ; then bash "$t" ; else echo FAIL ; fi ; rm "$t"
    

    没有空格的稍微缩短和丑陋的版本:

    t=$(mktemp)&&wget 'http://example.com/install.sh' -qO"$t"&&if sha256sum "$t"|grep -Eo '^\w+'|cmp -s my-sha256.txt;then bash "$t";else echo FAIL;fi;rm "$t"
    

    放置在多行以提高可读性:

    t=$(mktemp) && 
    wget 'http://example.com/install.sh' -qO "$t" && 
    if sha256sum "$t" | grep -Eo '^\w+' | cmp -s my-sha256.txt 
        then bash "$t" 
        else echo FAIL 
    fi 
    rm "$t"
    

    如果您想直接将命令中的哈希作为字符串提供而不是从文件中读取,只需使用我上面的原始命令版本之一并将出现的替换为my-sha256.txt,<(echo YOUR_HASH)插入您的真实哈希而不是“YOUR_HASH”占位符当然。

    解释:

    脚本/单线首先使用mktemp(使用系统的临时文件夹/tmp)创建一个临时文件。
    然后它用于wget从指定的 URL 下载安装脚本并将其保存在临时文件中。
    现在我们计算它的哈希和,仅从输出中过滤哈希值,sha256sum并将其与我们存储在 out 中的值进行比较my-sha256.txt。
    如果两个哈希值相等,我们将bash使用我们的临时脚本文件作为参数调用,否则我们echo FAIL或您可以输出自定义错误消息。
    最后,我们通过在这两种情况下删除我们的临时文件来进行清理。


    然而,回到安全分发散列来验证原始脚本的问题,上面的这个解决方案对你没有多大帮助,因为它通过创建另一个相同类型的问题来解决一个问题。

    您实际上应该做的是创建一个 GPG 密钥对(并将您的公钥发布到密钥服务器),用它签署您的脚本并提供压缩的签名二进制文件以供下载。然后让客户端gpg再次使用验证和解密脚本并成功运行它。

    • 7
  2. maqp
    2018-03-01T09:54:37+08:002018-03-01T09:54:37+08:00

    由于 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;

    • 0

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve