说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除

作者: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签名校验相关推荐

  1. android签名校验代码,Android签名验证解析

    1.本文主要内容 知识回顾 签名验证解析 总结 本文介绍下Android在安装apk时,对签名的验证过程 2.知识回顾 在Android签名过程详解一文中,我已经详细说明签名的过程以及为什么要这么做, ...

  2. 面试:Android 签名校验机制 v1、v2、v3

    探究 Android 签名机制和原理 - 腾讯云开发者社区-腾讯云 一.APK签名可以带来以下好处 应用程序升级 如果想无缝升级一个应用,Android系统要求应用程序的新版本与老版本具有相同的签名与 ...

  3. 最常见的Android签名校验

    仅用来记录将Signature对象转化为MD5字符串的方法. /*** MD5加密** @param byteStr 需要加密的内容* @return 返回 byteStr的md5值*/public ...

  4. Android签名机制及PMS中校验签名

    一.签名机制 众所周知,在Android系统中,应用想要安装到设备中,必须要有签名才行,及时是debug的时候,开发工具也会对要运行的应用自动签名,那么我们先来了解一下这个签名究竟是什么. 首先And ...

  5. Android签名机制及PMS中校验流程(雷惊风)

    @Android签名机制及PMS中校验流程(雷惊风) 网上看到一篇比较好的关于Android签名的文章,但是文章链接不安全,不知道哪天会不会找不到了,而且需要关注才能查看完整版,所以在这里记录一下,原 ...

  6. Android学习笔记——Android 签名机制详解

    Android 签名机制详解 近期由于工作需要在学习 Android 的签名机制,因为没有现成资料,只能通过开发者文档和阅读博客的方式对 Android 签名机制进行大致了解.过程中查阅到的资料相对零 ...

  7. Android-APK:为何你的应用老是被破解,该如何有效地做签名校验

    /** 做普通的签名校验 */ private boolean doNormalSignCheck() { String trueSignMD5 = "d0add9987c7c84aeb71 ...

  8. Android应用安全与防范之签名校验

    2019独角兽企业重金招聘Python工程师标准>>> Android黑产品里面有一个叫做二次打包,也称为重打包.通过反编译应用后,可以得到smali源码,往其中注入代码或者修改相应 ...

  9. android ota 版本校验,OTA升级签名校验简析

    1. 概要 如果进行过OTA升级的开发者,都或多或少有这样的疑问,如何确定该OTA升级包是可以信任的呢?这其中其实涉及到一个签名验证的流程. 2. 签名生成 在生成正规的固件时,一般会运行生成新key ...

  10. Android签名与校验过程详解

    原文:https://blog.csdn.net/gulinxieying/article/details/78677487 目 录 一.签名与校验原理概要    2 1.数字签名简介    2 2. ...

最新文章

  1. 企业域名更换操作系列1:为什么要进行域名更换及更换需要注意事项
  2. php 预订义变量,预约义变量 PHP
  3. IE6左右边框断线现象
  4. Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary
  5. python sql server 数据同步_两台SQL Server数据同步解决方案
  6. JQuery修改background-image背景图片
  7. X-Frame-Options 配置
  8. ubuntu14.04-64位机配置android开发环境,ADT,sdk,eclipsea
  9. html form urlencode,form-data和x-www-form-urlencode的区别
  10. Silverlight C# 游戏开发:自定义鼠标(一)
  11. oracle extract类型,Oracle中extract()函数
  12. 【图像跟踪】基于matlab GUI均值漂移图像跟踪【含Matlab源码 743期】
  13. 多种CAML条件的查询
  14. win7计算机远程桌面连接,教您win7远程桌面连接
  15. Html中的favicon ico
  16. eclipse IED的优化(gc.log)
  17. 腾讯漫画(js逆向)
  18. 华为IT总监徐家骏的10年
  19. 了解HTT1/HTT2/HTT3 ?
  20. MySQL数据库(练习一: 提示:emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno所属部门编号) de)

热门文章

  1. 书写技术文档的模板技术调研文档书写规范
  2. 自动驾驶-激光雷达预处理/特征提取
  3. php alert弹出框位置,jQuery_基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果),原理很简单: 获取当前屏幕( - phpStudy...
  4. MarkDown 和LaTex语法学习(基于软件Typora)
  5. Java实现短信验证码(阿里云)附短信SDK demo下载
  6. 伪随机生成器具体实现——线性同余法
  7. Python模拟黑客帝国影片中的终端动画脚本
  8. 安全bios手册(5)
  9. 下载ts流视频的成功方法
  10. 计算机网络原理最详细解说