Pregunta

Google Chrome está utilizando alfa hashes numéricos como identificadores para las extensiones de Chrome. Para, por ejemplo. "Ajpgkpeckebdhofmmjfgcjjiiejpodla" es el identificador para XMarks extensión sincronización de marcadores.

¿Qué es el algoritmo utilizado para generar tales cadenas? ¿Cómo son de asegurar la exclusividad?

¿Fue útil?

Solución

El cromo genera el identificador a través de clave pública. Si utiliza la galería de extensiones, que manejan todo lo que para usted.

Desde el :

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;
}

Tome un vistazo a extension.cc archivo que contiene información más detallada, como generar el archivo .pem exncoding / decodificación, etc.

Otros consejos

Para ser precisos, se trata de los primeros 128 bits de la SHA256 de una clave pública RSA codificada en base 16.

Otro poco aleatoria de preguntas y respuestas es que la codificación utiliza un-p en lugar de 0-9a-f. La razón es que los caracteres numéricos líderes en el campo de host de un origen puede terminar siendo tratados como posibles direcciones IP de cromo. Nos referimos a que internamente como "mpdecimal" después de que el tipo que se le ocurrió a él.

Aquí está un forro Linux uno:

cat FILE.PEM | openssl rsa -pubout -outform DER | openssl dgst -sha256 | awk '{print $2}' | cut -c 1-32 | tr '0-9a-f' 'a-p'

buen formato 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'

He publicado un pequeño script de Ruby para calcular el identificador de extensión de la clave privada: http://supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233 . Esto más o menos sigue descripción del formato de Erik Kay.

Un buen guión pequeña fiesta de una manera "a prueba de tontos" para averiguar su ID extensiones. Gracias a A-tuin para 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

crx_appid joya para calcular appid fácilmente.

https://rubygems.org/gems/crx_appid

$ gem install crx_appid
$ crx_appid extension.pem

Para ser aún más preciso, la entrada al hash SHA256 es el bloque X.509 SubjectPublicKeyInfo, DER-codificado. Este es el quinto campo en la cabecera CRX como se describe en CRX Paquete Formato . También es la secuencia de bytes que se obtiene si se toma el valor de "clave" en el manifiesto y la base-64 decodificarlo.

Esta es la manera fácil en bash (y openssl) para obtener el bloque X.509 SubjectPublicKeyInfo, codificado en DER:

openssl rsa -pubout -outform DER < "$pem" > "$pub" 2>/dev/null

Cuando $pem es el archivo de clave privada RSA codificada.

Para obtener el Digesto SHA256 tiene que 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 32 Char resultante y cambiarlo de hex regular ( [0-9] [af]) a ([ap] ) donde a coincide 0 y p partidos f.

Con un poco de esfuerzo, estoy bastante seguro de que estos dos pasos se podrían hacer en una sola línea. Espero que le sea útil y si es así, por favor hágamelo saber.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top