Android 获取应用签名

Android 获取应用签名

本文主要讲下在android中如何获取应用签名. 也方便平时用来区分一个应用是不是原包应用.

1: 通过PackageManager获取签名信息

首先,通过packageManager获取到指定应用的PackageInfo. 这里需要传入的flag是PackageManager.GET_SIGNATURES

/*** {@link PackageInfo} flag: return information about the* signatures included in the package.** @deprecated use {@code GET_SIGNING_CERTIFICATES} instead*/
@Deprecated
public static final int GET_SIGNATURES          = 0x00000040;
PackageManager pm = getPackageManager();
List<ApplicationInfo> applications = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo applicationInfo : applications) {try {PackageInfo packageInfo = packageManager.getPackageInfo(applicationInfo.packageName, PackageManager.GET_SIGNATURES);Signature[] signs = packageInfo.signatures;} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}
}

2: 获取SHA1

public class ShaUtils {public static String getSHA1(byte[] sig) {final char[] hexArray = "0123456789ABCDEF".toCharArray();try {MessageDigest md = MessageDigest.getInstance("SHA1");byte[] digest = md.digest(sig);char[] hexChars = new char[digest.length * 2];for (int j = 0; j < digest.length; j++) {int v = digest[j] & 0xFF;hexChars[j * 2] = hexArray[v >>> 4];hexChars[j * 2 + 1] = hexArray[v & 0x0F];}return new String(hexChars);} catch (Throwable e) {e.printStackTrace();}return "";}}

下面是整理的一个小demo,展示当前设备的应用列表以及应用签名,包名,icon信息.

创建mainacitity

public class MainActivity extends AppCompatActivity {private GridView gridView;private ApkAdapter apkAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);gridView = findViewById(R.id.grid_sign);PackageManager packageManager = getPackageManager();List<ApplicationInfo> installedApplications = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);apkAdapter = new ApkAdapter(installedApplications, this);gridView.setAdapter(apkAdapter);}}

acitivity布局如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><GridViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:numColumns="1"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"android:id="@+id/grid_sign"/>
</androidx.constraintlayout.widget.ConstraintLayout>

ApkAdapter代码如下:

public class ApkAdapter extends BaseAdapter {private List<ApplicationInfo> list;private Context context;private PackageManager packageManager;public ApkAdapter(List<ApplicationInfo> list, Context context) {this.list = list;this.context = context;packageManager = context.getPackageManager();}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View view, ViewGroup parent) {if (view == null) {view = LayoutInflater.from(context).inflate(R.layout.item_apk, parent, false);}ApplicationInfo applicationInfo = list.get(position);ImageView icon = (ImageView) view.findViewById(R.id.item_icon);icon.setImageDrawable(applicationInfo.loadIcon(packageManager));TextView label = (TextView) view.findViewById(R.id.item_name);label.setText(applicationInfo.packageName);TextView sign = (TextView) view.findViewById(R.id.item_sign);StringBuilder stringBuilder = new StringBuilder();try {PackageInfo packageInfo = packageManager.getPackageInfo(applicationInfo.packageName, PackageManager.GET_SIGNATURES);Signature[] signs = packageInfo.signatures;for (Signature sig : signs) {String sha1 = ShaUtils.getSHA1(sig.toByteArray());stringBuilder.append("Signature: "+sha1+"\n");Log.d("Signature", "packageName = " + packageInfo.packageName + ", signature = " + sha1);}sign.setText(stringBuilder.toString());} catch (Throwable e) {Log.e("Signature", "getView: ", e);}return view;}
}

以及item的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"android:layout_height="100dp"><ImageViewandroid:layout_width="80dp"android:layout_height="80dp"android:id="@+id/item_icon"android:layout_margin="10dp"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_toRightOf="@+id/item_icon"android:layout_marginTop="10dp"android:layout_marginRight="10dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16sp"android:text="xxx"android:layout_alignParentTop="true"android:textColor="@color/black"android:id="@+id/item_name"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ff0000"android:textSize="14sp"android:layout_alignParentBottom="true"android:layout_marginBottom="10dp"android:text="xxxxxxxxx"android:id="@+id/item_sign"/></RelativeLayout></RelativeLayout>

