谷歌瀏覽器使用字母數字散列作爲Chrome擴展的標識符。例如。 「ajpgkpeckebdhofmmjfgcjjiiejpodla」是XMarks書籤同步擴展的標識符。谷歌瀏覽器 - 用字母數字散列來標識擴展
這裏使用哪種算法來生成這樣的字符串?他們如何確保獨特性?
谷歌瀏覽器使用字母數字散列作爲Chrome擴展的標識符。例如。 「ajpgkpeckebdhofmmjfgcjjiiejpodla」是XMarks書籤同步擴展的標識符。谷歌瀏覽器 - 用字母數字散列來標識擴展
這裏使用哪種算法來生成這樣的字符串?他們如何確保獨特性?
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 /解碼等
注意:從文件加載擴展時,將使用該文件路徑(不帶結尾的換行符)來計算散列。 – Lekensteyn 2013-01-21 13:23:50
確切地說,它是基地址16編碼的RSA公鑰SHA256的前128位。
瑣事的另一個隨機位是編碼使用ap而不是0-9a-f。原因是Chrome的主機字段中的前導數字字符可能會被視爲潛在的IP地址。我們在內部將它稱作「mpdecimal」,後面是提出這個問題的人。
好老莫里斯彼得曼! – bzlm 2010-03-14 13:19:31
是否存在用於擴展的「獲取ID」JS方法?這在調試時特別有用,因爲每次加載解壓後的擴展名時ID都會更改。 – jonathanberi 2010-12-26 04:56:48
beriberikix:yes,'chrome.i18n.getMessage(「@@ extension_id」)' – 2011-01-31 04:34:45
我已經發布了一個簡短的Ruby腳本來計算私鑰的擴展名:http://supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233。這非常符合Erik Kay對格式的描述。
看起來很酷!將檢查出來! – 2010-01-19 05:07:54
更準確地說,SHA256散列的輸入是DER編碼的X.509 SubjectPublicKeyInfo塊。這是CRX Package Format中描述的crx標題中的第5個字段。如果您在清單中獲取「key」的值並且base-64將其解碼,那麼它也是您獲得的字節序列。
下面是在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
匹配0
和p
匹配f
。
經過一番努力,我很確定這兩個步驟可以做成一行。我希望你覺得它有幫助,如果有的話,請讓我知道。
這裏是一個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'
你搖滾!感謝您提供的解決方案 - 錯誤,除非它沒有生成正確的密鑰 – qodeninja 2012-04-18 17:28:46
較短的版本:'openssl rsa -pubout -outform DER
注意:不要使用變量,(nul)字節被吃掉會破壞散列。看到https://github.com/Lekensteyn/apk-downloader/commit/bd41dad20928365c1410b014e86cfa5309f1bb1e錯誤的方式來做到這一點,並正確計算散列的替代方案。 – Lekensteyn 2013-02-05 11:08:42
我做crx_appid寶石容易計算的appid。
https://rubygems.org/gems/crx_appid
$ gem install crx_appid
$ crx_appid extension.pem
一個 「白癡證明」 的辦法,找出你的擴展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
當然可以。但是,這是否意味着與開源項目相關的問題會得到「去查找」作爲答案? – 2009-12-10 18:29:43