一、首先获取签名文件的MD5:
keytool -v -list -keystore “签名文件”
获取结果:
Certificate fingerprints:
MD5: **:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**
SHA1: *******************************************
SHA256: *****************************************
Signature algorithm name: SHA256withRSA
Version: 3
二、代码中获取应用签名的MD5:
private boolean checkSignature()
{
try
{
PackageInfo packageInfo = getPackageManager().getPackageInfo(
getPackageName(), PackageManager.GET_SIGNATURES);
Signature[] signs = packageInfo.signatures;
Signature sign = signs[0];
if (getMD5String(sign.toByteArray()).equals(
"签名文件的MD5"))
{
return true;
}
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
private String getMD5String(byte[] data)
{
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F' };
try
{
// 获得MD5摘要算法的 MessageDigest 对象
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字节更新摘要
mdInst.update(data);
// 获得密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++)
{
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
}
catch (Exception e)
{
e.printStackTrace();
return "";
}
}
三、在合适的地方调用checkSignature方法进行校验即可。
注:上述是在java代码中校验,为了增加破解成本,可以将校验放在jni中。为了防止别人越过校验,可以在jni中增加一些初始化代码。