2012-02-15 4 views

답변

56

여기에 넣습니다.이 함수는 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(); 
} 
+1

좋은 일 ................ –

+0

안녕하세요. 디버그 kestore로 작업. 그러나 서명 된 apk와 함께 사용하면이 오류가 발생합니다. java.lang.NoSuchMethodError : Lorg/apache/http/conn/params/ConnManagerParams 클래스의 정적 메서드 setTimeout (Le/a/b/c/d; 또는 슈퍼 클래스 ('org.apache.http.conn.params.ConnManagerParams'선언은 /system/framework/ext.jar에 나타납니다) – arjunkn

+3

이 오류는 키 저장소와 관련이 없다고 생각합니다. 앱의 다른 코드가이 예외를 발생시킬 수 있습니다. 빈 프로젝트에서 키 저장소를 사용하여 기능을 확인하십시오. – matreshkin

11

죄송합니다. 제 솔루션보다 빨리 빨랐습니다. 시간 내 주셔서 감사합니다.

import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.security.cert.CertificateException; 
import java.security.cert.CertificateFactory; 
import java.security.cert.X509Certificate; 
import android.app.Activity; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.content.pm.PackageManager.NameNotFoundException; 
import android.content.pm.Signature; 
import android.os.Bundle; 
import android.util.Log; 

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      PackageManager pm = this.getPackageManager(); 
      String packageName = this.getPackageName(); 
      int flags = PackageManager.GET_SIGNATURES; 

      PackageInfo packageInfo = null; 

      try { 
        packageInfo = pm.getPackageInfo(packageName, flags); 
      } catch (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(); 
      } 


      try { 
       MessageDigest md = MessageDigest.getInstance("SHA1"); 
       byte[] publicKey = md.digest(c.getPublicKey().getEncoded()); 


       StringBuffer hexString = new StringBuffer(); 
       for (int i=0;i<publicKey.length;i++) { 
        String appendString = Integer.toHexString(0xFF & publicKey[i]); 
        if(appendString.length()==1)hexString.append("0"); 
        hexString.append(appendString); 
        } 


       Log.d("Example", "Cer: "+ hexString.toString()); 

      } catch (NoSuchAlgorithmException e1) { 
       e1.printStackTrace(); 
      } 

    } 
} 
+0

[응용 프로그램 라이선스] (http://developer.android.com/guide/publishing/licensing.html)를 살펴보십시오. 앱이 지급 된 경우에만 작동합니다. – Felix

+0

내 앱이 유료입니다. 나는 재 포장 된 adware 앱에 대해 들었고 (수정 된 광고 게시자 ID) 수정하여 시장에 보냈습니다. – piotrpo

+0

은 서명 지문인가 아니면 서명인가? 'keytool -printcert-file sign.rsa'에 의해 생성 된 것과 다릅니다. – Zennichimaro