2016-07-19 7 views
0

アンドロイドデバイスにインストールされている別のアプリケーションの証明書sha256ハッシュを取得するにはどうすればよいですか? How to get APK signing signature?に記載されているソリューションを使用しています。しかし、それは証明書のハッシュではないような署名を与えています。Androidアプリケーションの証明書

答えて

1

名前にもかかわらず、それは証明書の公開部分です。

CWAC-Securityライブラリには、この情報のSHA-256ハッシュを計算するa SignatureUtils class with a getSignatureHash() methodがあります。結果は、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); 
    } 
+0

おかげで多くのことを、私はこの非常に便利を見つけました。 – Ammad

0

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(); 
     } 
+0

証明書のSHA1またはSHA256ハッシュを取得したいのですが、取得できません。 – Ammad

関連する問題