【问题标题】:Android Application Certificate安卓应用证书
【发布时间】:2016-11-22 09:33:40
【问题描述】:

如何获取安装在 android 设备上的另一个应用程序的证书 sha256 哈希? 我正在使用How to get APK signing signature? 中提到的解决方案。但它给出的签名似乎不是证书哈希。

【问题讨论】:

    标签: android hash certificate sha256


    【解决方案1】:

    尽管有名称,但它是证书的公共部分。

    我的 CWAC-Security 库有 a SignatureUtils class with a getSignatureHash() method 计算此信息的 SHA-256 哈希。结果与使用 Java 的 keytool 转储密钥库中的哈希值相同。

    核心代码相当短:

    public static String getSignatureHash(Context ctxt, String packageName)
      throws NameNotFoundException, NoSuchAlgorithmException {
        MessageDigest md=MessageDigest.getInstance("SHA-256");
        Signature sig=
            ctxt.getPackageManager()
                .getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0];
    
        return(toHexStringWithColons(md.digest(sig.toByteArray())));
      }
    
      // based on https://stackoverflow.com/a/2197650/115145
    
      public static String toHexStringWithColons(byte[] bytes) {
        char[] hexArray=
            { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
                'C', 'D', 'E', 'F' };
        char[] hexChars=new char[(bytes.length * 3) - 1];
        int v;
    
        for (int j=0; j < bytes.length; j++) {
          v=bytes[j] & 0xFF;
          hexChars[j * 3]=hexArray[v / 16];
          hexChars[j * 3 + 1]=hexArray[v % 16];
    
          if (j < bytes.length - 1) {
            hexChars[j * 3 + 2]=':';
          }
        }
    
        return new String(hexChars);
      }
    

    【讨论】:

    • 非常感谢,我发现这很有用。
    【解决方案2】:

    你可以试试这样的:

        PackageManager packageManager = getPackageManager();
        int flag = PackageManager.GET_SIGNATURES;
    
        PackageInfo packageInfo = null;
            try {
                packageInfo = packageManager.getPackageInfo(packageName, flag);
    
                byte[] certificates = packageInfo.signatures[0].toByteArray();
                InputStream input = new ByteArrayInputStream(certificates);
                CertificateFactory factory = CertificateFactory.getInstance("X509");
                X509Certificate certificate = (X509Certificate) factory.generateCertificate(input);
    
                MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
                byte[] publicKey = messageDigest.digest(certificate.getEncoded());
    
            } catch (PackageManager.NameNotFoundException exception) {
                exception.printStackTrace();
            } catch (CertificateException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e2) {
                e2.printStackTrace();
            }
    

    【讨论】:

    • 我想获得证书的 SHA1 或 SHA256 哈希,但我无法获得。
    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 2012-10-23
    • 2011-05-17
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多