Android App程序应用未校验签名证书——————《风险等级高》

在这里插入图片描述

目录

      • 应用签名未校验风险
      • 1、检测目的
      • 2、风险等级
      • 3、检测依据
      • 4、风险描述
      • 5、检测步骤
      • 6、结果描述
      • 7、解决方案
        • 7.1、Android 检验 APK 是否签名的代码
        • 7.2、检验APK签名
      • 8、结尾

应用签名未校验风险

1、检测目的

检测App程序启动时是否校验签名证书。

防止App的盗版率。未进行签名证书的App,可能被反编译后进行二次打包。

重新打包签名的应用,可能导致App被仿冒盗版,影响其合法收入,甚至可能被添加钓鱼代码、病毒代码、恶意代码,导致用户敏感信息泄露或者恶意攻击。

2、风险等级

高。

3、检测依据

《GBT28448-2019 信息安全技术 网络安全等级保护测评要求》,【移动应用管控】测评单元 (L3-CES3-04):应只允许指定证书签名的应用软件安装和运行。

【移动应用软件开发】测评单元 (L3-CMS3-04):应保证开发移动业务应用软件的签名证书合法性。

中国信息安全测评中心旗下“国家信息安全漏洞库“关联漏洞编号:CNNVD-201307-154;CVE-2013-4787《DL/T 2031-2019 电力移动应用软件测试规范》9.2.2.8.1 c)基于Android开发的移动应用应对签名信息进行安全校验。

4、风险描述

签名证书是对App开发者身份的唯一标识,开发者可利用签名证书有效降低App的盗版率。

未进行签名证书的App,可能被反编译后进行二次打包。

重新打包签名的应用,可能导致App被仿冒盗版,影响其合法收入,甚至可能被添加钓鱼代码、病毒代码、恶意代码,导致用户敏感信息泄露或者恶意攻击。

5、检测步骤

  1. 对应用APK包进行重新签名打包。
  2. 然后执行命令安装到android设备上,查看是否安装成功,同时启动重新签名的应用,根据运行日志和执行任务栈分析是否可以成功启动且未弹出任何警告信息,是,则存在风险;否,则安全

6、结果描述

如果App程序未对签名证书进行校验,被其他证书重新签名后可以照常启动。

日志信息:

--------- beginning of main
--------- beginning of system
12-19 09:21:57.693   113   304 I ActivityManager: START u0 {flg=0x10000000 cmp=com.harry.demo/.activity.WelcomeActivity} from uid 2000 on display 0
12-19 09:21:57.713   113   496 I ActivityManager: Start proc 16142:com.harry.demo/u0a58 for activity com.harry.demo/.activity.WelcomeActivity
12-19 09:21:58.476   113   496 I ActivityManager: Start proc 16183:com.harry.demo:ipc/u0a58 for service com.harry.demo/io.rong.imlib.ipc.RongService
12-19 09:21:58.518   113   495 I ActivityManager: Start proc 16205:io.rong.push/u0a58 for service com.harry.demo/io.rong.push.rongpush.PushService
12-19 09:21:59.048   113   134 I ActivityManager: Displayed com.harry.demo/.activity.WelcomeActivity: +1s346ms (total +1m43s74ms)
12-19 09:22:00.617   113   495 I ActivityManager: START u0 {cmp=com.harry.demo/.activity.WelcomeGuideActivity} from uid 10058 on display 0
12-19 09:22:00.998   113   134 I ActivityManager: Displayed com.harry.demo/.activity.WelcomeGuideActivity: +375ms

7、解决方案

App自行增加签名证书的校验代码或使用第三方签名校验保护功能,降低应用被二次打包的风险。

7.1、Android 检验 APK 是否签名的代码

在 Android 开发中,我们常常需要验证 APK 文件是否被正确签名。

APK 签名是一种保障应用安全性的重要方式,通过验证签名可以确保 APK 文件的完整性和来源。

下面将介绍如何在 Android 中使用代码来检验 APK 是否签名。

public class ApkSignatureVerifier {

    public static String md5(byte[] bytes) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] digest = md5.digest(bytes);
            StringBuilder sb = new StringBuilder();
            for (byte b : digest) {
                sb.append(String.format("%02x", b & 0xff));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
}
7.2、检验APK签名

获取到 APK 的签名信息后,我们可以将其与预先保存的正确签名进行比较,来验证 APK 是否被正确签名。

