zoukankan      html  css  js  c++  java
  • 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有例如以下特性:不能够从消息摘要中复原信息。两个不同的消息不会产生相同的消息摘要。》》》引自百度百科感兴趣的朋友能够进入阅读。

    android中获取应用的SHA1有三种方法,一种是:通过keytool工具,在cmd命令中输入 keytool -list -v -keystore 你的签名证书所在位置。比方我的再D盘根文件夹,则输入:keytool -list -v -keystore d:key2.keystore 回车后输入生成证书的password。

    可得到下面信息


    另外一种获取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

  • 相关阅读:
    简识UML语言(转)
    很好的理解遗传算法的样例
    strtok和strtok_r
    HDU 11488 Hyper Prefix Sets (字符串-Trie树)
    深入浅出JMS(一)——JMS简单介绍
    CSS3学习----选择器、字体
    消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ
    【LeetCode】Sum Root to Leaf Numbers
    选择用户-显示已选用户
    ajax异步通讯 遮罩滚动栏,防止并发及误操作
  • 原文地址:https://www.cnblogs.com/llguanli/p/7205203.html
Copyright © 2011-2022 走看看