android 应用内部获取本应用或者相应包名的应用的SHA1签名的办法
我这个人比較懒。每次做的都是心血来潮,所以打算改掉这个坏毛病。昨晚非常晚才睡,躺在床上一直在回忆。这两年来,我以前的目标是什么,我放弃了什么,我完毕了什么。
结果目标非常多,也放弃了一些。
完毕的差点儿没有。想来,还是挺失败的。
生活逐渐磨平了棱角,事实上不怨生活,还是自己信心不够坚定。
不是仅仅有年轻才有梦想,是由于有梦想。所以才年轻。
那些和我一样以前有些目标,却中途逐渐遗忘的朋友们。坚持下去。身埋黄土半生沙,雕镂逐梦尽铅华。
欢迎转载,请注明出处:http://blog.csdn.net/gaoshouxiaodi/article/details/37821659
哈哈,闲言少叙,言归正传!
在讲正文之前,还是先了解一下:什么是哈希算法?哈希算法将随意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。假设散列一段明文并且哪怕仅仅更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。所以数据的哈希值能够检验数据的完整性。一般用于高速查找和加密算法。
基于哈希的消息验证模式有非常多种: MD2, MD4, MD5,SHA1等。
今天讲的内容是android中。怎样通过代码,在应用内部获得签名的SHA1值。SHA1叫安全哈希算法(Secure
Hash Algorithm)。主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息。SHA1会产生一个160位的消息摘要。当接收到消息的时候。这个消息摘要能够用来验证数据的完整性。
在传输的过程中。数据非常可能会发生变化,那么这时候就会产生不同的消息摘要。
SHA1有例如以下特性:不能够从消息摘要中复原信息。两个不同的消息不会产生相同的消息摘要。 fr=aladdin">》》》引自百度百科
android中获取应用的SHA1有三种方法,一种是:通过keytool工具,在cmd命令中输入 keytool -list -v -keystore
你的签名证书所在位置。比方我的再D盘根文件夹,则输入:keytool -list -v -keystore d:\key2.keystore 回车后输入生成证书的password。
可得到下面信息
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2Fvc2hvdXhpYW9kaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
另外一种获取SHA1值的方式是Eclipse的属性中。这里不做重点。
还有就是以下的代码获取,基本的应用场景为:当我们的应用须要跟数据库进行数据交互等网络服务时,基于SHA1的唯一性。通过验证SHA1的值,来推断应用是否是官方正版应用。假设不是,则拒绝服务。
//这个是获取SHA1的方法
public static String getCertificateSHA1Fingerprint(Context context) {
//获取包管理器
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 (CertificateException e) {
e.printStackTrace();
}
//X509证书。X.509是一种很通用的证书格式
X509Certificate c = null;
try {
c = (X509Certificate) cf.generateCertificate(input);
} catch (CertificateException 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 static 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();
}
获得的SHA1和Eclipse中的一致。证明读取正确。
OK。任务完毕了。
欢迎加群畅聊163411187
613411187163411187
欢迎转载,请注明出处:http://blog.csdn.net/gaoshouxiaodi/article/details/37821659
android 应用内部获取本应用或者相应包名的应用的SHA1签名的办法的更多相关文章
- Java 获取APK安装程序的包名
Java 获取APK安装程序的包名核心的两个类: ResPackage ApkDecoder package com.temobi.util; import java.io.File; impo ...
- 获取apk package name(包名)以及activity name
通过adb 查看最上层成activity名字: linux: adb shell dumpsys activity | grep "mFocusedActivity" window ...
- aapt命令获取apk具体信息(包名、版本号号、版本号名称、兼容api级别、启动Activity等)
aapt命令获取apk具体信息(包名.版本号号.版本号名称.兼容api级别.启动Activity等) 第一步:找到aapt 找到sdk的根文件夹,然后找到build-tools文件夹.然后会看到一些b ...
- 在Android Studio中使用Gradle方便地修改包名
情景: 主Module引用了多个module,在代码使用R.xx.xx的时候,会import 当前包名.R.而由于需要上架Play做测试,可是目前的包名已经被使用了,所以需要修改包名. 正确使用bui ...
- 获取手机安装的所有包名adb shell pm list packages
获取所有已安装包的包名:adb shell pm list packages 查找:adb shell pm list packages|findstr suning
- Android 在一个程序中启动另一个程序(包名,或者类名)
http://hi.baidu.com/xiaofanqing/item/6fd724f7c5bb6dce531c26b7 Android 开发有时需要在一个应用中启动另一个应用,比如Launcher ...
- android 利用 aapt 解析 apk 得到应用名称 包名 版本号 权限等信息
在上传各大市场时发现 apk 上传后能自动解析出应用名称.包名.版本号.使用权限等信息,所以就研究了一下 1 直接解压 apk 解析 AndroidManifest.xml 是不行的,因为 apk ...
- ptyhon获取app设备号、包名、activity
直接上代码: import time import os import re import sys #------------------------------------------------- ...
- Android获取apk的版本及包名等信息
import android.app.Activity; import android.content.Context; import android.content.pm.ApplicationIn ...
随机推荐
- 一个简易版的Angular js 三层 示例
var myApp = angular.module('produceline', []); myApp.factory('ajax', ["$http", "$q&qu ...
- Spring 实现数据库读写分离(转)
现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应 ...
- EasyUI——DataGrid中嵌入Radio
前一篇博客写到项目中的广告位管理,当时没有写到今天的问题,这个问题当时也是困扰我好久. 经过自己的努力和同志们的帮助,最后最终解决. 实现要求把全部的广告位后面的单选button设成一组,目的是一个广 ...
- 使用 Bluemix™ Live Sync 高速更新 Bluemix 上执行的应用程序实例
假设您要构建 Node.js 应用程序,那么能够使用 IBM® Bluemix® Live Sync 高速更新 Bluemix 上的应用程序实例,并像在桌面上进行操作一样进行开发,而无需又一次部署.执 ...
- js09--函数 call apply
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- IIS特殊字符设置
简介:[iis7]请求筛选模块被配置为拒绝包含双重转义序列的请求.HTTP 错误 404.11 - Not Found 特殊字符最好替换成其他的字符,主要的特殊字符有”*”.”&”.”%”.” ...
- Day6下午题解1
预计分数:100+?+30=130+? 实际分数:100+25+30=155 T1 https://www.luogu.org/problem/show?pid=T15920 DP裸题,用dp[i][ ...
- 《三》Java IO 字节输入输出流
那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream) ...
- Linux下守护进程精析
什么是守护进程? 守护进程就是通常所说的Daemon进程,它是Linux中的后台服务程序. 它是一个生存期较长的进程,通常独立于终端而且周期性的运行某种须要的任务以及有时候会等待一些将会发生的 ...
- iOS中 学会如何对sqlite3 进行封装
#waring ---(看官注意) ---使用说明: ①在创建自定义model类之前让该类继承自文件中的Model类, ②为model类选一个NSString属性作为主键:(既,在初始化方法里面将从父 ...