2010-11-09 11 views
9

Actualmente estoy desarrollando servicios de RPC para desarrolladores, pero me gustaría asegurarme de que puedo distinguir entre la clave de depuración de otra aplicación y su clave pública. ¿Hay alguna forma de verificar la clave de otra aplicación y decir si es una clave de depuración y NO una clave de aplicación publicada?¿Hay alguna manera de verificar si la firma de una aplicación se depura o publica?

El propósito de esto es poder decir cuándo su aplicación se encuentra en estado de desarrollo o de lanzamiento, ya que necesito poder decir si deben acceder a mi servidor de desarrollo o mi servidor de producción.

+0

Ambos han proporcionado información realmente útil. Votando ambas respuestas. –

Respuesta

4

Por defecto, el androiddebugkey utilizado por Eclipse (por ejemplo) tiene un notAfter fecha & tiempo que es como máximo 1 año en el futuro - un valor tan corto no es aceptada por el Android Market - usted podría utilizar eso para diferenciar entre desarrolladores firmados? O ... simplemente podría verificar la clave pública que utiliza la aplicación, hacer que firmen las solicitudes RPC con el android.content.pm.firma de su aplicación.

 
PackageInfo pkgInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES); 

for (Signature appSignature : pkgInfo.signatures) { 
    // javax.security - NOT java.security! 
    X509Certificate appCertificate = X509Certificate.getInstance(appSignature.toByteArray()); 
    // appCertificate.getNotAfter() can give you the date & time the cert expires 
    // appCertificate.getPublicKey() can give you the public key you sign the RPC requests with. 
    // appCertificate.getSubjectDN() will give you a Principal named "CN=Android Debug,O=Android,C=US" for any debug certificate that hasn't been handcrafted by the developer. 
} 
+0

¡Gracias por ayudarme! Ha pasado tanto tiempo que casi me había dado por vencido. El problema aquí es que la clave es "por defecto" 1 año. He configurado mis claves de depuración durante 25 años ... Esta es la razón por la que necesito saber la diferencia. ¿Alguna idea? –

+0

Creo que este es el camino correcto. El getSubjectDN() es definitivamente una posibilidad. ¿Puede decirme dónde encontró esta información, así que puedo investigarla un poco más? –

+0

Después de hacer algunas investigaciones adicionales con esta guía, se me ocurrió una solución efectiva. Es de varias partes, pero representa tantas circunstancias como sea posible. Primero es verificar la fecha. Entonces, el SubjectDN. Finalmente, en otra falla, comparé la clave pública con una consulta de mercado. Ciertamente, ni siquiera cerca de una solución completa, pero se adapta a la mayoría de mis necesidades. Gracias de nuevo por esta increíble información. –

4
static final String DEBUGKEY = 
     " key ";  


public static boolean signedWithDebugKey(Context context, Class<?> cls) 
{ 
    boolean result = false; 
    try { 
     PackageInfo pinfo = context.getPackageManager().getPackageInfo("your package name",PackageManager.GET_SIGNATURES); 
     Signature sigs[] = pinfo.signatures; 

     Log.d(TAG,sigs[0].toCharsString()); 

     if (DEBUGKEY.equals(sigs[0].toCharsString())) { 
      result = true; 
      Log.d(TAG,"package has been signed with the debug key"); 
     } else { 
      Log.d(TAG,"package signed with a key other than the debug key"); 
     } 

    } catch (android.content.pm.PackageManager.NameNotFoundException e) { 
     return false; 
    } 

    return result; 

} 

Ejecutar este código primera vez con debugkey, esto todos los días volver falsa, pero usted conseguir la llave codificada en el Logcat. Copia esa clave codificada y reemplaza la "clave" de valor de DEBUGKEY, y funcionará bien.

+0

Necesita descomprimir la firma, utilizando por ejemplo javax.security.X509Certificate - sigs [0] .toCharsString() no devuelve "androiddebugkey", devuelve una cadena codificada en hexadecimal grande. – Jens

+0

Lo siento, he solucionado la respuesta. – xtr

+1

static final String DEBUGKEY = " key "; Esta línea parece insinuar que ya conozco la clave de depuración, ¿estoy en lo correcto? Si lo estoy, posiblemente no pueda conocer la clave de depuración ya que es proporcionada por otro desarrollador. La forma en que mi API funciona es que para una aplicación de depuración es gratuita para su uso con las pruebas, pero para una aplicación publicada, el desarrollador debe pagar una tarifa mínima para integrarse. Es esencial que sepa si la clave está depurada o publicada sin saber cuál es la clave. –

Cuestiones relacionadas