public class WelcomeActivity extends BaseActivity {

    private static final String VALID_SIGNATURE = "69D4D6B18331A2B645286CC80435D605";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        hideTitleBar();
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        try {
            String pkgName = getPackageName();
            PackageInfo mPkgInfo = getPackageManager().getPackageInfo(pkgName, PackageManager.GET_SIGNATURES);
            Signature[] signatures = mPkgInfo.signatures;
            for (Signature sign : signatures) {
                String md5 = ApkSignatureVerifier.md5(sign.toByteArray());
                Log.e("WelcomeActivity >>>", md5);
                assert md5 != null;
                // 不区分大小写
                if (md5.equalsIgnoreCase(VALID_SIGNATURE)) {
                    // APK 签名正确
                    Log.e("APK Signature", "正确");                 
                } else {
                    // APK 签名不匹配
                    Log.e("APK Signature", "不匹配");
                    ToastUtils.showShort(WelcomeActivity.this,"App签名不匹配");
                    finish();
                }
            }
        } catch (Exception e) {

        }
    }

    @Override
    protected View addContentLayout() {
        return getLayoutInflater().inflate(R.layout.activity_start, contentLayout, false);
    }
}

在以上示例代码中,我们将获取到的签名信息与一个预先保存的有效签名进行比较。如果签名匹配,则说明 APK 签名是有效的;如果签名不匹配,则说明 APK 签名是无效的。

8、结尾

通过以上代码示例,我们可以在 Android 开发中使用 Java 代码来检验 APK 是否签名。这样可以确保 APK 文件的完整性和来源,从而提高应用的安全性。

在实际开发中,我们可以将验证签名的逻辑应用在应用启动时或者下载 APK 文件后进行检验,以确保应用的安全性。

以上是关于 Android 检验 APK 是否签名的代码示例,希望能对你有所帮助!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/261298.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jQuery实现轮播图代码

简述 一个简单的jQuery轮播图代码,首先,定义了一个slideshow-container的div容器,其中包含了所有轮播图幻灯片。每个幻灯片都包含一个mySlides的类名,并且使用CSS将其隐藏。然后,使用JavaScript代码来控制幻灯片的显示和隐藏。在showSlides()函数中,遍历所有幻灯片并将它…

JPEG文件内嵌HTML代码(JavaScript型图片马)

基础概念 0xFFD8:jpeg文件开始标志; 0xFFFE:jpeg文件注释开始标志; 0x0166:注释后紧跟的16进制数值,被选中部分长度为358字节,换算为16进制为166; 0xFFE0:标志图片内容开…

docker 部署kafka

随笔记录 目录 1. 安装zookeeper 2. 安装Kafka 2.1 拉取kafka image 2.2 查询本地docker images 2.3 查看本地 容器(docker container) 2.3.1 查看本地已启动的 docker container 2.3.2 查看所有容器的列表,包括已停止的容器。 2.4 …

Mybatis-Plus的分页语句流程保姆级分析(四)

group : com.baomidou version:3.5.2.2-SNAPSHOT 为什么要分析分页流程 因为我在使用的时候发现分页不生效,得分析一下找到原因。 问题描述: 我的分页不生效。 com.baomidou.mybatisplus.extension.plugins.pagination的Page对象。 代码如下&#x…

【数据结构】线段树算法总结(区间修改)

知识概览 线段树一般有5个操作: pushup:用子节点更新当前节点信息pushdown:把懒标记往下传build:初始化一棵树modify:修改一个区间query:查询一个区间 不带懒标记(支持单点修改)的线…

猫罐头那种好吃又健康?五大值得买的猫罐头推荐

很多新手养猫的姐妹们都会为选罐头感到焦虑!但是每种罐头都有优缺点,每只猫咪的胃口也都不同,只有适合自家猫的才是最好的。所以姐妹们在选罐头之前可以先做好功课,了解一下怎么选好的罐头。 作为一个已经离职的宠物医生&#xff…

6.6TB 全球地名路网透明标签瓦片地图

但凡要干一件稍微有意义的事,总会需要一定的时间积累,甚至还需要下不少的笨工夫,也正因如此,才会让这些最终做成的事更具有价值和意义。 比如我们曾在一个项目的助推下,就干了一件比较有意义的事情,尽管投入…

从实践角度优化数据库设计:深入解析三范式的应用

