我想将包含敏感信息的意图发送到系统上的另一个应用程序,我也编写了该应用程序。在这样做之前,我需要验证我发送给他们的应用程序是否由我签名,而不仅仅是具有相同包名和类的流氓版本。如何以编程方式执行此操作?
我想使用通过 startService() 和 startActivity() 分派的显式意图来执行此操作,因此无需担心广播意图。也就是说,在我验证我指定的包名称已安装并由作者(在这种特定情况下是我自己)安装并签名之前,我不想发送任何东西。
我想将包含敏感信息的意图发送到系统上的另一个应用程序,我也编写了该应用程序。在这样做之前,我需要验证我发送给他们的应用程序是否由我签名,而不仅仅是具有相同包名和类的流氓版本。如何以编程方式执行此操作?
我想使用通过 startService() 和 startActivity() 分派的显式意图来执行此操作,因此无需担心广播意图。也就是说,在我验证我指定的包名称已安装并由作者(在这种特定情况下是我自己)安装并签名之前,我不想发送任何东西。
包管理器将为您提供任何已安装包的签名证书。
final PackageManager packageManager = context.getPackageManager();
final List<PackageInfo> packageList = packageManager.getInstalledPackages(PackageManager.GET_SIGNATURES);
CertificateFactory certFactory = null;
try {
certFactory = CertificateFactory.getInstance("X509");
}
catch (CertificateException e) {
// e.printStackTrace();
}
for (PackageInfo p : packageList) {
String strName = p.applicationInfo.loadLabel(packageManager).toString();
String strVendor = p.packageName;
sb.append("<br>" + strName + " / " + strVendor + "<br>");
Signature[] arrSignatures = p.signatures;
for (Signature sig : arrSignatures) {
/*
* Get the X.509 certificate.
*/
byte[] rawCert = sig.toByteArray();
InputStream certStream = new ByteArrayInputStream(rawCert);
X509Certificate x509Cert = null;
try {
x509Cert = (X509Certificate) certFactory.generateCertificate(certStream);
}
catch (CertificateException e) {
// e.printStackTrace();
}
sb.append("Certificate subject: " + x509Cert.getSubjectDN() + "<br>");
sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "<br>");
sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "<br>");
sb.append("<br>");
}
}