Question

Google Chrome utilise des hachages alphanumériques comme identificateurs pour les extensions Chrome. Pour exemple. "Ajpgkpeckebdhofmmjfgcjjiiejpodla" est l'identifiant de XMarks Marquer l'extension Sync.

Quel algorithme est utilisé ici pour générer ces chaînes? Comment sont-ils veiller à l'unicité?

Était-ce utile?

La solution

Le chrome génère l'identifiant par clé publique. Si vous utilisez la galerie d'extension, ils gèrent tout cela pour vous.

De la :

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

Jetez un oeil à fichier extension.cc il contient des informations plus détaillées telles que la génération du fichier .pem exncoding / décodage, etc.

Autres conseils

Pour être précis, ce sont les 128 premiers bits du SHA256 d'une clé publique RSA codée en base 16.

Un autre bit aléatoire des Anglais est que le codage utilise un p-lieu de 0-9a-f. La raison en est que les principaux caractères numériques dans le domaine hôte d'une origine peut liquider être traités comme des adresses IP possibles par Chrome. Nous l'appelons en interne comme « mpdecimal » après le gars qui est venu avec elle.

Voici un linux une doublure:

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

bien formaté pour la lisibilité

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

J'ai posté un court script Ruby pour calculer l'identifiant d'extension de la clé privée: http://supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233 . Cette jolie suit bien la description Erik Kay du format.

Un joli petit script bash pour une « idiot proof » façon de trouver votre identifiant extensions. Merci à A-Tuin pour la commande 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

J'ai fait crx_appid petit bijou pour calculer appid facilement.

https://rubygems.org/gems/crx_appid

$ gem install crx_appid
$ crx_appid extension.pem

Pour être encore plus précis, l'entrée de la table de hachage SHA256 est le bloc X.509 SubjectPublicKeyInfo, codé DER. Ce champ est le 5ème dans l'en-tête CRX comme décrit dans CRX Package Format . Il est également la séquence d'octets que vous obtenez si vous prenez la valeur de « clé » dans le manifeste et base 64 décodent.

Voici le moyen facile de bash (et OpenSSL) pour obtenir le bloc X.509 SubjectPublicKeyInfo, codé DER:

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

$pem est le fichier clé privée, RSA codé.

Pour obtenir le Digest SHA256 vous devez exécuter les opérations suivantes sur le fichier résultant de la ligne précédente:

openssl dgst -sha256 $pub | awk '{print $2}' | cut -c 0-32

Tout ce qui reste est de prendre la résultante 32 chaîne char et changer de hex régulier ( [0-9] [af]) à ([ap] ) où a correspond à des matchs de 0 et p f.

Avec un peu d'effort, je suis sûr que ces deux étapes pourraient être transformées en une seule ligne. J'espère que vous trouverez utile et si oui, s'il vous plaît laissez-moi savoir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top