2009-12-10 10 views
18

Google Chrome utilise des hachages alphanumériques comme identifiants pour les extensions Chrome. Par exemple. "ajpgkpeckebdhofmmjfgcjjiiejpodla" est l'identifiant de l'extension XMarks Bookmark Sync.Google Chrome - Des hachages alphanumériques pour identifier les extensions

Quel algorithme est utilisé ici pour générer de telles chaînes? Comment assurent-ils l'unicité?

+14

Bien sûr que je peux. Mais cela signifie-t-il que les questions liées aux projets open source obtiennent une réponse? –

Répondre

16

Chromium génère l'ID via la clé publique. Si vous utilisez la galerie d'extension, ils gèrent tout cela pour vous.

De l'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; 
} 

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.

+1

REMARQUE: lors du chargement d'une extension à partir d'un fichier, ce chemin de fichier (sans saut de ligne final) est utilisé pour calculer le hachage. – Lekensteyn

28

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

Un autre bit aléatoire de trivia est que le codage utilise ap au lieu de 0-9a-f. La raison en est que les principaux caractères numériques dans le champ hôte d'une origine peuvent être traités comme des adresses IP potentielles par Chrome. Nous nous référons à l'intérieur comme "mpdecimal" après le gars qui l'a inventé.

+2

Bon vieux Morris Peterman! – bzlm

+0

Existe-t-il une méthode JS "get ID" pour les extensions? Ceci est particulièrement utile lors du débogage car l'ID change chaque fois que vous chargez une extension décompressée. – jonathanberi

+1

beriberikix: oui, 'chrome.i18n.getMessage (" @@ extension_id ")' –

0

Pour être encore plus précis, l'entrée du hachage SHA256 est le bloc X.509 SubjectPublicKeyInfo, codé DER. Ceci est le 5ème champ dans l'en-tête crx comme décrit dans CRX Package Format. C'est aussi la séquence d'octets que vous obtenez si vous prenez la valeur de "clé" dans le manifeste et que la base-64 le décode.

0

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 encodées.

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 à prendre la chaîne résultante 32 char et changer de hex régulière ([0-9] [af]) à ([ap]) où a correspond à 0 et p correspond à f. Avec un peu d'effort, je suis à peu près sûr que ces deux étapes pourraient être transformées en une seule doublure. J'espère que vous le trouverez utile et si oui, s'il vous plaît faites le moi savoir.

13

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 une meilleure 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' 
+0

vous rock! merci de fournir la solution - err sauf qu'il n'a pas généré la bonne clé – qodeninja

+1

Version plus courte: 'openssl rsa -pubout -outform DER Lekensteyn

+0

NOTE: n'utilisez pas de variables, les octets (nuls) sont mangés ce qui peut corrompre le hachage. Voir https://github.com/Lekensteyn/apk-downloader/commit/bd41dad20928365c1410b014e86cfa5309f1bb1e sur la mauvaise façon de le faire et une alternative qui calcule correctement le hachage. – Lekensteyn

2

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 
Questions connexes