最后展示下效果图:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 汽车单车模型固定点跟踪算法

1、内容简介 略 29-可以交流、咨询、答疑 2、内容说明 单车模型固定点跟踪算法 单车模型&#xff0c;固定点跟踪算法&#xff0c;动画演示&#xff0c; 汽车单车模型、转弯动画、固定点跟踪算法、pid控制 3、仿真分析 略 A[0,5;0,0];B[0;1]; Q10*eye(2);R1; Klqr(A…

2015年五一杯数学建模A题不确定性条件下的最优路径问题解题全过程文档及程序

2015年五一杯数学建模 A题 不确定性条件下的最优路径问题 原题再现 目前&#xff0c;交通拥挤和事故正越来越严重的困扰着城市交通。随着我国交通运输事业的迅速发展&#xff0c;交通“拥塞”已经成为很多城市的“痼疾”。在复杂的交通环境下&#xff0c;如何寻找一条可靠、快…

C++利剑string类(详解)

前言&#xff1a;大家都知道在C语言里面的有 char 类型&#xff0c;我接下来要讲的 string 类功能是使用 char 类型写的类&#xff0c;当然这个是C官方写的&#xff0c;接下来我们将会学会使用它&#xff0c;我们会发现原来 char 这种类型是还能这么好用&#xff0c;授人以…

数学建模-基于LightGBM和BP神经网络的互联网招聘需求分析与预测

基于LightGBM和BP神经网络的互联网招聘需求分析与预测 整体求解过程概述(摘要) 就业是民生之本&#xff0c;是发展之基&#xff0c;也是安国之策。2020 年新冠肺炎疫情的爆发&#xff0c;稳就业成为应对疫情、稳定社会的重要保障之一。随着数据新动能的发展&#xff0c;互联网…

【Linux】Ubuntu添加root用户

在Ubuntu中&#xff0c;默认情况下是禁用了root用户的登录。如果仍然想要启用root用户&#xff0c;并设置root用户的密码&#xff0c;应按照以下步骤进行操作&#xff1a; 一、输入sudo passwd root设置root用户密码 二、切换root用户 sudo -i su root 这两条命令均可却换至…

Tkinter 面向对象框架《一》

一、说明 在本教程中&#xff0c;您将学习如何在 Tkinter 中应用面向对象编程以使代码更有条理。首先介绍Tk下小部件&#xff0c;然后介绍Ttk小部件&#xff0c;即如何从ttk.Frame类继承并在根窗口中使用它。 二、定义 Tkinter 面向对象的窗口 2.1 最基本的对象 以下简单程序创…

数字媒体技术基础之:栅格图像与矢量图形

使用各种软件创建不同类型的复合图像和图稿时&#xff0c;常会遇到基本的数字图像类型&#xff1a;栅格图像和矢量图像。 ◆ ◆ ◆ 栅格图像 栅格图像是基于像素的图像&#xff0c;故又称为“像素图像”或“位图图像”&#xff0c;主要用于编辑照片或制作可在 Web 上轻松使用…

C#语言高阶开发

目录 数据结构 集合 动态数组ArrayList 习题&#xff1a;声明一个Monster类&#xff0c;有一个Attack方法,用一个ArrayList去封装Monster的对象,装10个&#xff0c;遍历monster的list让他们释放攻击方法 哈希表HashTable 创建一个武器类&#xff0c;有一个属性叫做id,每个…

循环队列的结构设计和基本操作的实现(初始化,入队,出队,判空,获取长度,清空,销毁)

