赞
踩
我这个人比较懒,每次做的都是心血来潮,所以打算改掉这个坏毛病。昨晚很晚才睡,躺在床上一直在回想。这两年来,我曾经的目标是什么,我放弃了什么,我完成了什么。结果目标很多,也放弃了一些。完成的几乎没有。想来,还是挺失败的。
生活逐渐磨平了棱角,其实不怨生活,还是自己信心不够坚定。不是只有年轻才有梦想,是因为有梦想,所以才年轻。
那些和我一样曾经有些目标,却中途逐渐遗忘的朋友们,坚持下去。身埋黄土半生沙,雕镂逐梦尽铅华。
哈哈,闲言少叙,言归正传!
在讲正文之前,还是先了解一下:什么是哈希算法?哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。
基于哈希的消息验证模式有很多种: 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,任务完成了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。