android - 如何验证系统中的其他应用程序是否为正版?

标签 android security android-intent certificate

我想将包含敏感信息的 Intent 发送到系统上的另一个应用程序,我也编写了该应用程序。在这样做之前,我需要验证我发送给他们的应用程序是否由我签名,而不仅仅是具有相同包名和类的流氓版本。我如何以编程方式执行此操作?

我想使用通过 startService() 和 startActivity() 分派(dispatch)的显式 Intent 来执行此操作,因此无需担心广播 Intent 。也就是说,我不想发送任何东西,直到我确认我指定的包名称已安装并由作者(在这种特定情况下是我自己)签名。

最佳答案

包管理器将为您提供任何已安装包的签名证书。

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>");
    }
}

关于android - 如何验证系统中的其他应用程序是否为正版?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16303549/

相关文章:

安卓 : What's the best way to display an article with images?

android - Android 5.0+系统Toast不显示

c# - UserAgent 字符串中的端口扫描器 - masscan

android - 使用 LocalBroadcastManager 进行 'sticky' 广播

android - 如何在 Android 中使用编译的 OpenSSL 进行 AES 加密

android - android studio中的vlc和linux中的ffmpeg

.net - cert 和 mozroots 的 Mono 问题

security - 可以通过发送 NULL 字节来绕过 recaptcha 吗?

Android - 使我的应用程序可从应用程序列表和 "Share"菜单启动

android - 如何检测在 RecyclerView 适配器内是否单击了 Activity 中的按钮