我正在尝试将运行时我的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);
那么该代码有什么问题会使比较过程无法正常工作?
答案 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
}