目录 1.队列的定义 2.循环队列的设计图示 3.循环队列的结构设计 4.循环队列的实现 5.循环队列的总结 1.队列的定义 和栈相反,队列(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素. 在队列中,允许插入的一…

数据结构与算法之美学习笔记:29 | 堆的应用:如何快速获取到Top 10最热门的搜索关键词?

目录 前言堆的应用一&#xff1a;优先级队列堆的应用二&#xff1a;利用堆求 Top K堆的应用三&#xff1a;利用堆求中位数解答开篇内容小结 前言 本节课程思维导图&#xff1a; 搜索引擎的热门搜索排行榜功能你用过吗&#xff1f;搜索引擎每天会接收大量的用户搜索请求&#x…

Shell循环:for(三)

示例&#xff1a;使用for实现批量主机root密码的修改 一、前提 已完成密钥登录配置&#xff08;ssh-keygen&#xff09;定义主机地址列表并了解远程修改密码的方法 [rootlocalhost ~]# ssh-keygen #设置免密登录[rootlocalhost ~]# ssh-copy-id 192.168.151.151 二、演示…

Linux进程详解

Linux进程详解 1、进程概述1.1并行和并发1.2 PCB1.3 进程状态1.4 进程命令 2、进程创建2.1 函数2.2 fork()解析 3、父子进程3.1 进程执行位置3.2 循环创建子进程3.3 终端显示问题3.4 进程数数 4、execl和execlp4.1 execl()4.2 execlp()4.3 函数的使用 5、进程控制5.1 结束进程5…

Oracle忘记所有密码怎么办

最近遇到一个Oracle的问题&#xff0c;密码要过期了&#xff0c;但是除了用户密码&#xff0c;其他密码都不知道了&#xff0c;修改不了密码怎么办呢&#xff1f; 试了各种方法&#xff0c;最终下面的方式生效了&#xff1a; 首先&#xff0c;使用orapwd生成新的密码文件&…

selenium 工具 的基本使用

公司每天要做工作汇报&#xff0c;汇报使用的网页版&#xff0c; 所以又想起 selenium 这个老朋友了。 再次上手&#xff0c;发现很多接口都变了&#xff0c; 怎么说呢&#xff0c; 应该是易用性更强了&#xff0c; 不过还是得重新看看&#xff0c; 我这里是python3。 pip安装…

有文件实体的后门无文件实体的后门rootkit后门

有文件实体后门和无文件实体后门&RootKit后门 什么是有文件的实体后门&#xff1a; 在传统的webshell当中&#xff0c;后门代码都是可以精确定位到某一个文件上去的&#xff0c;你可以rm删除它&#xff0c;可以鼠标右键操作它&#xff0c;它是有一个文件实体对象存在的。…

熬夜会秃头——beta冲刺Day4

这个作业属于哪个课程2301-计算机学院-软件工程社区-CSDN社区云这个作业要求在哪里团队作业—beta冲刺事后诸葛亮-CSDN社区这个作业的目标记录beta冲刺Day4团队名称熬夜会秃头团队置顶集合随笔链接熬夜会秃头——Beta冲刺置顶随笔-CSDN社区 一、团队成员会议总结 1、成员工作进…

(详细教程)笔记本电脑安装Ubuntu系统

1.前言 老的小米笔记本淘汰了&#xff0c;装一下linux系统玩一下。 使用工具如下&#xff1a;一台小米笔记本pro15.6一个惠普32G U盘一个台式机用于下载镜像等资源 2.下载Ubuntu桌面版 cn.ubuntu.com/download/de… 这里我下载的是 22.04.3 LTS 3.下载烧录工具&#xff0c…

Lattice-Based Blind Signatures: Short, Efficient, and Round-Optimal

目录 摘要引言 Lattice-Based Blind Signatures: Short, Efficient, and Round-Optimal CCS 2023 摘要 我们提出了一种基于随机预言机启发式和标准格问题&#xff08;环/模块SIS/LWE和NTRU&#xff09;的2轮盲签名协议&#xff0c;签名大小为22KB。该协议是全面优化的&#xf…

如何做接口测试?接口测试工具有哪些?

回想入职测试已经10年时间了&#xff0c;初入职场的我对于接口测试茫然不知。后来因为业务需要&#xff0c;开始慢慢接触接口测试。从最开始使用工具进行接口测试到编写代码实现接口自动化&#xff0c;到最后的测试平台开发。回想这一路走来感触颇深&#xff0c;因此为了避免打…

分享82个节日PPT,总有一款适合您

分享82个节日PPT&#xff0c;总有一款适合您 82个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1boDTl3PiHFXLJ890CoUfJA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。…