2009-12-10 57 views
18

谷歌瀏覽器使用字母數字散列作爲Chrome擴展的標識符。例如。 「ajpgkpeckebdhofmmjfgcjjiiejpodla」是XMarks書籤同步擴展的標識符。谷歌瀏覽器 - 用字母數字散列來標識擴展

這裏使用哪種算法來生成這樣的字符串?他們如何確保獨特性?

+14

當然可以。但是,這是否意味着與開源項目相關的問題會得到「去查找」作爲答案? – 2009-12-10 18:29:43

回答

16

Chromium通過公鑰生成id。如果你使用擴展庫,他們會爲你處理所有的事情。

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

看一看extension.cc文件它有更多的詳細信息,如生成.pem文件exncoding /解碼等

+1

注意:從文件加載擴展時,將使用該文件路徑(不帶結尾的換行符)來計算散列。 – Lekensteyn 2013-01-21 13:23:50

28

確切地說,它是基地址16編碼的RSA公鑰SHA256的前128位。

瑣事的另一個隨機位是編碼使用ap而不是0-9a-f。原因是Chrome的主機字段中的前導數字字符可能會被視爲潛在的IP地址。我們在內部將它稱作「mpdecimal」,後面是提出這個問題的人。

+2

好老莫里斯彼得曼! – bzlm 2010-03-14 13:19:31

+0

是否存在用於擴展的「獲取ID」JS方法?這在調試時特別有用,因爲每次加載解壓後的擴展名時ID都會更改。 – jonathanberi 2010-12-26 04:56:48

+1

beriberikix:yes,'chrome.i18n.getMessage(「@@ extension_id」)' – 2011-01-31 04:34:45

0

更準確地說,SHA256散列的輸入是DER編碼的X.509 SubjectPublicKeyInfo塊。這是CRX Package Format中描述的crx標題中的第5個字段。如果您在清單中獲取「key」的值並且base-64將其解碼,那麼它也是您獲得的字節序列。

0

下面是在bash(和OpenSSL)最簡單的方式來獲得X.509 SubjectPublicKeyInfo進行塊,DER編碼:

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

哪裏$pem是私鑰文件,RSA編碼。

要獲得SHA256摘要你需要運行對之前線產生的文件如下:

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

剩下的工作就是要承擔由此產生的32字符字符串,並將其從普通十六進制改變([0-9] [af])至([ap])其中a匹配0p匹配f

經過一番努力,我很確定這兩個步驟可以做成一行。我希望你覺得它有幫助,如果有的話,請讓我知道。

13

這裏是一個linux一個襯墊:

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

很好的格式化的可讀性

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

你搖滾!感謝您提供的解決方案 - 錯誤,除非它沒有生成正確的密鑰 – qodeninja 2012-04-18 17:28:46

+1

較短的版本:'openssl rsa -pubout -outform DER Lekensteyn 2013-01-21 13:23:08

+0

注意:不要使用變量,(nul)字節被吃掉會破壞散列。看到https://github.com/Lekensteyn/apk-downloader/commit/bd41dad20928365c1410b014e86cfa5309f1bb1e錯誤的方式來做到這一點,並正確計算散列的替代方案。 – Lekensteyn 2013-02-05 11:08:42

2

一個 「白癡證明」 的辦法,找出你的擴展ID一個不錯的小bash腳本。感謝A-Tuin提供的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