我这我的比較懒。每次作的都是心血来潮,因此打算改掉这个坏毛病。昨晚很是晚才睡,躺在床上一直在回忆。这两年来,我之前的目标是什么,我放弃了什么,我完毕了什么。java
结果目标很是多,也放弃了一些。android
完毕的差点儿没有。想来,仍是挺失败的。git
生活逐渐磨平了棱角,事实上不怨生活,仍是本身信心不够坚决。算法
不是仅仅有年轻才有梦想,是因为有梦想。因此才年轻。数据库
那些和我同样之前有些目标,却中途逐渐遗忘的朋友们。坚持下去。身埋黄土半生沙,雕镂逐梦尽铅华。数组
欢迎转载,请注明出处:http://blog.csdn.net/gaoshouxiaodi/article/details/37821659
安全
哈哈,闲言少叙,言归正传!网络
在讲正文以前,仍是先了解一下:什么是哈希算法?哈希算法将随意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据惟一且极其紧凑的数值表示形式。假设散列一段明文而且哪怕仅仅更改该段落的一个字母,随后的哈希都将产生不一样的值。要找到散列为同一个值的两个不一样的输入,在计算上是不可能的。因此数据的哈希值可以检验数据的完整性。通常用于高速查找和加密算法。app
基于哈希的消息验证模式有很是多种: 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