需求:仅允许安装特定签名apk,其它签名apk禁止安装。

一、移植下面代码

commit 814c25ddd422f8f44a3de9451ef25e296a298ea0
Author: shenhb <shenhb@topband.com.cn>
Date:   Thu Feb 20 11:31:19 2020 +0800
仅允许安装指定签名apk,通过属性ro.signature配置签名sha1值
index b7171ba..414a064 100755
--- a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -355,6 +355,7 @@ import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicBoolean;import java.util.concurrent.atomic.AtomicInteger;import java.util.zip.GZIPInputStream;
+import java.util.Locale;

/**

  • Keep track of all those APKs everywhere.
    @@ -18605,6 +18606,37 @@ public class PackageManagerService extends IPackageManager.Stub
    Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
    }
  • // Add by shenhb@topband.com.cn, for only allow the specified signature apk.

  • private static String getFingerprint(Signature signature, String hashAlgorithm) {

  •    if (signature == null) {
    
  •        return null;
    
  •    }
    
  •    try {
    
  •        MessageDigest digest = MessageDigest.getInstance(hashAlgorithm);
    
  •        return toHexadecimalString(digest.digest(signature.toByteArray()));
    
  •    } catch (NoSuchAlgorithmException e) {
    
  •        // ignore
    
  •    }
    
  •    return null;
    
  • }

  • private static String toHexadecimalString(byte[] value) {

  •    StringBuffer sb = new StringBuffer();
    
  •    int len = value.length;
    
  •    for (int i = 0; i < len; i++) {
    
  •        int num = ((int) value[i]) & 0xff;
    
  •        if (num < 0x10) {
    
  •            sb.append('0');
    
  •        }
    
  •        sb.append(Integer.toHexString(num));
    
  •        if (i < len - 1) {
    
  •            sb.append(':');
    
  •        }
    
  •    }
    
  •    return sb.toString().toUpperCase(Locale.US);
    
  • }

  • // Add end

  • private void installPackageTracedLI(InstallArgs args, PackageInstalledInfo res) {
    try {
    Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, “installPackage”);
    @@ -18771,6 +18803,20 @@ public class PackageManagerService extends IPackageManager.Stub
    return;
    }

  •    // Add by shenhb@topband.com.cn, for only allow the specified signature apk.
    
  •    String customSignature = SystemProperties.get("ro.signature", "");
    
  •    if (!TextUtils.isEmpty(customSignature)) {
    
  •        final Signature[] signatures = pkg.mSignatures;
    
  •        Slog.d(TAG, "installPackageLI, Signature fingerprint "
    
  •                + getFingerprint(signatures[0], "SHA-1"));
    
  •        if (!getFingerprint(signatures[0], "SHA-1").equals(customSignature)) {
    
  •            res.setError(PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE,
    
  •                    "Signature verification failed");
    
  •            return;
    
  •        }
    
  •    }
    
  •    // Add end
    
  •    // Get rid of all references to package scan path via parser.pp = null;String oldCodePath = null;
    

二、属性配置签名sha1

考虑到方案的通用性,因此通过属性来配置签名。属性不配置的情况下,走Android默认逻辑,允许安装所有apk。属性配置后,只允许跟此签名匹配的apk安装。

2.1 获取签名sha1
解压apk文件,提到META-INF/CERT.RSA(既签名文件公钥)。
执行下面命令得到公钥sha1值。
F:\download
λ keytool -printcert -file CERT.RSA
所有者: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=china
发布者: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=china
序列号: xxxxxxx
有效期开始日期: Sun Feb 11 14:38:48 CST 2018, 截止日期: Thu Feb 05 14:38:48 CST 2043
证书指纹:
MD5: 13:8A:22:DC:6E:6C:BA:27:42:8D:9F:C5:0D:D2:4E:14
SHA1: 31:4E:FC:8C:68:FA:7E:F4:14:E7:27:C3:A9:C4:9C:F1:AB:1C:64:C2
SHA256: 63:E0:0A:FF:45:7C:03:97:F5:27:64:C5:D4:DA:BD:8A:2E:63:40:E7:31:A3:C8:3D:FB:03:00:2A:9F:BE:71:EF
签名算法名称: SHA256withRSA
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: C9 41 D4 8D F0 58 FF E2 EE EF 7E 5E 3B 9D DA 44 .A…X…^;…D
0010: 40 E5 DF FC @…
]
]
2.2 配置属性
ro.signature=31:4E:FC:8C:68:FA:7E:F4:14:E7:27:C3:A9:C4:9C:F1:AB:1C:64:C2

三、验证

验证结果如下,非指定签名的apk安装失败,提示“Signature verification failed”,指定签名的apk安装成功。

λ adb install 001.apk
adb: failed to install 001.apk: Failure [INSTALL_FAILED_VERIFICATION_FAILURE: Signature verification failed]

λ adb install 002.apk
Success

Android仅允许安装指定签名apk相关推荐

  1. 如何在Android模拟器上安装和卸载APK程序包

    如何在Android模拟器上安装和卸载APK程序包 Android, 程序包, APK, 卸载, 模拟 一,安装APK          安装APK当然首先是要有模拟器,和要安装的APK包,这个不多废 ...

  2. Android中代码运行指定的Apk

    有时候,当我们编写自己的应用的时候,需要通过代码实现指定的apk,安装指定的主题,或者安装新的apk.可以通过以下方法实现: private void installAPK(String apkUrl ...

  3. 【Android】提取Android中已安装app的apk

    提取Android中已安装的apk,这个需求很多时候都会遇到.比如从google play上安装过apk后,如何提取出来给别人用? 本文1. 先介绍转载的apk提取方法并 2. 验证提取出来的apk和 ...

  4. android adb命令安装和删除apk应用

    一.环境 android 开发 android sdk都应该下载了. 老版本adb在...AppData\Local\Android\sdk\tools 文件夹下 新版本Sdk ..AppData\L ...

  5. android手机如何安装apk文件,如何安装APK文件到自己的android手机里?.doc

    如何安装APK文件到自己的android手机里? 很多朋友刚拿到G1的时候大概首先就是要往里面装软件了,在ANDROID平台下安装文件的后缀名为".apk",就好像PC上的安装文件 ...

  6. android 无法安装测试版本,在测试应用更新时,安装无提示阻止Android版本构建签名APK...

    当我尝试更新我的应用程序(在已经从playstore安装的应用程序上手动安装带有更高版本的已签名APK)时,它未被安装(" 应用程序未安装")并在Studio中显示以下错误: I/ ...

  7. Android Studio生成APK自动追加版本号 自定义apk名称 指定签名证书文件

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50538148   文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一 ...

  8. Android Studio 打包、生成jks密钥、签名Apk、多渠道打包

    一.生成jks签名文件 1.选择Build > Generate Signed APK- 2.选择Create new- 3.选择签名文件的路径,这些信息和eclipse一样了,填完点击OK 即 ...

  9. android 更新apk 应用为安装,应用未安装!从Android Studio构建安装APK时出错 - java

    通过android studio生成签名的apk后,在安装发布的apk时,手机显示错误: 应用未安装 我在这个应用程式中遇到这个问题.我已经在处理它,并安装了与安装它相同的apk. 我已经尝试过这些: ...

最新文章

  1. 无法解决 equal to 操作中 Chinese_PRC_CI_AS_WS 和 Chinese_PRC_CI_AS 之间的排序规则冲突...
  2. 二十二、面试必备:final、finally、finalize有什么不同?
  3. 为什么JavaScript仅在IE中打开开发人员工具一次后才能工作?
  4. 看了看几个数据库厂商的发展历史
  5. Response常用方法
  6. [病毒分析]熊猫烧香应急处理方法
  7. java blazeds,java web开发学习-8 BlazeDS
  8. win10如何切换计算机用户,win10账户切换,教您win10怎么切换账户
  9. WRF学习笔记二:WRF-chem简单入门运行指南
  10. 可以修饰的基团有:氨基类,NHBOC类,Fmoc类不等,DSPE-PEG7-Mal
  11. 阿里云Linux服务器部署Mysql,JDK以及Tomcat教程
  12. 苹果和Android用点应用对比是真的吗,苹果手机与安卓手机相比,真的是苹果手机完胜吗...
  13. java静态网页_【屌炸天源码分享】《企业网站html静态网页模板》
  14. antDesignPro线上刷新404 和 liunx部署使用mock数据 umi-serve + pm2
  15. Java程序员发展道路
  16. 算法手撕代码51~55
  17. 计算机组成原理小白教程
  18. python控制程控电源_六大步骤认识程控电源的界面操作
  19. nginx+php https 实践
  20. Linux实验心得——进程管理

热门文章

  1. 移动互联网十大创新应用
  2. ES6之Array.from()
  3. C++的lib文件到底是什么
  4. opencv 所有lib文件
  5. VVC 算法描述 R2002(VTM 9) IBC部分 机器翻译
  6. Python+Vue计算机毕业设计高校田径运动会管理wd4hn(源码+程序+LW+部署)
  7. Python 写入XLSX文件的几种方法
  8. linux防火墙关了端口还是不通,为什么linux防火墙关了 端口不通
  9. Win11系统禁止关机键关机的方法教学
  10. 超定方程组最小二乘法(内含代码)