ApkChecksum 的 getValue() 返回的字节数组的编码格式是什么?

What is the encoding format of the byte arrays returned by ApkChecksum's getValue()?

提问人:auspicious99 提问时间:10/9/2023 最后编辑:auspicious99 更新时间:10/24/2023 访问量:60

问:

从 API 级别 31 开始,android 的包管理器添加了 requestChecksums(),允许检索各种 apk 哈希值。有了这个,我们可以得到一个 ;但是,ApkChecksum 的开发人员参考非常稀疏地记录了 ApkChecksum 类。 以字节数组 (byte[]) 的形式返回“校验和值”。它不能为空。List<ApkChecksum>getValue()

但它没有说明这样返回的字节的编码/格式。正如这篇 SO 帖子所指出的,“你的字节数组必须有一些编码”,它指向了 https://docs.oracle.com/en/java/javase/15/intl/supported-encodings.html#GUID-F8900850-51B5-4B8B-88C0-6186DF1C16B5 模块中包含的数十个基本编码集的列表,更不用说开发人员可能选择使用的许多其他编码集了。这些只是字符编码,而 ApkChecksum 返回的哈希值可能使用其他编码/格式来表示数字或大数字。java.base

有谁知道 ApkChecksum 返回的字节数组的编码是什么?getValue()

哈希 校验和 android-package-managers

评论

0赞 MikkelT 10/9/2023
你要求字符串编码吗?可能是 UTF-8?或者哈希编码,我认为是SHA256
0赞 auspicious99 10/12/2023
例如,当我们尝试获取示例 apk 的TYPE_WHOLE_MERKLE_ROOT_4K_SHA256校验和,然后仅将校验和返回值(字节数组)打印为字符串时,它显示为 [B@3e70406 ; 我们访问像 tunnelsup.com/hash-analyzer 这样的站点,它无法识别哈希格式。这 10 个字节与站点可以识别的典型 64 字节 SHA256 哈希有很大不同。
0赞 MikkelT 10/13/2023
[B@3e70406 是内存地址,因此不是哈希值。TYPE_WHOLE_MERKLE_ROOT_4K_SHA256当然是SHA256 - 您是否尝试过在值上使用SHA256解析器?

答:

1赞 dev.bmax 10/9/2023 #1

我不是这个领域的专家,但 AFAIK 校验和只是字节(不是文本),因此它们不需要任何编码。

如果你的问题是如何解释字节,那么你可能需要查看报告的类型(例如TYPE_PARTIAL_MERKLE_ROOT_1M_SHA256):https://developer.android.com/reference/android/content/pm/ApkChecksum#getType()

该文档包含有关签名算法的许多详细信息。

2赞 ShawnShawnShawn 10/24/2023 #2

我参考了这个页面,它用于将十六进制值打印成一个字符串,并将输出连接起来形成哈希值。我的代码如下所示:String.format ("%02X", b)

                val Checksum = checksum.value
                var concatWhole = ""
                for (a in Checksum) {
                    val st = String.format("%02X", a)
                    concatWhole += st

根据文档,Android 是 little-endian