如何检查手机上的 App 是不是正版?

本文深入探讨安卓应用程序签名机制,解释如何确保应用的真实性,包括签名证书信息的作用、签名过程及如何检查签名信息。

作者 | Aditi Bhatnagar

译者 | 苏本如,责编 | 郭芮

头图 | 优快云 下载自视觉中国

出品 | 优快云(ID:优快云news)

以下为译文:

仔细看看你的安卓手机上的应用程序,你如何确保它们都是正版的?也就是说,你如何确保你手机上的Instagram应用是正版程序,而不是复制的或假冒的。

当你在网上冲浪的时候,你可以尝试找出一个网站是否是真实的。对于网站而言,我们有证书、有安全锁标志、有完整的URL等等,这些可以帮助我们知道网站是真实的和安全的。那么,对于所有的安卓应用程序而言,我们是否也有一个等效的、可以帮助我们识别的东西呢?

作为一个安卓手机的用户,当我转到“设置/应用程序信息”时,我只能看到下面这些:

你应该注意到,没有一个直接的方法可以检查应用程序的真实性。对于从谷歌应用商店(Google play store)中安装的应用程序,我们确实可以看到一个链接指向该应用程序在谷歌应用商店的地址,但是除此以外,我们找不到任何其他信息或者一些有效性的证明。

那么,如何可靠地检查应用程序的真实性呢?同时,安卓应用程序如何检查同一设备上的、和它们协同工作或交换信息的其他应用程序的真实性呢?

答案是:签名证书信息。

出于安全方面的考虑,安卓系统上的所有应用程序在部署到应用商店之前都需要正式地签名。

所以,在了解了为什么我们需要应用程序的签名之后。我们将在本文深入探讨下列问题:什么是应用程序签名?如何才能实现它?以及它如何保证应用程序的真实性?

什么是应用程序签名?

应用程序签名是在操作系统的最内部实现的。

根据安卓官方提供的文档:

“应用程序签名允许开发人员识别应用程序的作者,并且允许他们在无需创建复杂的接口和获得许可的情况下,更新其应用程序。这样,开发人员就知道他们的应用程序是未经修改地提供给安卓设备使用的;并且开发人员可以对其应用程序的行为负责。”

在安卓系统上,应用程序签名是将应用程序放入其应用程序沙盒的第一步。签名的应用程序证书定义了哪个用户ID与哪个应用程序相关联;不同的应用程序在不同的用户ID下运行。应用程序签名确保一个应用程序不能访问任何其他应用程序,除非通过定义良好的IPC

如何实现应用程序签名?

安卓提供了使用自签名证书的代码签名方法,开发人员可以在没有外部帮助或许可的情况下生成这些证书。证书的申请不需要一个中央机构来签署批准。

安卓系统支持三种应用程序签名方案:

v1方案:基于 JAR 签名

这个方案是基于签名的JAR包。这里要注意的是:v1签名方案并不会保护APK内的所有文件,会存在一些例外部分,这些部分即便被修改也不会导致签名失效,比如ZIP元数据。APK验证器需要处理大量不受信任(尚未验证)的数据结构,然后丢弃签名未涵盖的数据。这提供了一个相当大的攻击面。此外,APK验证器必须解压缩所有的压缩条目,从而消耗更多的时间和内存。为了解决这些问题,安卓7.0引入了APK签名方案v2。

v2方案:亦即APK签名方案v2,在Android 7.0中引入。

v3方案:亦即APK签名方案v3,在Android 9中引入。

运行安卓7.0及更高版本的设备支持APK签名方案v2(亦即v2方案)和它的更高版本。(在Android P中,v2方案被更新为v3方案,以支持在签名块中包含附加信息,但在其他情况下也一样。)。v2方案对APK的内容进行散列和签名,然后将生成的APK签名块插入APK中。

应用程序可以非常简单地通过Android Studio的选项或命令行进行签名。

打开Android Studio,进入Build > Generate Signed APK。

你可以按照下文中的步骤进行操作,来生成一个签名密钥:https://developer.android.com/studio/publish/app-signing#sign-apk。

当你可以选择谷歌应用商店对你的应用的每一个版本进行签名时,你有很多选择。详情请参照上面的链接。

生成密钥并查看其内容的简单命令分别如下:

生成秘钥:

keytool -genkey -v -keystore <keystorealias> -storepass <keyStorePassword> -alias <keyAlias> -keypass <keyPassword>  -keyalg RSA -keysize 2048 -validity 30000

查看秘钥:

keytool -list -v -keystore <keystorealias> -alias <keyAlias> -storepass <keyStorePassword> -keypass <keyPassword>

备注:你需要用实际值替换上面尖括号里的变量。根据你的应用程序的实际需要,设置生成密钥、密钥大小和有效日期(以天为单位)的算法需要提供的值。

此外,还可以使用APKSigner和ZipAlign工具来检查,这些工具很方便(本文将不讨论它们,但是它们非常值得探讨)。

