2011-06-08 20 views
6

Estoy trabajando en un proyecto que implica la lectura de datos de clave pública utilizados para firmar APK de Android. Puedo extraer las firmas con éxito como claves públicas. Cuando miro dentro de los archivos pubkey binarios producidos por esto, veo algunos textos sin formato, como un nombre y una ciudad.Extraer datos de la clave pública de RSA

¿Cómo puedo extraer de forma segura esta información de nombre/ciudad incrustada dentro de la clave pública mediante PHP (o incluso Java o C#)? Y con suerte lo hago de tal manera que sé exactamente cuáles son estos campos (es decir, no agarrar ciegamente el texto, pero saber qué cadena es una ciudad y cuál es un nombre)

Para aclaración: No tengo la clave privada o un archivo de certificado. Actualmente no estoy interesado en firmar o encriptar nada, solo me gustaría extraer el texto sin formato dentro de la clave pública sin utilizar enfoques kludgy como regex.

Actualización: He aquí una muestra de clave pública (codificado en base 64) de uno de mis APK

MIICBzCCAXCgAwIBAgIES6KlazANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQGEwJVUzELMAkGA1UECBMCUkkxFTATBgNVBAcTDE5hcnJhZ2Fuc2V0dDEVMBMGA1UEAxMMQ29saW4gTydEZWxsMB4XDTEwMDMxODIyMTI1OVoXDTQ1MDMwOTIyMTI1OVowSDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlJJMRUwEwYDVQQHEwxOYXJyYWdhbnNldHQxFTATBgNVBAMTDENvbGluIE8nRGVsbDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAmPetcBW+ITURXY0LsI2ZfgM3R7K2kwicgpd0W+BYAXQBh76SXyN9MYvtfnUY3SNz37FW/lDQgAO3pbhEFqGwfADh2ctXlYmlE9DtcRQw0ojGVPIDlWBX+9IUxyL/89CPaN84R/1lvdosco4V0BqQYR300S9ZwmwFA2Vh9hSUZmsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBezKu4G11Z68NTPIBro8xsnbkdYxObzW7BsSr6t9MS5x6EQVs75R/nnKrsMcQ+9ImdT940jhQgZT3ZrYla5VhdbelxnLhBVbJfBdipV3Hv2bG7MnXzFqHYwQqYp+UrP8zWm1YHQf5I/P9VBjlkgwFyNKr0TxP4t/qS08oGX2wvZg== 
+0

Regex se kludgy? :( – FlyingStreudel

+0

¿Puede publicar un ejemplo de los "archivos pubkey binarios producidos por este"? Utilice la codificación Base-64 para convertirlo en texto post-able. – erickson

+0

@FlyingStreudel - Regex ciertamente puede ser útil en muchos escenarios, pero no lo hago Creo que es apropiado para esta tarea: P –

Respuesta

3

La cadena que ingresa es un certificado x509 codificado en base 64, no simplemente una clave pública.

Deberá analizar los campos de Nombre distinguido para obtener la información deseada.

Aquí está un ejemplo de C#:

using System; 
using System.Security.Cryptography.X509Certificates; 

namespace Sample 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     string base64EncodedX509 = 
      "MIICBzCCAXCgAwIBAgIES6KlazANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQGEwJVUzELMAkGA1UECBMCUkkxFTATBgNVBAcTDE5hcnJhZ2Fuc2V0dDEVMBMGA1UEAxMMQ29saW4gTydEZWxsMB4XDTEwMDMxODIyMTI1OVoXDTQ1MDMwOTIyMTI1OVowSDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlJJMRUwEwYDVQQHEwxOYXJyYWdhbnNldHQxFTATBgNVBAMTDENvbGluIE8nRGVsbDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAmPetcBW+ITURXY0LsI2ZfgM3R7K2kwicgpd0W+BYAXQBh76SXyN9MYvtfnUY3SNz37FW/lDQgAO3pbhEFqGwfADh2ctXlYmlE9DtcRQw0ojGVPIDlWBX+9IUxyL/89CPaN84R/1lvdosco4V0BqQYR300S9ZwmwFA2Vh9hSUZmsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBezKu4G11Z68NTPIBro8xsnbkdYxObzW7BsSr6t9MS5x6EQVs75R/nnKrsMcQ+9ImdT940jhQgZT3ZrYla5VhdbelxnLhBVbJfBdipV3Hv2bG7MnXzFqHYwQqYp+UrP8zWm1YHQf5I/P9VBjlkgwFyNKr0TxP4t/qS08oGX2wvZg=="; 
     var rawBytes = Convert.FromBase64String(base64EncodedX509); 

     X509Certificate cert = new X509Certificate(rawBytes); 

     // Parse the distinguished name to get your desired fields 

     Console.WriteLine(cert.Subject); // writes CN=Colin O'Dell, L=Narragansett, S=RI, C=US 
     Console.WriteLine(cert.Issuer); // writes CN=Colin O'Dell, L=Narragansett, S=RI, C=US 
    } 
} 
} 
+0

Esto es perfecto :) Después de informarme que de hecho tenía un certificado, se me ocurrió una solución PHP similar para volcar los datos usando '$ dataAsArray = openssl_x509_parse (openssl_x509_read ($ pemFormattedCertString));' –

0

en PHP, no estoy seguro, pero tal vez this function podría ser su amigo. Hay un whole section de funciones relacionadas con SSL que pueden ser útiles si está jugando con certificados.

+0

Tal vez, pero solo tengo la clave pública y no un certificado completo. Revisé esa lista de funciones antes, pero no pude encontrar nada que específicamente quisiera que yo quisiera. Tal vez me perdí algo? –

1

Los "archivos binarios pubkey producidos por este" es un certificado X.509.

Casi cualquier plataforma tiene soporte para leer certificados X.509 y crear una estructura a partir de ellos, desde la cual puede extraer de manera confiable el "nombre del sujeto" y, a menudo, información extendida que incluye una dirección de correo electrónico o nombre de host.

Por ejemplo, si tiene instalado OpenSSL, utilice el siguiente comando:

openssl x509 -text -noout -inform der -in <yourfilehere> 

se puede extraer campos específicos con opciones adicionales. Por ejemplo, la adición de -subject rendimientos:

subject =/C = US/ST = RI/L = Narragansett/CN = Colin O'Dell

Cuestiones relacionadas