2009-12-10 14 views
18

Google Chrome używa skrótów alfabetycznych jako identyfikatorów rozszerzeń Chrome. Na przykład "ajpgkpeckebdhofmmjfgcjjiiejpodla" jest identyfikatorem dla rozszerzenia synchronizacji zakładek XMarks.Google Chrome - alfanumeryczne hashy do identyfikacji rozszerzeń

Który algorytm jest tutaj używany do generowania takich łańcuchów? W jaki sposób zapewniają wyjątkowość?

+14

Pewnie, że mogę. Ale czy to znaczy, że pytania związane z projektami open source powinny być "idź i sprawdź" jako odpowiedzi? –

Odpowiedz

16

Chrom generuje identyfikator za pomocą klucza publicznego. Jeśli korzystasz z galerii rozszerzeń, zajmują się tym wszystkim za Ciebie.

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

Spójrz na pliku extension.cc ma więcej szczegółowych informacji takich jak generowanie plików .pem exncoding/dekodowanie itp

+1

UWAGA: podczas ładowania rozszerzenia z pliku ta ścieżka pliku (bez ciągłego znaku nowej linii) jest używana do obliczenia wartości skrótu. – Lekensteyn

28

Aby być precyzyjnym, to pierwsze 128 bitów SHA256 klucza publicznego RSA zakodowanego w bazie 16.

Innym przypadkowym źródłem ciekawostek jest to, że kodowanie używa ap zamiast 0-9a-f. Powodem jest to, że wiodące znaki numeryczne w polu hosta pochodzenia mogą zostać potraktowane przez Chrome jako potencjalne adresy IP. Odwołujemy się do niego wewnętrznie jako "mpdecimal" po facecie, który go wymyślił.

+2

Stary, dobry Morris Peterman! – bzlm

+0

Czy istnieje metoda JS "get ID" dla rozszerzeń? Jest to szczególnie przydatne podczas debugowania, ponieważ identyfikator zmienia się przy każdym ładowaniu rozpakowanego rozszerzenia. – jonathanberi

+1

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

0

Aby być jeszcze dokładniejszym, dane wejściowe do sumy kontrolnej SHA256 to blok TempublicKeyInfo X.509, kodowany DER. To jest piąte pole w nagłówku CRX, jak opisano w CRX Package Format. Jest to również sekwencja bajtów, które otrzymasz, jeśli weźmiesz wartość "klucza" w manifeście i dekodowaniu go przez bazę-64.

0

Oto prosty sposób w bash (i OpenSSL), aby uzyskać blok X.509 subjectPublicKeyInfo, DER-kodowane:

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

Gdzie $pem jest plik klucza prywatnego RSA zakodowany.

Aby uzyskać SHA256 Digest trzeba uruchomić następujący plik wynikającej z poprzedniej linii:

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

Pozostaje wziąć wynikowy ciąg 32 char i zmieniać ją od zwykłej hex ([0-9] [af]) do ([ap]), gdzie a odpowiada 0 i p odpowiada f.

Z odrobiną wysiłku, jestem prawie pewien, że te dwa kroki można przekształcić w jednolinijkową. Mam nadzieję, że okaże się to pomocne, a jeśli tak, proszę dać mi znać.

13

Oto linux jeden 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' 

ładnie sformatowany dla czytelności

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

rock! dzięki za dostarczenie rozwiązania - err, z wyjątkiem tego, że nie wygenerował właściwego klucza. – qodeninja

+1

Krótsza wersja: 'openssl rsa -pubout -outform DER Lekensteyn

+0

UWAGA: nie używaj zmiennych, (nul) pobierają bajty, które zepsują hasz. Zobacz https://github.com/Lekensteyn/apk-downloader/commit/bd41dad20928365c1410b014e86cfa5309f1bb1e na niewłaściwy sposób to zrobić i alternatywę, która poprawnie oblicza hash. – Lekensteyn

2

Miły mały skrypt bash dla „idiota dowód” sposobem, aby dowiedzieć swój identyfikator rozszerzeń. Dzięki A-Tuinowi za komendę 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