2012-02-15 10 views

Respuesta

56

lo puse aquí - la función da el mismo resultado que keytool lo hace.

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

buen trabajo ................ –

+0

Hola, es trabajando con depuración kestore. Pero al obtener este error cuando se utiliza con el inicio de sesión firmado java.lang.NoSuchMethodError: Ningún método estático setTimeout (Le/a/b/c/d; J) V en la clase Lorg/apache/http/conn/params/ConnManagerParams; o sus superclases (declaración de 'org.apache.http.conn.params.ConnManagerParams' aparece en /system/framework/ext.jar) – arjunkn

+3

No creo que este error esté relacionado con un almacén de claves. Probablemente, otro fragmento de código en su aplicación cause esta excepción. Verifique la función en un proyecto vacío con su almacén de claves - esto debería funcionar. – matreshkin

11

Disculpa, fui más rápido debajo de mi solución, gracias por tu tiempo;

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

Es posible que desee consultar [licencia de la aplicación] (http://developer.android.com/guide/publishing/licensing.html). Tenga en cuenta que solo funciona si paga su aplicación. – Felix

+0

Mis aplicaciones no se pagan. He escuchado acerca de las aplicaciones de adware reempaquetadas, modificadas (identificación del editor de anuncios modificada) y enviadas al mercado. – piotrpo

+0

¿es la huella digital de la firma o simplemente la firma? es diferente del generado por 'keytool -printcert -file sign.rsa' – Zennichimaro

Cuestiones relacionadas