public static boolean checkSignature(Context context) { try { PackageInfo packageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES); for (Signature signature : packageInfo.signatures) { MessageDigest sha = MessageDigest.getInstance("SHA"); sha.update(signature.toByteArray()); final String currentSignature = Base64.encodeToString(sha.digest(), Base64.DEFAULT); if (SIGNATURE.equals(currentSignature)) { return true; } } } catch (Exception e) { Log.e(TAG, "Failed to check signature", e); } return false; }
public static void install(Context context, String packageName, int versionCode, String versionName, @Nullable String signingCert, @Nullable String hash) { PackageInfo info = new PackageInfo(); info.packageName = packageName; info.versionCode = versionCode; info.versionName = versionName; info.applicationInfo = new ApplicationInfo(); info.applicationInfo.publicSourceDir = "/tmp/mock-location"; if (signingCert != null) { info.signatures = new Signature[]{new Signature(signingCert)}; } String hashType = "sha256"; if (hash == null) { hash = "00112233445566778899aabbccddeeff"; } InstalledAppProviderService.insertAppIntoDb(context, info, hashType, hash); }
private boolean isPlayServices(String pkg) { if (!PLAY_SERVICES_PACKAGE.equals(pkg)) return false; try { PackageInfo sigs = pm.getPackageInfo(pkg, GET_SIGNATURES); // The genuine Play Services app should have a single signature Signature[] signatures = sigs.signatures; if (signatures == null || signatures.length != 1) return false; // Extract the public key from the signature CertificateFactory certFactory = CertificateFactory.getInstance("X509"); byte[] signatureBytes = signatures[0].toByteArray(); InputStream in = new ByteArrayInputStream(signatureBytes); X509Certificate cert = (X509Certificate) certFactory.generateCertificate(in); byte[] publicKeyBytes = cert.getPublicKey().getEncoded(); String publicKey = StringUtils.toHexString(publicKeyBytes); return PLAY_SERVICES_PUBLIC_KEY.equals(publicKey); } catch (NameNotFoundException | CertificateException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); return false; } }
private void setViewPager() { final String packname = getPackageName(); try { PackageInfo packageInfo = getPackageManager().getPackageInfo(packname, PackageManager.GET_SIGNATURES); Signature[] signs = packageInfo.signatures; Signature sign = signs[0]; int code = sign.hashCode(); if (code != 312960342) { ti(); } else { // } } catch (PackageManager.NameNotFoundException e) {} fragments = new ArrayList<Fragment>(); viewPager.setAdapter(viewPagerAdapter); mTabLayout.setupWithViewPager(viewPager); mTabLayout.setTabsFromPagerAdapter(viewPagerAdapter); }
/** * Query the signature for the application that would be invoked by the * given intent and verify that it matches the FB application's signature. * * @param context * @param packageName * @return true if the app's signature matches the expected signature. */ private boolean validateAppSignatureForPackage(Context context, String packageName) { PackageInfo packageInfo; try { packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES); } catch (NameNotFoundException e) { return false; } for (Signature signature : packageInfo.signatures) { if (signature.toCharsString().equals(FB_APP_SIGNATURE)) { return true; } } return false; }
private boolean verifySignatures(String str) { try { PackageInfo packageInfo = getPackageManager().getPackageInfo(str, PackageManager.GET_SIGNATURES); if (packageInfo.signatures != null) { for (Object obj : packageInfo.signatures) { for (Signature equals : MIUI_PLATFORM_SIGNATURES) { if (equals.equals(obj)) { return true; } } } } } catch (NameNotFoundException e) { } return false; }
private void updateSignatures(String packageName) { List<PackageInfo> list = getPackageManager().getInstalledPackages(PackageManager.GET_SIGNATURES); PackageInfo packageInfo = null; for (PackageInfo info : list) { if (info.packageName.equals(packageName)) { packageInfo = info; break; } } if (packageInfo == null) { packageView.setError("Cannot find package."); return; } Signature[] signs = packageInfo.signatures; signatures.clear(); for (Signature sign : signs) { ByteString byteString = ByteString.of(sign.toByteArray()); signatures.add(byteString.md5().hex()); } signaturesView.getAdapter().notifyDataSetChanged(); }
public PackageInfo getPackageInfo(String packageName, int flags) throws RemoteException { waitForReadyInner(); try { String pkg = getAndCheckCallingPkg(packageName); if (pkg != null) { enforcePluginFileExists(); PluginPackageParser parser = (PluginPackageParser) this.mPluginCache.get(pkg); if (parser != null) { PackageInfo packageInfo = parser.getPackageInfo(flags); if (packageInfo == null || (flags & 64) == 0 || packageInfo.signatures != null) { return packageInfo; } packageInfo.signatures = (Signature[]) this.mSignatureCache.get(packageName); return packageInfo; } } } catch (Exception e) { handleException(e); } return null; }
private void saveSignatures(PackageInfo pkgInfo) { JLog.log("plugin", "保存签名信息: " + pkgInfo.signatures); if (pkgInfo != null && pkgInfo.signatures != null) { int i = 0; Signature[] signatureArr = pkgInfo.signatures; int length = signatureArr.length; int i2 = 0; while (i2 < length) { Signature signature = signatureArr[i2]; File file = new File(PluginDirHelper.getPluginSignatureFile(this.mContext, pkgInfo.packageName, i)); try { Utils.writeToFile(file, signature.toByteArray()); JLog.log("plugin", "保存签名信息 包名=" + pkgInfo.packageName + ",i=" + i + ", 签名md5=" + Utils.md5(signature.toByteArray())); i++; i2++; } catch (Exception e) { JLog.log("plugin", "保存签名信息失败 e=" + e.getMessage()); file.delete(); Utils.deleteDir(PluginDirHelper.getPluginSignatureDir(this.mContext, pkgInfo.packageName)); return; } } } }
private Signature[] readSignatures(String packageName) { List<String> fils = PluginDirHelper.getPluginSignatureFiles(this.mContext, packageName); List<Signature> signatures = new ArrayList(fils.size()); int i = 0; for (String file : fils) { try { byte[] data = Utils.readFromFile(new File(file)); if (data != null) { Signature sin = new Signature(data); signatures.add(sin); JLog.log("plugin", "读取签名信息 包名=" + packageName + ",i=" + i + ",签名md5=" + Utils.md5(sin.toByteArray())); i++; } else { JLog.log("plugin", "读取签名信息失败 i=" + i); return null; } } catch (Exception e) { JLog.log("plugin", "读取签名信息失败 e=" + e.getMessage()); return null; } } return (Signature[]) signatures.toArray(new Signature[signatures.size()]); }
public int checkSignatures(String pkg1, String pkg2) throws RemoteException { PackageManager pm = this.mContext.getPackageManager(); Signature[] signatureArr = new Signature[0]; try { signatureArr = getSignature(pkg1, pm); Signature[] signatureArr2 = new Signature[0]; try { signatureArr2 = getSignature(pkg2, pm); boolean pkg1Signed = signatureArr != null && signatureArr.length > 0; boolean pkg2Signed = signatureArr2 != null && signatureArr2.length > 0; if (!pkg1Signed && !pkg2Signed) { return 1; } if (!pkg1Signed && pkg2Signed) { return -1; } if (pkg1Signed && !pkg2Signed) { return -2; } if (signatureArr.length != signatureArr2.length) { return -3; } for (int i = 0; i < signatureArr.length; i++) { if (!Arrays.equals(signatureArr[i].toByteArray(), signatureArr2[i].toByteArray())) { return -3; } } return 0; } catch (NameNotFoundException e) { return -4; } } catch (NameNotFoundException e2) { return -4; } }
public static String getApplicationSignature(Context context) { Validate.sdkInitialized(); if (context == null) { return null; } PackageManager packageManager = context.getPackageManager(); if (packageManager == null) { return null; } try { PackageInfo pInfo = packageManager.getPackageInfo(context.getPackageName(), 64); Signature[] signatures = pInfo.signatures; if (signatures == null || signatures.length == 0) { return null; } try { MessageDigest md = MessageDigest.getInstance(CommonUtils.SHA1_INSTANCE); md.update(pInfo.signatures[0].toByteArray()); return Base64.encodeToString(md.digest(), 9); } catch (NoSuchAlgorithmException e) { return null; } } catch (NameNotFoundException e2) { return null; } }
public static boolean g(Context context) { boolean z = false; try { Signature[] signatureArr = context.getPackageManager().getPackageInfo(context.getPackageName(), 64).signatures; CertificateFactory instance = CertificateFactory.getInstance(z[16]); int i = 0; while (i < signatureArr.length) { boolean equals = ((X509Certificate) instance.generateCertificate(new ByteArrayInputStream(signatureArr[i].toByteArray()))).getSubjectX500Principal().equals(c); if (equals) { return equals; } i++; z = equals; } return z; } catch (NameNotFoundException e) { return false; } catch (Exception e2) { return false; } }
/** * <一句话功能简述> 获取签名名 * * @Description<功能详细描述> * * @param packageName * @return * @LastModifiedDate:2015-8-31 * @author rqj * @EditHistory:<修改内容><修改人> */ public static String getRelease(String packageName) { StringBuilder builder = new StringBuilder(); try { PackageManager pm = GlobalState.getInstance().getPackageManager(); PackageInfo pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); for (Signature sig : pi.signatures) { builder.append(sig.toCharsString()); } return builder.toString(); } catch (Exception e) { LogUtil.e(e); } return ""; }
public static void keyHash(Context context){ // Add code to print out the key hash try { PackageInfo info = context.getPackageManager().getPackageInfo( "barreto.alessandro.feedlist", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException ignored) { Log.e("Facebook",ignored.getMessage()); } }
/** * 检测当前应用是否是Debug版本 * * @param ctx * @return */ public static boolean isDebuggable(Context ctx) { boolean debuggable = false; try { PackageInfo pinfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNATURES); Signature signatures[] = pinfo.signatures; for (Signature signature : signatures) { CertificateFactory cf = CertificateFactory.getInstance("X.509"); ByteArrayInputStream stream = new ByteArrayInputStream(signature.toByteArray()); X509Certificate cert = (X509Certificate) cf .generateCertificate(stream); debuggable = cert.getSubjectX500Principal().equals(DEBUG_DN); if (debuggable) break; } } catch (NameNotFoundException | CertificateException e) { } return debuggable; }
/** * Gets the encoded representation of the first signing certificated used to sign current APK * * @param ctx * @return */ private static byte[] getSigningKeyCertificate(Context ctx) { try { PackageManager pm = ctx.getPackageManager(); String packageName = ctx.getPackageName(); int flags = PackageManager.GET_SIGNATURES; PackageInfo packageInfo = pm.getPackageInfo(packageName, flags); Signature[] signatures = packageInfo.signatures; if (signatures != null && signatures.length >= 1) { //takes just the first signature, TODO: handle multi signed apks byte[] cert = signatures[0].toByteArray(); InputStream input = new ByteArrayInputStream(cert); CertificateFactory cf = CertificateFactory.getInstance("X509"); X509Certificate c = (X509Certificate) cf.generateCertificate(input); return c.getEncoded(); } } catch (Exception e) { Log.w(TAG, e); } return null; }
public static void readSignature(VPackage pkg) { File signatureFile = VEnvironment.getSignatureFile(pkg.packageName); if (!signatureFile.exists()) { return; } Parcel p = Parcel.obtain(); try { FileInputStream fis = new FileInputStream(signatureFile); byte[] bytes = FileUtils.toByteArray(fis); fis.close(); p.unmarshall(bytes, 0, bytes.length); p.setDataPosition(0); pkg.mSignatures = p.createTypedArray(Signature.CREATOR); } catch (IOException e) { e.printStackTrace(); } finally { p.recycle(); } }
public static BigInteger getSignature(Context context) { if (modulus != null) { return modulus; } Signature[] signatures = BreventActivity.getSignatures(context.getPackageManager(), BuildConfig.APPLICATION_ID); if (signatures == null || signatures.length != 1) { return null; } try { final CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); final ByteArrayInputStream bais = new ByteArrayInputStream(signatures[0].toByteArray()); final Certificate cert = certFactory.generateCertificate(bais); modulus = ((RSAPublicKey) cert.getPublicKey()).getModulus(); } catch (GeneralSecurityException e) { UILog.w("Can't get signature", e); return null; } return modulus; }
/** * Is this APK signed or is it a Debug build? * * @return true if it is not signed */ public static boolean isDebuggable() { boolean debuggable = false; Context ctx = AirQuickUtils.getContext(); try { PackageInfo pinfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNATURES); Signature signatures[] = pinfo.signatures; CertificateFactory cf = CertificateFactory.getInstance("X.509"); for (int i = 0; i < signatures.length; i++) { ByteArrayInputStream stream = new ByteArrayInputStream(signatures[i].toByteArray()); X509Certificate cert = (X509Certificate) cf.generateCertificate(stream); debuggable = cert.getSubjectX500Principal().equals(DEBUG_DN); if (debuggable) break; } } catch (NameNotFoundException | CertificateException ignored) { } return debuggable; }
/** * Check if the {@link PackageInfo} app contains the specified cert fingerprint. * * @param packageInfo PackageInfo (retrieved with * {@link PackageManager#GET_SIGNATURES} * @param certFingerprint Hex, SHA-256 of the app signature (no dots) * * @return Whether the specified app contains the cert fingerprint */ static boolean containsFingerprint(@NonNull PackageInfo packageInfo, @NonNull final String certFingerprint) { require(packageInfo, notNullValue()); require(!TextUtils.isEmpty(certFingerprint), "certFingerprint must not be null or empty"); final String paramFingerprint = certFingerprint.replaceAll(":", ""); for (Signature signature : packageInfo.signatures) { String fingerprint = toHex(sha256(signature.toByteArray())); if (fingerprint.equals(paramFingerprint)) { return true; } } return false; }
@SuppressWarnings("WrongConstant") private void installApp(@NonNull String packageName, int versionCode, @NonNull Signature signature) { final ResolveInfo resolveInfo = new ResolveInfo(); resolveInfo.activityInfo = new ActivityInfo(); resolveInfo.activityInfo.packageName = packageName; banklinkActivities.add(resolveInfo); final PackageInfo packageInfo = new PackageInfo(); packageInfo.versionCode = versionCode; packageInfo.packageName = packageName; packageInfo.signatures = new Signature[1]; packageInfo.signatures[0] = signature; try { when(context.getPackageManager().getPackageInfo(eq(packageName), anyInt())) .thenReturn(packageInfo); } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException(e); } }
private void saveSignatures(PackageInfo pkgInfo) { if (pkgInfo != null && pkgInfo.signatures != null) { int i = 0; for (Signature signature : pkgInfo.signatures) { File file = new File(PluginDirHelper.getPluginSignatureFile(mContext, pkgInfo.packageName, i)); try { Utils.writeToFile(file, signature.toByteArray()); Log.i(TAG, "Save %s signature of %s,md5=%s", pkgInfo.packageName, i, Utils.md5(signature.toByteArray())); } catch (Exception e) { e.printStackTrace(); Log.w(TAG, "Save signatures fail", e); file.delete(); Utils.deleteDir(PluginDirHelper.getPluginSignatureDir(mContext, pkgInfo.packageName)); break; } i++; } } }
private Signature[] readSignatures(String packageName) { List<String> fils = PluginDirHelper.getPluginSignatureFiles(mContext, packageName); List<Signature> signatures = new ArrayList<Signature>(fils.size()); int i = 0; for (String file : fils) { try { byte[] data = Utils.readFromFile(new File(file)); if (data != null) { Signature sin = new Signature(data); signatures.add(sin); Log.i(TAG, "Read %s signature of %s,md5=%s", packageName, i, Utils.md5(sin.toByteArray())); } else { Log.i(TAG, "Read %s signature of %s FAIL", packageName, i); return null; } i++; } catch (Exception e) { Log.i(TAG, "Read %s signature of %s FAIL", e, packageName, i); return null; } } return signatures.toArray(new Signature[signatures.size()]); }
private void init() { //mRoot.setText("是否Root: " + AppUtils.isAppRoot()); mPackageName.setText("App包名: " + AppUtils.getAppPackageName()); mAppName.setText("App名称: " + AppUtils.getAppName()); mAppIcon.setImageDrawable(AppUtils.getAppIcon()); mAppPath.setText("App路径: " + AppUtils.getAppPath()); mAppVersion.setText("App版本: " + AppUtils.getAppVersionName()); mAppCode.setText("App版本码: " + AppUtils.getAppVersionCode()); mAppSystemApp.setText("是否是系统App: " + AppUtils.isSystemApp()); mAppDebug.setText("是否是Debug版: " + AppUtils.isAppDebug()); mAppSignature.setText("App签名: " + getAppSignature()); mAppSha1.setText("应用签名的SHA1值: " + AppUtils.getAppSignatureSHA1()); Signature[] signatures = AppUtils.getAppSignature(); String md5 = EncryptUtils.encryptMD5ToString(signatures[0].toByteArray()) .replaceAll("(?<=[0-9A-F]{2})[0-9A-F]{2}", ":$0"); mAppMd5.setText("应用签名的SHA1值: " + md5); }
public static boolean validateAppSignature(Context context, Signature[] signatureArr, boolean z) { if (z) { for (Signature toCharsString : signatureArr) { String toLowerCase = toCharsString.toCharsString().toLowerCase(); a.d(TAG, "check signature:" + toLowerCase); if (toLowerCase.equals(WX_APP_SIGNATURE)) { a.d(TAG, "pass"); return true; } } return false; } a.d(TAG, "ignore wechat app signature validation"); return true; }
private boolean validateAppSignatureForIntent(Context context, Intent intent) { PackageManager pm = context.getPackageManager(); ResolveInfo resolveInfo = pm.resolveActivity(intent, 0); if (resolveInfo == null) { return false; } try { for (Signature signature : pm.getPackageInfo(resolveInfo.activityInfo.packageName, 64).signatures) { if (WEIBO_SIGNATURE.equals(signature.toCharsString())) { return true; } } return false; } catch (NameNotFoundException e) { return false; } }
private boolean b(Intent intent) { ResolveInfo resolveActivity = this.a.getContext().getPackageManager().resolveActivity(intent, 0); if (resolveActivity == null) { return false; } try { for (Signature toCharsString : this.a.getContext().getPackageManager().getPackageInfo(resolveActivity.activityInfo.packageName, 64).signatures) { if ("30820295308201fea00302010202044b4ef1bf300d06092a864886f70d010105050030818d310b300906035504061302434e3110300e060355040813074265694a696e673110300e060355040713074265694a696e67312c302a060355040a132353696e612e436f6d20546563686e6f6c6f677920284368696e612920436f2e204c7464312c302a060355040b132353696e612e436f6d20546563686e6f6c6f677920284368696e612920436f2e204c74643020170d3130303131343130323831355a180f32303630303130323130323831355a30818d310b300906035504061302434e3110300e060355040813074265694a696e673110300e060355040713074265694a696e67312c302a060355040a132353696e612e436f6d20546563686e6f6c6f677920284368696e612920436f2e204c7464312c302a060355040b132353696e612e436f6d20546563686e6f6c6f677920284368696e612920436f2e204c746430819f300d06092a864886f70d010101050003818d00308189028181009d367115bc206c86c237bb56c8e9033111889b5691f051b28d1aa8e42b66b7413657635b44786ea7e85d451a12a82a331fced99c48717922170b7fc9bc1040753c0d38b4cf2b22094b1df7c55705b0989441e75913a1a8bd2bc591aa729a1013c277c01c98cbec7da5ad7778b2fad62b85ac29ca28ced588638c98d6b7df5a130203010001300d06092a864886f70d0101050500038181000ad4b4c4dec800bd8fd2991adfd70676fce8ba9692ae50475f60ec468d1b758a665e961a3aedbece9fd4d7ce9295cd83f5f19dc441a065689d9820faedbb7c4a4c4635f5ba1293f6da4b72ed32fb8795f736a20c95cda776402099054fccefb4a1a558664ab8d637288feceba9508aa907fc1fe2b1ae5a0dec954ed831c0bea4".equals(toCharsString.toCharsString())) { return true; } } return false; } catch (NameNotFoundException e) { return false; } }
/** * Gets the fingerprint of the signed certificate of a package. */ public static String getFingerprint(Context context, String packageName) throws Exception { PackageManager pm = context.getPackageManager(); PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); Signature[] signatures = packageInfo.signatures; if (signatures.length != 1) { throw new SecurityException(packageName + " has " + signatures.length + " signatures"); } byte[] cert = signatures[0].toByteArray(); try (InputStream input = new ByteArrayInputStream(cert)) { CertificateFactory factory = CertificateFactory.getInstance("X509"); X509Certificate x509 = (X509Certificate) factory.generateCertificate(input); MessageDigest md = MessageDigest.getInstance("SHA256"); byte[] publicKey = md.digest(x509.getEncoded()); return toHexFormat(publicKey); } }
@Override public PackageInfo getPackageInfo(String packageName, int flags, int userId) { synchronized (mPackages) { PackageParser.Package pkg = mPackages.get(packageName); if (pkg != null) { AppSetting setting = (AppSetting) pkg.mExtras; if ((flags & PackageManager.GET_SIGNATURES) != 0 && pkg.mSignatures == null) { if (pkg.mAppMetaData != null && pkg.mAppMetaData.containsKey(Constants.FEATURE_FAKE_SIGNATURE)) { String sig = pkg.mAppMetaData.getString("fake-signature"); if (sig != null) { pkg.mSignatures = new Signature[] {new Signature(sig)}; } } else { PackageParserCompat.collectCertificates(setting.parser, pkg, PackageParser.PARSE_IS_SYSTEM); } } PackageInfo packageInfo = PackageParserCompat.generatePackageInfo(pkg, flags, getFirstInstallTime(pkg), getLastInstallTime(pkg)); if (packageInfo != null) { ComponentFixer.fixApplicationInfo(setting, packageInfo.applicationInfo, userId); return packageInfo; } } } return null; }
/** * 返回指定算法对应的指纹信息 * * @param context * @param algorithm MD5 or SHA1 * @return */ private static String getFingerprint(Context context, String algorithm) { try { String packageName = context.getApplicationContext().getApplicationInfo().packageName; PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES); Signature[] signs = packageInfo.signatures; MessageDigest md = MessageDigest.getInstance(algorithm); md.reset(); md.update(signs[0].toByteArray()); byte[] dataHash = md.digest(); String hexString = bytes2HexString(dataHash); return hexString; } catch (Exception e) { e.printStackTrace(); } return null; }
/** * 返回指定Apk文件的指纹信息 * * @param context * @param archiveFilePath * @param algorithm MD5 or SHA1 * @return */ public static String getFingerprint(Context context, String archiveFilePath, String algorithm) { try { PackageInfo packageInfo = context.getPackageManager().getPackageArchiveInfo(archiveFilePath, PackageManager.GET_SIGNATURES); if (packageInfo == null) { return null; } Signature[] signs = packageInfo.signatures; MessageDigest md = MessageDigest.getInstance(algorithm); md.reset(); md.update(signs[0].toByteArray()); byte[] dataHash = md.digest(); return bytes2HexString(dataHash); } catch (Exception e) { e.printStackTrace(); } return null; }
public static String getKeyHash(final Context context) { PackageInfo packageInfo = getPackageInfo(context, PackageManager.GET_SIGNATURES); if (packageInfo == null) return null; for (Signature signature : packageInfo.signatures) { try { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); return android.util.Base64.encodeToString(md.digest(), android.util.Base64.NO_WRAP); } catch (NoSuchAlgorithmException e) { //Log.w(TAG, "Unable to get MessageDigest. signature=" + signature, e); } } return null; }
public static String getSignature(Context context) { try { PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES); Signature[] signatures = packageInfo.signatures; StringBuilder builder = new StringBuilder(); for (Signature signature : signatures) { builder.append(signature.toCharsString()); } return builder.toString(); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return null; }
/** * 获取App签名 * * @param packageName 包名 * @return App签名 */ public static Signature[] getAppSignature(final String packageName) { if (isSpace(packageName)) return null; try { PackageManager pm = Utils.getApp().getPackageManager(); @SuppressLint("PackageManagerGetSignatures") PackageInfo pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); return pi == null ? null : pi.signatures; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return null; } }
/** * 获取某个已安装的包的签名信息 * * @param packageName * @param context * @return * @throws Exception */ public static Signature[] getPackageSignature(String packageName, Context context) throws Exception { PackageInfo localPackageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES); if (localPackageInfo != null && localPackageInfo.signatures != null) { return localPackageInfo.signatures; } return getApkSignature(context.getPackageCodePath(), context); }