验证应用程序签名 - 篡改检测

此技术详细说明了如何确保你的 .apk 已使用开发人员证书进行签名,并利用证书保持一致且只有你可以访问它的事实。我们可以将这种技术分解为 3 个简单的步骤:

  • 找到你的开发者证书签名。
  • 将你的签名嵌入到应用程序中的 String 常量中。
  • 检查运行时的签名是否与嵌入式开发人员签名匹配。

这是代码片段:

private static final int VALID = 0;
private static final int INVALID = 1;

public static int checkAppSignature(Context context) {

try {
      PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);

      for (Signature signature : packageInfo.signatures) {

        byte[] signatureBytes = signature.toByteArray();

        MessageDigest md = MessageDigest.getInstance("SHA");

        md.update(signature.toByteArray());

        final String currentSignature = Base64.encodeToString(md.digest(), Base64.DEFAULT);

        Log.d("REMOVE_ME", "Include this string as a value for SIGNATURE:" + currentSignature);

        //compare signatures
        if (SIGNATURE.equals(currentSignature)){
          return VALID;
        };
      }
    } catch (Exception e) {
        //assumes an issue in checking signature., but we let the caller decide on what to do.
    }

    return INVALID;

}