总述 第一范式(1NF):要求关系模式中的每个属性都是不可分的数据项,即属性具有原子性。第二范式(2NF):在满足1NF的基础上,要求关系模式中的所有非主属性都完全函数依赖于整个候选键(或主键)。第三范式(3NF):在满足2NF的基础上,要求关系模式中的每个非主属性都不传…

虚拟机的下载、安装

下载 vmware workstation(收费的虚拟机) 下载vbox 网址:Oracle VM VirtualBox(免费的虚拟机) 以下选择一个下载即可,建议下载vbox,因为是免费的。安装的时候默认下一步即可(路径最好…

java并发编程四 Monitor 概念,api介绍与线程状态转换

Monitor 概念 Java 对象头 以 32 位虚拟机为例子: 普通对象 数组对象 其中 Mark Word 结构为 64 位虚拟机 Mark Word 小故事 故事角色 老王 - JVM小南 - 线程小女 - 线程房间 - 对象房间门上 - 防盗锁 - Monitor房间门上 - 小南书包 - 轻量级锁房间门上 -…

【实战】如何在Docker Image中轻松运行MySQL

定义 使用Docker运行MySQL有许多优势。它允许数据库程序和数据分离,增强了数据的安全性和可靠性。Docker Image的轻便性简化了MySQL的部署和迁移,而Docker的资源隔离功能确保了应用程序之间无冲突。结合中间件和容器化系统,Docker为MySQL提供…

java Filter内存马分析

目录 0x01 什么是Filter马 0x02 环境搭建 0x03 Filter内存马探索 1.tomcat Filter 的流程分析 2.攻击思路分析 0x04 Filter内存马exp编写 本文由掌控安全学院 - xilitter 投稿 知识基础: 刚开始内存马的这块学习与反序列化并无太大关系,反而与ja…

如何制作一本电子产品图册,打开线上推广呢

​随着互联网的普及和社交媒体的兴起,越来越多的企业开始注重线上传播。对于产品而言,制作一本精美的产品图册不仅可以展示产品的外观和特点,还可以通过线上传播吸引更多的潜在客户。 不会制作的朋友们,其实也不用担心&#xff0c…

使用 uiautomatorviewer 获取元素的定位信息

1. 使用 adb 连接设备(真机或模拟器) 连接夜神模拟器:adb connect 127.0.0.1:62001 连接MuMu模拟器:adb connect 127.0.0.1:7555 2. 打开 uiautomatorviewer 在 android-sdk --> tools 目录,找到 uiautomatorvie…

LeetCode Hot100 215.数组中的第k个最大元素

题目: 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 方法一&#xff…

获取请求体中json数据并解析到实体对象

目录 相关依赖 前端代码 后端代码 测试结果 相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version> </dependency> <dependency><groupId>comm…

上传app到app store的完整流程

上传ios的app到app store首先需要一个打包好的ipa文件。 要上传这个ipa必须要使用同一个苹果开发者账号的证书打包&#xff0c;才能上架到同一个app store上&#xff0c;假如是使用别人的证书打包的&#xff0c;只能上传到别人的app store账号。 假如你还没有创建证书&#x…

route 路由使用记录

一、路由的基本介绍 路由是计算机网络中的一个重要概念&#xff0c;它用于确定数据包从源地址到目的地址的路径。在网络中&#xff0c;路由器是负责转发数据包的设备。 下面是关于路由的基本知识和使用方法的介绍&#xff1a; 路由表&#xff1a;路由器通过路由表来确定数据包…

Excel 理解IF({1,0}...结构啥意思

背景知识&#xff1a; IF(条件,是则结果,否则结果) 逻辑真除了用True以外&#xff0c;还可以用不为0的数值&#xff0c;常用的是1&#xff1b;逻辑假除了用Fasle以外&#xff0c;还可以用数值0 理解公式 IF({1,0},B2:B8&C2:C8,D2:D8)就是构造一个二维数组&#xff0c;把…

Unity中Shader平移矩阵

文章目录 前言方式一&#xff1a;对顶点本地空间下的坐标进行相加平移1、在属性面板定义一个四维变量记录在 xyz 上平移多少。2、在常量缓冲区进行申明3、在顶点着色器中&#xff0c;在进行其他坐标转化之前&#xff0c;对模型顶点本地空间下的坐标进行转化4、我们来看看效果 方…