0

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

当我运行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
4

2 回答 2

1

所以...

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

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

于 2016-08-08T21:13:30.537 回答
0

你需要看这里: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);

但我不确定,因为我没能追踪到这段代码。

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

于 2017-07-28T11:05:33.680 回答