android - 从安卓应用获取证书指纹

标签 android

如何从这个应用程序内部获取应用程序证书的指纹? 我想检查应用程序是否使用我自己的证书进行签名,或者它是否被重新打包/黑客攻击。

我在这里找到了部分解决方案:Get Certificate from Android Application .所以现在的问题是:如何检查证书的指纹。

最佳答案

我把它放在这里 - 该函数给出与 keytool 相同的结果做到了。

private String getCertificateSHA1Fingerprint() {
    PackageManager pm = mContext.getPackageManager();
    String packageName = mContext.getPackageName();
    int flags = PackageManager.GET_SIGNATURES;
    PackageInfo packageInfo = null;
    try {
        packageInfo = pm.getPackageInfo(packageName, flags);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    Signature[] signatures = packageInfo.signatures;
    byte[] cert = signatures[0].toByteArray();
    InputStream input = new ByteArrayInputStream(cert);
    CertificateFactory cf = null;
    try {
        cf = CertificateFactory.getInstance("X509");
    } catch (CertificateException e) {
        e.printStackTrace();
    }
    X509Certificate c = null;
    try {
        c = (X509Certificate) cf.generateCertificate(input);
    } catch (CertificateException e) {
        e.printStackTrace();
    }
    String hexString = null;
    try {
        MessageDigest md = MessageDigest.getInstance("SHA1");
        byte[] publicKey = md.digest(c.getEncoded());
        hexString = byte2HexFormatted(publicKey);
    } catch (NoSuchAlgorithmException e1) {
        e1.printStackTrace();
    } catch (CertificateEncodingException e) {
        e.printStackTrace();
    }
    return hexString;
}

public static String byte2HexFormatted(byte[] arr) {
    StringBuilder str = new StringBuilder(arr.length * 2);
    for (int i = 0; i < arr.length; i++) {
        String h = Integer.toHexString(arr[i]);
        int l = h.length();
        if (l == 1) h = "0" + h;
        if (l > 2) h = h.substring(l - 2, l);
        str.append(h.toUpperCase());
        if (i < (arr.length - 1)) str.append(':');
    }
    return str.toString();
}

关于android - 从安卓应用获取证书指纹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9293019/

相关文章:

Android 识别资源 ID 是可绘制的还是字符串

android - Kotlin DataBinding 将静态函数传递到布局 xml

java - 当数据库中没有条目时, if (dataSnapshot.getValue() == null) 返回 true,但在完成 "if"部分后也运行 else 部分

java - 我的 Android 服务无法继续运行

android - 无法在可绘制对象中使用引用颜色(按主题)

Android AsyncTask 解码位图并设置为图像

Android 布局引力

java - 找不到符号 'Context',android.content.Context

android - eclipse 未检测到它一天前检测到的设备

android - Galaxy Nexus 是小型、普通、大型还是超大型设备?