将APK签名与原始签名进行比较时出错

时间:2015-09-30 22:03:43

标签: android

我正在尝试将运行时我的APK的签名验证与原始签名密钥“同一个!”进行比较,我遵循answer所以它不能杀死我的应用程序,因为它是同一个! ,但它会杀死应用程序,因为它不是同一个并显示吐司。

那是代码

public void checkSignature(final Context context) {
    try {
        signatures = context.getPackageManager()
                .getPackageInfo(context.getPackageName(),
                        PackageManager.GET_SIGNATURES).signatures;

        if (signatures[0].toString() != SIGNATURE_KEY) {
            // Kill the process without warning. If someone changed the certificate
            // is better not to give a hint about why the app stopped working
            android.os.Process.killProcess(android.os.Process.myPid());
            Toast.makeText(getApplicationContext(), "Not working", Toast.LENGTH_LONG).show();
        }
    } catch (PackageManager.NameNotFoundException ex) {
        // Must never fail, so if it does, means someone played with the apk, so kill the process
        android.os.Process.killProcess(android.os.Process.myPid());

    }
}

我使用该代码在运行时获取签名代码的时间超过了时间,每次都给我相同的代码! “当我按下按钮时会发生这种情况”

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Release", signatures[0].toCharsString());
clipboard.setPrimaryClip(clip);

那么该代码有什么问题会使比较过程无法正常工作?

1 个答案:

答案 0 :(得分:1)

您使用!=运算符比较字符串。这会将字符串比较为链接,而不是对象。你应该使用.equals()。 编辑: 还要正确比较签名:

MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signatures[0].toByteArray());
String signature = Base64.encodeToString(md.digest(), Base64.DEFAULT);
if (!signature.equals(SIGNATURE_KEY)){
    //do your logic
}