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的值,来判断应用是否是官方正版应用,如果不是,则拒绝服务。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //这个是获取SHA1的方法  
  2. public static String getCertificateSHA1Fingerprint(Context context) {  
  3.                 //获取包管理器  
  4.         PackageManager pm = context.getPackageManager();  
  5.                 //获取当前要获取SHA1值的包名,也可以用其他的包名,但需要注意,  
  6.                 //在用其他包名的前提是,此方法传递的参数Context应该是对应包的上下文。  
  7.         String packageName = context.getPackageName();  
  8.                 //返回包括在包中的签名信息  
  9.         int flags = PackageManager.GET_SIGNATURES;  
  10.         PackageInfo packageInfo = null;  
  11.         try {  
  12.                 //获得包的所有内容信息类  
  13.             packageInfo = pm.getPackageInfo(packageName, flags);  
  14.         } catch (PackageManager.NameNotFoundException e) {  
  15.             e.printStackTrace();  
  16.         }  
  17.                 //签名信息  
  18.         Signature[] signatures = packageInfo.signatures;  
  19.         byte[] cert = signatures[0].toByteArray();  
  20.                 //将签名转换为字节数组流  
  21.         InputStream input = new ByteArrayInputStream(cert);  
  22.                 //证书工厂类,这个类实现了出厂合格证算法的功能  
  23.         CertificateFactory cf = null;  
  24.         try {  
  25.             cf = CertificateFactory.getInstance("X509");  
  26.         } catch (CertificateException e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.                 //X509证书,X.509是一种非常通用的证书格式  
  30.         X509Certificate c = null;  
  31.         try {  
  32.             c = (X509Certificate) cf.generateCertificate(input);  
  33.         } catch (CertificateException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.         String hexString = null;  
  37.         try {  
  38.                         //加密算法的类,这里的参数可以使MD4,MD5等加密算法  
  39.             MessageDigest md = MessageDigest.getInstance("SHA1");  
  40.                         //获得公钥  
  41.             byte[] publicKey = md.digest(c.getEncoded());  
  42.                         //字节到十六进制的格式转换  
  43.             hexString = byte2HexFormatted(publicKey);  
  44.         } catch (NoSuchAlgorithmException e1) {  
  45.             e1.printStackTrace();  
  46.         } catch (CertificateEncodingException e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.         return hexString;  
  50.     }  
  51. //这里是将获取到得编码进行16进制转换  
  52.     private static String byte2HexFormatted(byte[] arr) {  
  53.         StringBuilder str = new StringBuilder(arr.length * 2);  
  54.         for (int i = 0; i < arr.length; i++) {  
  55.             String h = Integer.toHexString(arr[i]);  
  56.             int l = h.length();  
  57.             if (l == 1)  
  58.                 h = "0" + h;  
  59.             if (l > 2)  
  60.                 h = h.substring(l - 2, l);  
  61.             str.append(h.toUpperCase());  
  62.             if (i < (arr.length - 1))  
  63.                 str.append(':');  
  64.         }  
  65.         return str.toString();  
  66.     }  

获得的SHA1和Eclipse中的一致,证明读取正确。OK,任务完成了。

0 0
原创粉丝点击