【发布时间】:2021-07-19 10:08:49
【问题描述】:
我需要为下载的 apk 文件生成校验和,并与下载 apk 时发送的另一个校验和进行比较。这必须在 android studio 中完成。
【问题讨论】:
-
在 SO 中展示一些代码并解释您迄今为止尝试过的内容是一种很好的做法。
标签: java android kotlin checksum sha512
我需要为下载的 apk 文件生成校验和,并与下载 apk 时发送的另一个校验和进行比较。这必须在 android studio 中完成。
【问题讨论】:
标签: java android kotlin checksum sha512
您基本上是在要求计算文件的 SHA-512,不管它是什么类型的文件:apk、zip、exe...
有很多关于在 Android 上计算不同哈希值的信息。为了过滤答案,我认为您可以考虑 APK 文件的大小。你想计算什么哈希并不重要,因为唯一改变的可能只是一行:
MessageDigest.getInstance("MD5")
MessageDigest.getInstance("SHA1")
MessageDigest.getInstance("SHA-256")
MessageDigest.getInstance("SHA-512")
例如,如果 APK 非常重,您可以检查一下: How to calculate hash value of a file in Java?
这个很棒,因为它适用于块,因此无需将整个文件加载到内存中。
然后,计算完两个哈希后,您可以将它们转换为 Base64,以便将它们与常规 String 进行比较。
【讨论】:
之前的答案确实有效,但代码很多。 找到了一种使用 apache commons 的简单方法。
添加 apache commons 来构建 gradle
implementation group: 'commons-codec', name: 'commons-codec', version: '1.12'
private fun checksum(destination: String) {
try {
val array = Files.readAllBytes(Paths.get(destination))
val genchecksum = DigestUtils.sha512Hex(array)
apkChecksum = genchecksum.toString()
} catch (e: Exception) {
Log.e(javaClass.simpleName, "File error", e)
}
}
注意 -- 目的地是带有文件名的文件的路径
样本
var destination = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString()/filename.apk
【讨论】: