【问题标题】:Alpine APK Package Repositories, how are the checksums calculated?Alpine APK Package Repositories,校验和是如何计算的?
【发布时间】:2016-08-08 20:08:33
【问题描述】:

我正在尝试弄清楚如何在 Alpine APK 包存储库中计算包的拉取校验和。关于格式的documentation 缺少任何细节。

当我运行生成存储库的apk index -o APKINDEX.unsigned.tar.gz *.apk 时。当您从gz内部提取txt文件时,它包含以下内容...

C:Q17KXT6xFVWz4EZDIbkcvXQ/uz9ys=
P:redis-server
V:3.2.3-0
A:noarch
S:2784844
I:102400
T:An advanced key-value store
U:http://redis.io/
L:
D:linux-headers

我对如何生成第一行感兴趣。我试图阅读用于生成它的实际源代码,但我不是 C 程序员,所以我很难理解,因为它到处乱跳。

文档中提到的两个文件是database.cpackage.c

如果这有点帮助,原始 APK 文件有这些不同的哈希值...

CRC32 = ac17ea88
MD5 = a035ecf940a67a6572ff40afad4f396a
SHA1 = eca5d3eb11555b3e0464321b91cbd743fbb3f72b
SHA256 = 24bc1f03409b0856d84758d6d44b2f04737bbc260815c525581258a5b4bf6df4

【问题讨论】:

    标签: c checksum alpine


    【解决方案1】:

    所以...

    /* Internal cointainer for MD5 or SHA1 */
    struct apk_checksum {
        unsigned char data[20];
        unsigned char type;
    };
    

    基本上取 C: 值,然后从前面切掉 Q,然后进行 base 64 解码。砍掉最后一个值(默认为 SHA1 的类型),然后你就有了你的 sha1。这似乎是由包的内容组成的,但这需要进一步研究。

    【讨论】:

      【解决方案2】:

      拉取校验和是apk文件中第二个tar.gz文件的sha1sum,包含.PKGINFO文件。

      Alpine APK 包实际上是 3 个 tar.gz 文件的串联。

      我们可以使用 gunzip-split 将下面的包拆分成 3 个 .gz 文件,然后将它们重命名为 .tar.gz

      ./gunzip-split -s -o ./out/ strace-5.14-r0.apk
      mv ./out/file_1.gz ./out/file_1.tar.gz
      mv ./out/file_2.gz ./out/file_2.tar.gz
      mv ./out/file_3.gz ./out/file_3.tar.gz
      
      sha1sum ./out/file_2.tar.gz
      7a266425df7bfd7ce9a42c71a015ea2ae5715838  out/file_2.tar.gz
      
      tar tvf out/file_2.tar.gz 
      -rw-r--r-- root/root       702 2021-09-03 01:34 .PKGINFO
      

      在 strace 包的情况下,校验和值可以如上推导出:

      apk index strace-5.14-r0.apk -o APKINDEX.tar.gz
      tar xvf APKINDEX.tar.gz
      cat APKINDEX
      
      echo eiZkJd97/XzppCxxoBXqKuVxWDg=|base64 -d|xxd
      00000000: 7a26 6425 df7b fd7c e9a4 2c71 a015 ea2a  z&d%.{.|..,q...*
      00000010: e571 5838                                .qX8
      

      比较它们时,我们发现它们匹配。

      参考文献

      https://github.com/martencassel/apk-tools/blob/master/README.md

      https://gitlab.com/cg909/gunzip-split/-/releases

      https://lists.alpinelinux.org/~alpine/devel/%3C257B6969-21FD-4D51-A8EC-95CB95CEF365%40ferrisellis.com%3E#%3C20180309152107.472e4144@vostro.util.wtbts.net%3E

      【讨论】:

        【解决方案3】:

        你需要看这里:https://git.alpinelinux.org/cgit/apk-tools/tree/src/blob.c#n492

        是 apk_blob_pull_csum

        第一个'Q'代表编码 下一个“1”代表 SHA1

        看起来这个校验和是由 apk_db_unpack_pkg 中的 database.c 生成的:

            apk_sign_ctx_init(&ctx.sctx, APK_SIGN_VERIFY_IDENTITY, &pkg->csum, db->keys_fd);
        tar = apk_bstream_gunzip_mpart(bs, apk_sign_ctx_mpart_cb, &ctx.sctx);
        r = apk_tar_parse(tar, apk_db_install_archive_entry, &ctx, TRUE, &db->id_cache);
        

        但我不确定,因为我未能追踪此代码。

        他们在做什么真的不容易理解。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-10
          • 2022-06-21
          • 2011-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 2015-12-21
          相关资源
          最近更新 更多