google chrome extension - remoto - Google Chrome-hashes alfanuméricos para identificar extensiones
google chrome apps (8)
Google Chrome utiliza hashes alfanuméricos como identificadores para las extensiones de Chrome. Por ejemplo. "ajpgkpeckebdhofmmjfgcjjiiejpodla" es el identificador de la extensión XMarks Bookmark Sync.
¿Qué algoritmo se usa aquí para generar tales cadenas? ¿Cómo están asegurando la singularidad?
Aquí está la manera fácil en bash (y openssl) para obtener el bloque X.509 SubjectPublicKeyInfo, codificado DER:
openssl rsa -pubout -outform DER < "$pem" > "$pub" 2>/dev/null
Donde $pem
es el archivo de clave privada, codificado RSA.
Para obtener el Compendio SHA256, debe ejecutar lo siguiente en el archivo resultante de la línea anterior:
openssl dgst -sha256 $pub | awk ''{print $2}'' | cut -c 0-32
Todo lo que queda es tomar la cadena de 32 caracteres resultante y cambiarla de hexadecimal regular ( [0-9] [af]) a ([ap] ) donde coinciden 0
p
coinciden con f
.
Con un poco de esfuerzo, estoy bastante seguro de que estos dos pasos podrían convertirse en una sola línea. Espero que les resulte útil y, si es así, hágamelo saber.
Aquí hay un linux one liner:
cat FILE.PEM | openssl rsa -pubout -outform DER | openssl dgst -sha256 | awk ''{print $2}'' | cut -c 1-32 | tr ''0-9a-f'' ''a-p''
muy bien formateado para facilitar la lectura
cat FILE.PEM | /
openssl rsa -pubout -outform DER | /
openssl dgst -sha256 | /
awk ''{print $2}'' | /
cut -c 1-32 | /
tr ''0-9a-f'' ''a-p''
Chromium genera el id mediante clave pública. Si usas la galería de extensiones, ellos manejan todo eso por ti.
De la source :
bool Extension::GenerateId(const std::string& input, std::string* output) {
CHECK(output);
if (input.length() == 0)
return false;
const uint8* ubuf = reinterpret_cast<const unsigned char*>(input.data());
SHA256Context ctx;
SHA256_Begin(&ctx);
SHA256_Update(&ctx, ubuf, input.length());
uint8 hash[Extension::kIdSize];
SHA256_End(&ctx, hash, NULL, sizeof(hash));
*output = StringToLowerASCII(HexEncode(hash, sizeof(hash)));
ConvertHexadecimalToIDAlphabet(output);
return true;
}
Eche un vistazo al archivo extension.cc que contiene información más detallada, como generar el archivo .pem, exncoding / decoding, etc.
He publicado una breve secuencia de comandos de Ruby para calcular el ID de extensión a partir de la clave privada: http://supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233 . Esto sigue bastante bien la descripción del formato de Erik Kay.
Para ser aún más precisos, la entrada al hash SHA256 es el bloque X.509 SubjectPublicKeyInfo, con codificación DER. Este es el quinto campo en el encabezado de crx como se describe en Formato de paquete CRX . También es la secuencia de bytes que obtiene si toma el valor de "clave" en el manifiesto y la base-64 lo descodifica.
Para ser precisos, son los primeros 128 bits del SHA256 de una clave pública RSA codificada en la base 16.
Otro bit aleatorio de trivia es que la codificación utiliza ap en lugar de 0-9a-f. La razón es que los caracteres numéricos iniciales en el campo host de un origen pueden terminar siendo tratados como direcciones IP potenciales por Chrome. Nos referimos a él internamente como "mpdecimal" después del chico que lo creó.
Un pequeño y agradable script de bash para una forma de "prueba de idiotas" para descubrir su id de extensiones. Gracias a A-Tuin por el comando oneliner.
#!/bin/bash
txtred=$(tput setaf 1) # Red
echo "Script to generate extension id from your extensions .pem file"
sleep 2
while true; do
read -e -p "Enter local file path for your pem file " PEMFILE
if [[ $PEMFILE != *.pem ]]; then
echo "That is not a .pem file. Please enter a correct .pem file"
sleep 2
else
break
fi
done
PEMFILEGEN=`cat $PEMFILE | openssl rsa -pubout -outform DER | openssl dgst -sha256 | awk ''{print $2}'' | cut -c 1-32 | tr ''0-9a-f'' ''a-p''`
echo "Your extension id is:${txtred} $PEMFILEGEN${textred}"
tput sgr0
exit 0