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