1、首先获取签名文件的MD5:java
keytool -v -list -keystore “签名文件”
获取结果:git
Certificate fingerprints: MD5: **:**:**:**:**:**:**:**:**:**:**:**:**:**:**:** SHA1: ******************************************* SHA256: ***************************************** Signature algorithm name: SHA256withRSA Version: 3
2、代码中获取应用签名的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 ""; } }
3、在合适的地方调用checkSignature方法进行校验便可。shell
注:上述是在java代码中校验,为了增长破解成本,能够将校验放在jni中。为了防止别人越过校验,能够在jni中增长一些初始化代码。spa