我如何确定它没有被篡改?应用是否以任何方式签名?有什么办法可以检查签名?
#1 楼
绕过关于在手机上安装该应用程序的合法性的辩论,验证问题是我一直想理解的一个问题,并且您已经促使我尝试找出一种验证谁签名的可能方法。 apk。Android应用程序以.jar文件的常规方式签名(.apk实际上只是一个特殊的.jar,而这只是一个特殊的.zip),但是跟踪该文件可能并不容易证书的真实性,除非您有比较好的已知东西。这基本上就是电话本身所做的工作-验证声称与电话中已有的东西实际上来自同一方的东西-电话不会拒绝安装具有未知签名者的东西,它只能(反对/清除应用程序)当新的东西与声称的旧东西不匹配时,明显的伪造数据。
您将需要jarsigner和keytool。我相信这些来自JDK,这是android SDK的先决条件,而不是SDK本身。
首先,您要尝试验证.apk中包含的公钥。通常这在META-INF / CERTS.RSA中,但可以在另一个文件中-解压缩-l会告诉您。您想了解一下有关它的信息:
unzip -p suspect.apk META-INF/CERT.RSA | keytool -printcert
这将遗漏很多有关签名者声称是谁的信息。有些证书显然是由已知方自己签署的,但是如果不弄清楚该如何跟踪,我怀疑您可以这样做:
unzip -p suspect.apk META-INF/CERT.RSA | keytool -printcert | grep MD5
unzip -p knowngood.apk META-INF/CERT.RSA | keytool -printcert | grep MD5
如果您知道来自使用相同证书的同一作者的受信任的apk。我假设具有相同MD5总数的证书就足够了。
假设您已决定信任该证书,那么您可以查看该证书是否已用于对证书中的每个文件进行签名。 .apk
jarsigner -verbose -verify suspect.apk
(如果存档中有多个.RSA文件,则应添加-certs标志以告诉您已使用哪个证书对每个文件进行签名,因此可以确保已验证其证书)。
评论
@Chris Stratton是否可以从设备复制Google Maps apk?然后,您可以按照您所说的检查证书。
– Kaizer Sozay
2015年9月19日下午2:19
此外,您可以使用以下应用程序从设备中提取APK:play.google.com/store/apps/details?id = com.ext.ui&hl = zh-CN最佳,Paul。 [由主持人Firelord编辑]
–Paul Spiesberger
17年8月30日9:50
#2 楼
验证APK文件的正确方法是使用apksigner
。apksigner
是Android构建工具的一部分,因此您可能会发现安装了多个版本,每个安装工具版本都安装了一个版本。示例路径在Android SDK中,到
apksigner
的地址是:android-sdk/build-tools/29.0.2/apksigner
以这种方式执行apksigner:
apksigner verify --verbose --print-certs "Signal-website-universal-release-4.49.13.apk"
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Number of signers: 1
Signer #1 certificate DN: CN=Whisper Systems, OU=Research and Development, O=Whisper Systems, L=Pittsburgh, ST=PA, C=US
Signer #1 certificate SHA-256 digest: 29f34e5f27f211b424bc5bf9d67162c0eafba2da35af35c16416fc446276ba26
Signer #1 certificate SHA-1 digest: 45989dc9ad8728c2aa9a82fa55503e34a8879374
Signer #1 certificate MD5 digest: d90db364e32fa3a7bda4c290fb65e310
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 1024
Signer #1 public key SHA-256 digest: 75336a3cc9edb64202cd77cd4caa6396a9b5fc3c78c58660313c7098ea248a55
Signer #1 public key SHA-1 digest: b46cbed18d6fbbe42045fdb93f5032c943d80266
Signer #1 public key MD5 digest: 0f9c33bbd45db0218c86ac378067538d
<skipped a lot of warnings>
现在您已经验证了APK,但您仍然不知道是否可以信任签署APK文件的个人/组织。这是因为在Android APK签名上使用了自签名证书。因此,如果您可以信任证书,将是一个难题。唯一的方法是检查使用相同证书签名的其他应用。
我知道的唯一方法是使用在线PlayStore抓取服务,例如androidobservatory.org。它具有一个API,可使用证书SHA-1摘要检查使用同一证书对哪些应用程序进行签名的API:
SHA-1:https://androidobservatory.org/cert/45989DC9AD8728C2AA9A82FA55503E34A8879374
编辑:apkmirror.com还允许搜索证书摘要。只需在搜索字段中输入普通的SHA-1或SHA-256证书摘要(不带冒号或空格):
SHA-1:https://www.apkmirror.com/?post_type = app_release&searchtype = app&s = 45989DC9AD8728C2AA9A82FA55503E34A8879374
SHA-256:https://www.apkmirror.com/?post_type=app_release&searchtype=apk&s=29f34e5f27f211b424bc5bf9d67162c0eafba16da
c
评论
这是最有帮助的答案,谢谢!我使用apksigner比较了来自与我从Google App Store获得的同一个开发人员的应用程序和与我从ApkMirror获得的应用程序的证书
–yorch
6月20日18:59
对于希望不下载1 GB SDK的用户,可以直接将下载链接指向(当前)构建工具:dl.google.com/android/repository/…
– Borislav Ivanov
12月21日12:03
@BorislavIvanov您应该提到您的链接仅适用于Windows。除此之外,您还可以只下载没有Android Studio的Android SDK。在此处查看“仅命令行工具”部分:developer.android.com/studio#downloads它包含SDK管理器,该SDK管理器允许下载已链接的“构建工具r30”。最终您总共可以下载约150MB。
–罗伯特
12月21日12:22
#3 楼
apksigner
中有(现在)个build-tools
工具可以满足您的需求。从文档:检查APK的签名是否有望在APK支持的所有Android平台上被确认为有效:
apksigner verify [options] app-name.apk
#4 楼
您也可以尝试将APK上传到免费的VirusTotal.com病毒检查器。它将为APK生成一个唯一的哈希值,如果其他人已经将其上传以进行测试(很有可能),那么您将更加了解APK是有效的。该服务还将通过60个病毒扫描程序,让您知道它是否具有与已发现病毒相似的签名。
评论
我不信任病毒检查,因为这些防病毒程序只关注曾经分发的每个Android APK。另外,除了之前已上传相同文件外,MD5不会告诉您太多信息。
–斯坦
4月28日14:41
@Stan-扫描文件中的字节以查找恶意软件字节。它不必知道曾经分发的每个APK。另外,它不是MD5,而是SHA256,还有一些其他信息,如果这是第一次上传APK,那么它可能是未知的,更可能是恶意的。另外,大多数有效的APK可能都在那里。为什么不将其作为其他使用工具作为分析的一部分呢?它可以提供对程序包的另一种置信度或不置信度。您不必将其视为最终的决定,而应将其视为更多数据
– raddevus
4月29日下午13:29
好的,我同意它作为附加资源很有用,不仅是唯一的资源。
–斯坦
5月2日下午16:27
评论
如果您通过手机访问m.google.com/maps页面,它是否提供下载链接或类似内容?@Nicolás:它链接到市场,我无法从中下载它。
由于您的问题最近已被编辑,因此您从何处下载它。我使用gappsandroid.blogspot.com,我已经交叉引用了一些应用程序,并且所有这些应用程序都将MD5金额与Play商店中的官方发布的应用程序进行了匹配。
相关stackoverflow.com/questions/12785001/…
如果您有另一个来自同一供应商的“真实”应用程序,则可以比较两个应用程序是否使用相同的密钥/身份进行签名:android.stackexchange.com/a/208326/2241