Android签名校验
说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除
作者:zhu6201976
博客:https://blog.csdn.net/zhu6201976
一、什么是签名校验?为防止apk被反编译重新打包,采取的运行时签名校验方式。
二、核心代码
public class SignCheck {private Context context;private String cer = null;private String realCer = null;private static final String TAG = "SignCheck";public SignCheck(Context context) {this.context = context;this.cer = getCertificateSHA1Fingerprint();}public SignCheck(Context context, String realCer) {this.context = context;this.realCer = realCer;this.cer = getCertificateSHA1Fingerprint();}public String getRealCer() {return realCer;}/*** 设置正确的签名** @param realCer*/public void setRealCer(String realCer) {this.realCer = realCer;}/*** 获取应用的签名** @return*/public String getCertificateSHA1Fingerprint() {//获取包管理器PackageManager pm = context.getPackageManager();//获取当前要获取 SHA1 值的包名,也可以用其他的包名,但需要注意,//在用其他包名的前提是,此方法传递的参数 Context 应该是对应包的上下文。String packageName = context.getPackageName();//返回包括在包中的签名信息int flags = PackageManager.GET_SIGNATURES;PackageInfo packageInfo = null;try {//获得包的所有内容信息类packageInfo = pm.getPackageInfo(packageName, flags);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}//签名信息Signature[] signatures = packageInfo.signatures;byte[] cert = signatures[0].toByteArray();//将签名转换为字节数组流InputStream input = new ByteArrayInputStream(cert);//证书工厂类,这个类实现了出厂合格证算法的功能CertificateFactory cf = null;try {cf = CertificateFactory.getInstance("X509");} catch (Exception e) {e.printStackTrace();}//X509 证书,X.509 是一种非常通用的证书格式X509Certificate c = null;try {c = (X509Certificate) cf.generateCertificate(input);} catch (Exception e) {e.printStackTrace();}String hexString = null;try {//加密算法的类,这里的参数可以使 MD4,MD5 等加密算法MessageDigest md = MessageDigest.getInstance("SHA1");//获得公钥byte[] publicKey = md.digest(c.getEncoded());//字节到十六进制的格式转换hexString = byte2HexFormatted(publicKey);} catch (NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (CertificateEncodingException e) {e.printStackTrace();}return hexString;}//这里是将获取到得编码进行16 进制转换private String byte2HexFormatted(byte[] arr) {StringBuilder str = new StringBuilder(arr.length * 2);for (int i = 0; i <arr.length; i++) {String h = Integer.toHexString(arr[i]);int l =h.length();if (l == 1)h = "0" + h;if (l > 2)h = h.substring(l - 2, l);str.append(h.toUpperCase());if (i < (arr.length - 1))str.append(':');}return str.toString();}/*** 检测签名是否正确* @return true 签名正常 false 签名不正常*/public boolean check() {if (this.realCer != null) {cer = cer.trim();realCer = realCer.trim();if (this.cer.equals(this.realCer)) {return true;}}else {Log.e(TAG, "未给定真实的签名 SHA-1 值");}return false;}
}
三、使用方式
1.使用 keytool 获取签名 sha-1 值,命令: keytool -list -v -keystore *.jks
*.jks 为签名文件,此处会提示输入 keystore 密码
签名文件在eclipse 是 .keystore 文件, 在 Android Studio中是 .jks 文件
2.调用
SignCheck signCheck = new SignCheck(this,"27:19:6E:38:6B:87:5E:76:AD:F7:00:E7:EA:84:E4:C6:EE:E3:3D:FA");if(signCheck.check()) {//TODO 签名正确}else {//TODO 签名错误newAlertDialog.Builder(this).setMessage("请前往官方渠道下载正版 app, http://.....").setPositiveButton("确定",null).show();}
Android签名校验相关推荐
- android签名校验代码,Android签名验证解析
1.本文主要内容 知识回顾 签名验证解析 总结 本文介绍下Android在安装apk时,对签名的验证过程 2.知识回顾 在Android签名过程详解一文中,我已经详细说明签名的过程以及为什么要这么做, ...
- 面试:Android 签名校验机制 v1、v2、v3
探究 Android 签名机制和原理 - 腾讯云开发者社区-腾讯云 一.APK签名可以带来以下好处 应用程序升级 如果想无缝升级一个应用,Android系统要求应用程序的新版本与老版本具有相同的签名与 ...
- 最常见的Android签名校验
仅用来记录将Signature对象转化为MD5字符串的方法. /*** MD5加密** @param byteStr 需要加密的内容* @return 返回 byteStr的md5值*/public ...
- Android签名机制及PMS中校验签名
一.签名机制 众所周知,在Android系统中,应用想要安装到设备中,必须要有签名才行,及时是debug的时候,开发工具也会对要运行的应用自动签名,那么我们先来了解一下这个签名究竟是什么. 首先And ...
- Android签名机制及PMS中校验流程(雷惊风)
@Android签名机制及PMS中校验流程(雷惊风) 网上看到一篇比较好的关于Android签名的文章,但是文章链接不安全,不知道哪天会不会找不到了,而且需要关注才能查看完整版,所以在这里记录一下,原 ...
- Android学习笔记——Android 签名机制详解
Android 签名机制详解 近期由于工作需要在学习 Android 的签名机制,因为没有现成资料,只能通过开发者文档和阅读博客的方式对 Android 签名机制进行大致了解.过程中查阅到的资料相对零 ...
- Android-APK:为何你的应用老是被破解,该如何有效地做签名校验
/** 做普通的签名校验 */ private boolean doNormalSignCheck() { String trueSignMD5 = "d0add9987c7c84aeb71 ...
- Android应用安全与防范之签名校验
2019独角兽企业重金招聘Python工程师标准>>> Android黑产品里面有一个叫做二次打包,也称为重打包.通过反编译应用后,可以得到smali源码,往其中注入代码或者修改相应 ...
- android ota 版本校验,OTA升级签名校验简析
1. 概要 如果进行过OTA升级的开发者,都或多或少有这样的疑问,如何确定该OTA升级包是可以信任的呢?这其中其实涉及到一个签名验证的流程. 2. 签名生成 在生成正规的固件时,一般会运行生成新key ...
- Android签名与校验过程详解
原文:https://blog.csdn.net/gulinxieying/article/details/78677487 目 录 一.签名与校验原理概要 2 1.数字签名简介 2 2. ...
最新文章
- 企业域名更换操作系列1:为什么要进行域名更换及更换需要注意事项
- php 预订义变量,预约义变量 PHP
- IE6左右边框断线现象
- Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary
- python sql server 数据同步_两台SQL Server数据同步解决方案
- JQuery修改background-image背景图片
- X-Frame-Options 配置
- ubuntu14.04-64位机配置android开发环境,ADT,sdk,eclipsea
- html form urlencode,form-data和x-www-form-urlencode的区别
- Silverlight C# 游戏开发:自定义鼠标(一)
- oracle extract类型,Oracle中extract()函数
- 【图像跟踪】基于matlab GUI均值漂移图像跟踪【含Matlab源码 743期】
- 多种CAML条件的查询
- win7计算机远程桌面连接,教您win7远程桌面连接
- Html中的favicon ico
- eclipse IED的优化(gc.log)
- 腾讯漫画(js逆向)
- 华为IT总监徐家骏的10年
- 了解HTT1/HTT2/HTT3 ?
- MySQL数据库(练习一: 提示:emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno所属部门编号) de)
热门文章
- 书写技术文档的模板技术调研文档书写规范
- 自动驾驶-激光雷达预处理/特征提取
- php alert弹出框位置,jQuery_基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果),原理很简单: 获取当前屏幕( - phpStudy...
- MarkDown 和LaTex语法学习(基于软件Typora)
- Java实现短信验证码(阿里云)附短信SDK demo下载
- 伪随机生成器具体实现——线性同余法
- Python模拟黑客帝国影片中的终端动画脚本
- 安全bios手册(5)
- 下载ts流视频的成功方法
- 计算机网络原理最详细解说