2009-12-10 16 views
18

Google Chrome verwendet alphanumerische Hashwerte als Bezeichner für die Chrome-Erweiterungen. Für z. "ajpkpebebdhofmmjfgcjjiiejpodla" ist die Kennung für XMarks Bookmark Sync extension.Google Chrome - Alphanumerische Hashwerte zur Identifizierung von Erweiterungen

Welcher Algorithmus wird hier verwendet, um solche Strings zu generieren? Wie sichern sie Einzigartigkeit?

+14

Sicher kann ich. Aber sollte das bedeuten, dass Fragen zu Open-Source-Projekten als Antwort auf "gehen und nachsehen" gefragt werden? –

Antwort

16

Chrom generiert die ID über einen öffentlichen Schlüssel. Wenn Sie die Erweiterungsgalerie verwenden, behandeln sie alles für Sie.

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

einen Blick auf extension.cc Datei Nehmen Sie es detailliertere Informationen wie die Erzeugung der .pem-Datei exncoding/Decodierung hat usw.

+1

HINWEIS: Beim Laden einer Erweiterung aus der Datei wird dieser Dateipfad (ohne nachgestellte Zeilenumbrüche) zur Berechnung des Hashwerts verwendet. – Lekensteyn

28

Um genau zu sein, es ist die ersten 128 Bits des SHA256 eines öffentlichen RSA-Schlüssels, der in Basis 16 kodiert ist.

Ein weiteres zufälliges Bit der Trivialität ist, dass die Codierung Ap anstelle von 0-9a-f verwendet. Der Grund dafür ist, dass führende numerische Zeichen im Hostfeld eines Ursprungs möglicherweise von Chrome als potenzielle IP-Adressen behandelt werden. Wir bezeichnen es intern als "mpdecimal" nach dem Typen, der es erfunden hat.

+2

Guten alten Morris Peterman! – bzlm

+0

Gibt es eine "Get ID" JS-Methode für Erweiterungen? Dies ist besonders nützlich beim Debuggen, da sich die ID jedes Mal ändert, wenn Sie eine entpackte Erweiterung laden. – jonathanberi

+1

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

0

Um noch genauer zu sein, ist die Eingabe in den SHA256-Hash der X.509 SubjectPublicKeyInfo-Block, DER-codiert. Dies ist das fünfte Feld im CRX-Header, wie in CRX Package Format beschrieben. Es ist auch die Byte-Sequenz, die Sie erhalten, wenn Sie den Wert von "Schlüssel" im Manifest und Base-64 dekodieren.

0

Hier ist die einfache Möglichkeit, in bash (und OpenSSL) das X.509 SubjectPublicKeyInfo Block zu bekommen, DER-codiert:

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

Wo $pem die private Schlüsseldatei ist, RSA verschlüsselt.

Um die SHA256 Digest zu erhalten benötigen Sie die folgenden auf die Datei aus der vorherigen Zeile resultierende auszuführen:

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

Alles, was bleibt, ist die resultierende 32 Zeichen Zeichenfolge zu nehmen und sie von regelmäßigen Sechseck ändern ([0-9] [af]) bis ([ap]) wobei a mit 0 und p übereinstimmt, die mit f übereinstimmen.

Mit ein wenig Aufwand bin ich mir ziemlich sicher, dass diese zwei Schritte zu einem One-Liner gemacht werden könnten. Ich hoffe, Sie finden es hilfreich und wenn ja, lassen Sie es mich wissen.

13

Hier ist ein Linux-Motto:

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

schön formatiert, um die Lesbarkeit

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

Sie rocken! Danke für die Bereitstellung der Lösung - Fehler, außer dass es nicht den richtigen Schlüssel generiert – qodeninja

+1

Kürzere Version: 'openssl rsa -pubout -outform DER Lekensteyn

+0

HINWEIS: Verwenden Sie keine Variablen, (nul) Bytes werden gegessen, was den Hashwert verfälscht. Siehe https://github.com/Lekensteyn/apk-downloader/commit/bd41dad20928365c1410b014e86cfa5309f1bb1e auf dem falschen Weg, es zu tun und eine Alternative, die den Hash korrekt berechnet. – Lekensteyn

2

Ein netter kleiner Bash-Skript für eine Art und Weise "idiotensicher" Ihre Erweiterungen ID herauszufinden. Danke an A-Tuin für den oneliner Befehl.

#!/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