如何通过代码检查应用程序签名信息?

下面的代码可以用来检查应用程序签名信息:

public boolean validateAppSignature(Context context)  throws NameNotFoundException {
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
//note sample just checks the first signature
for (Signature signature : packageInfo.signatures) 
{ // SHA1 the signature
String sha1 = getSHA1(signature.toByteArray());
// check is matches hardcoded value
return APP_SIGNATURE.equals(sha1);}
return false;}

当一个应用程序(APK文件)被安装到安卓设备上时,包管理器将验证APK文件是否已经使用该APK中包含的证书正确地签名。如果证书(或者更准确地说,证书中的公钥)与用于在设备上签署任何其他APK的密钥匹配,则新APK可以在清单中指定它将与其他类似签名的APK共享UID。

如果设备上的私有签名密钥丢失,会出现什么情况?

这将导致旧的应用程序无法更新!这种情况下,它将生成一个新的包名&一个新的证书。比如说:

Authenticator应用程序是一个身份验证程序,这个应用程序的一个私有应用程序签名密钥丢失或受损,因为在几年前的一次更新中,它的软件包名称从com.google.android.apps.authenticator被更改为com.google.android.apps.authenticator2。由于此更改,所有后续的Authenticator应用程序更新只能以新的程序包名称发布,并且使用由新的专用签名密钥生成的新签名。

不过,最近谷歌公司也增加了对“rolling key”的支持,这可能会在有这种麻烦的情况下为开发者节轻一点压力。

以上所有这些内容供你参考,希望你能从中获得一些帮助。签名是一个至关重要的场景,需要深入了解才能理解安卓系统的整体安全状况。

原文:https://hackernoon.com/how-to-check-whether-the-mobile-app-on-your-phone-is-authentic-or-not-j9gt32lw

本文为 优快云 翻译,转载请注明来源出处。

【END】

更多精彩推荐

NB-IoT 连接数过亿,开发者如何抓住新机遇?

华为云跻身Gartner报告中国三强,预示云计算市场的未来变局?

数据库激荡40年,深入解析PostgreSQL、NewSQL演进历程

黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下!

超详细!一文告诉你 SparkStreaming 如何整合 Kafka !附代码可实践

Libra的Move语言初探,10行代码实现你第一个智能合约

你点的每个“在看”,我都认真当成了喜欢

