android 应用内部获取本应用或者对应包名的应用的SHA1签名的办法
来源:互联网 发布:淘宝ps3破解能买吗 编辑:程序博客网 时间:2024/06/04 19:28
转载,原文地址: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有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。》》》引自百度百科感兴趣的朋友可以进入阅读。
android中获取应用的SHA1有三种方法,一种是:通过keytool工具,在cmd命令中输入 keytool -list -v -keystore 你的签名证书所在位置,比如我的再D盘根目录,则输入:keytool -list -v -keystore d:\key2.keystore 回车后输入生成证书的密码。可得到以下信息
第二种获取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,任务完成了。
- android 应用内部获取本应用或者对应包名的应用的SHA1签名的办法
- android 应用内部获取本应用或者对应包名的应用的SHA1签名的办法
- android 应用内部获取本应用或者对应包名的应用的SHA1签名的办法
- 获取android应用签名证书的SHA1,MD5,SHA256值
- 获取Android系统应用的包名以及应用名!
- 提取应用的签名和包名
- 提取应用的签名和包名
- Android-提取应用的签名和包名
- eclipse,android studio 签名打包,获取MD5, SHA1(应用的签名)
- android——获得本应用的包名
- android获取应用的MD5,SHA1值
- Android Studio 获取应用的 sha1 值
- Android 通过应用包名获取MD5和SHA1值
- 快速获取应用的sha1,
- 应用的包名
- Android 获取应用系统程序的包名 PackageManager.
- android 5.0以上获取前台应用的包名
- Android获取当前所在应用的包名
- 内存调优的案例分析
- VMware 虚拟机的网络连接方式详解
- 学生管理系统
- Android 项目代码行统计方法
- iOS 优秀博客
- android 应用内部获取本应用或者对应包名的应用的SHA1签名的办法
- IOS开发: 使用Block在两个界面之间传值(Block高级用法:Block传值)
- [FAQ14165]L上来电全屏显示
- Android下打印调试堆栈方法
- lnmp 源码 搭建
- 移植libpcap/ndpi到openwrt cc
- ACM-Skiing
- "The identity used to sign the executable is no longer valid"错误解决方法
- CISCO路由器部分设备不能通过DHCP自动获取IP