我们都知道现在疯狂地利用dex2jar、apktool等工具进行的反编译二次打包,除了做代码混淆之外,我们还得做一些事情让他们难度上升,时间成本上升,当然这些都是简单的想法,还是能够被搞掉的,这些是防止那些自动工具破解。
思想是这样的:在运行时, android PackageManger允许我们得到已安装应用程序的签名,利用检查签名的指纹,然后在程序中存上一个原装指纹可以放到此处,可以放到服务器上,作对比,如果匹配就让其运行,否则。。。。
代码比较简单:
// SIGNATURE 记得要改成自己的,在得到自己的签名指纹的时候把DEBUG置为false
public class SignedCertificate {
private static final boolean DEBUG = true;
private static final String SIGNATURE = "U3avmVG32YEX7gfDwfOuM4nvtFY=";
public static boolean checkAppSignature(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager()
.getPackageInfo(context.getPackageName(),
PackageManager.GET_SIGNATURES);
Signature signature = packageInfo.signatures[0];
MessageDigest mDigest = MessageDigest.getInstance("SHA");
mDigest.update(signature.toByteArray());
final String currentSign = Base64.encodeToString(mDigest.digest(),
Base64.DEFAULT).trim();
if (DEBUG) {
Log.d("MYapp", "Sinature:" + currentSign);
}
if (SIGNATURE.equals(currentSign)) {
return true;
}
} catch (NameNotFoundException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
return false;
}
}
原至:https://www.airpair.com/android/posts/adding-tampering-detection-to-your-android-app
不过里面有些小错误不能工作,修复了如上