<think>我们正在处理一个关于阻止Android手机中垃圾App反复安装其他App的问题。根据用户描述,恶意应用在后台反复安装其他应用程序,这通常是由于恶意应用获得了较高的系统权限(如设备管理员权限或无障碍服务权限)或利用了系统漏洞。参考我们已有的知识:-引用[1]提到Android的root文件系统(/)是从RAMDisk加载的,通常不可修改,除非刷机。这意味着系统核心部分是受保护的。-引用[2]提到AndroidVerifiedBoot(AVB)确保启动过程的完整性,防止恶意篡改。-引用[3]提到屏幕锁的密码存储在/data/system/gesture.key,删除该文件可绕过屏幕锁。但这里更关键的是,恶意应用可能通过获取系统权限来执行恶意操作。解决方案思路:1.移除恶意应用的设备管理员权限:恶意应用常常通过获取设备管理员权限来防止被卸载。2.禁用恶意应用的无障碍服务权限:一些恶意应用滥用无障碍服务来模拟用户点击,从而安装其他应用。3.卸载恶意应用:在解除其特殊权限后卸载。4.检查并卸载未知来源应用:确保没有其他恶意应用存在。5.启用GooglePlay保护机制。6.重置应用偏好设置:将应用关联重置,避免恶意应用被设为默认打开某些链接或文件。7.在安全模式下操作:如果恶意应用干扰正常操作,可进入安全模式卸载。8.作为最后手段,恢复出厂设置(注意备份重要数据)。具体步骤:###步骤1:移除设备管理员权限1.打开“设置”>“安全”>“设备管理器”或“设备管理应用”(不同设备路径可能略有不同,也可能在“设置”>“更多设置”>“设备管理器”)。2.在设备管理员应用列表中,找到可疑应用(尤其是用户不认识的)。3.取消选中该应用,然后点击“停用”或“取消激活”。4.输入设备密码(如果有)确认。###步骤2:禁用无障碍服务权限1.进入“设置”>“辅助功能”>“无障碍”(或“设置”>“更多设置”>“无障碍”)。2.在“已下载的服务”或“已安装的服务”下,找到可疑应用并点击。3.关闭开关以禁用该服务。###步骤3:卸载恶意应用1.在“设置”>“应用”>“应用管理”(或“应用和通知”>“查看所有应用”)中找到该应用。2.点击进入应用详情,点击“卸载”。3.如果卸载按钮灰色不可用,说明该应用有设备管理员权限或为系统应用。需先完成步骤1。###步骤4:检查未知来源应用1.在“设置”>“安全”中,查看“未知来源”应用安装权限。确保没有恶意应用被授权。2.同时,检查已安装的应用列表,卸载任何可疑应用。###步骤5:启用GooglePlay保护1.打开GooglePlay商店应用。2.点击头像,进入“Play保护机制”。3.确保“扫描应用”功能已开启。###步骤6:重置应用偏好设置1.进入“设置”>“应用”>右上角菜单(或三点菜单)>“重置应用偏好设置”。2.确认重置。这将清除所有应用的默认打开方式、后台限制等设置,但不会删除应用数据。###步骤7:安全模式卸载如果正常模式下无法卸载(如恶意应用干扰),尝试安全模式:1.长按电源键,出现关机选项时,长按“关机”直到出现“进入安全模式”提示,然后确认。2.或者,不同设备进入安全模式方式不同,可查询具体设备型号。3.在安全模式下,恶意应用通常不会自启,此时可卸载。###步骤8:恢复出厂设置如果以上方法无效,考虑恢复出厂设置(会清除所有数据):1.备份重要数据(照片、联系人等)到云端或电脑。2.进入“设置”>“系统”>“重置选项”>“恢复出厂设置”。3.注意:恢复后,重新设置手机时,不要从不可信的来源恢复应用。###预防措施-仅从官方应用商店(如GooglePlay)下载应用。-安装应用前查看权限要求,避免授予不必要的权限(尤其是设备管理员、无障碍服务、安装其他应用等权限)。-定期更新系统和应用,修复安全漏洞。-安装可靠的安全软件。如果问题仍然存在,可能需要更深入的技术手段,如通过ADB卸载(需要开启USB调试)或刷机。但普通用户建议先尝试以上步骤。§§相关问题§§1.如何识别Android设备上的恶意应用?2.如何防止恶意应用获取设备管理员权限?3.Android系统有哪些安全机制可以阻止未经授权的应用安装?</think>### 如何阻止Android手机中的恶意应用反复安装其他应用程序 #### 核心原理 Android系统通过**权限控制**和**安全沙箱**限制应用行为,但恶意应用常利用以下漏洞反复安装其他应用: 1. **滥用无障碍服务**(Accessibility Service):获取系统级操作权限[^3] 2. **设备管理员权限**(Device Admin):阻止自身被卸载 3. **未知来源安装权限**:诱导用户开启该权限 4. **后台服务保活**:通过相互唤醒维持恶意进程 --- ### 解决方案步骤 #### 第一步:切断恶意应用的权限 1. **禁用无障碍服务权限** - 进入 `设置 > 无障碍 > 已安装的服务` - 关闭所有可疑应用的无障碍权限(特别是名称怪异的应用) - *原理*:阻断模拟用户点击安装应用的能力[^3] 2. **移除设备管理员权限** - 进入 `设置 > 安全 > 设备管理器` - 取消勾选可疑应用并点击「停用」 - *关键点*:此权限会阻止卸载操作 #### 第二步:卸载恶意应用 1. **安全模式卸载** - 长按电源键 > 长按「关机」选项 > 进入安全模式 - 在安全模式下卸载可疑应用(此时第三方应用无法运行) - *适用场景*:应用干扰正常卸载时 2. **ADB强制卸载**(需开启USB调试) ```bash adb shell pm uninstall --user 0 恶意应用包名 ``` - *优势*:无需root,彻底卸载系统预装恶意软件 #### 第三步:加固系统防护 1. **关闭未知来源安装** - 进入 `设置 > 安全 > 特殊应用权限 > 安装未知应用` - 对所有应用关闭「允许安装应用」权限 2. **启用Google Play保护** - 打开 Play商店 > 头像 > Play保护机制 > 开启扫描功能 - *作用*:自动检测并阻止恶意安装行为[^2] 3. **重置应用偏好** - 进入 `设置 > 应用 > 右上菜单 > 重置应用偏好` - *效果*:清除恶意应用设置的默认打开关联 #### 第四步:深度清理(需root) ```bash # 删除残留文件(在/data/data/和/data/app/目录) find /data -name "*恶意应用包名*" -exec rm -rf {} \; ``` - *警告*:需精确操作,误删可能导致系统故障 #### 终极方案:系统级重置 1. **恢复出厂设置** - 进入 `设置 > 系统 > 重置选项 > 清除所有数据` - *注意*:提前备份重要数据 2. **重刷官方固件** - 通过Odin或Fastboot重刷纯净ROM - *原理*:替换被篡改的initramfs镜像[^1] --- ### 预防措施 1. **权限最小化原则**:拒绝非必要权限请求(尤其无障碍服务) 2. **官方渠道安装**:禁用「未知来源」安装权限 3. **定期检查**: - 每月查看 `设置 > 应用 > 特殊权限` 列表 - 检查设备管理器中的异常应用 4. **启用AVB验证**:确保Bootloader锁开启,利用Android Verified Boot机制[^2] > **关键提示**:90%的反复安装问题源于无障碍服务被滥用。发现异常弹窗安装时,立即进入安全模式检查无障碍设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值