Google Chrome は、Chrome 拡張機能の識別子として英数字のハッシュを使用しています。たとえば。「ajpgkpeckebdhofmmjfgcjjiiejpodla」は、XMarks Bookmark Sync 拡張機能の識別子です。
このような文字列を生成するために、ここではどのアルゴリズムが使用されていますか? 彼らはどのようにして一意性を確保していますか?
Google Chrome は、Chrome 拡張機能の識別子として英数字のハッシュを使用しています。たとえば。「ajpgkpeckebdhofmmjfgcjjiiejpodla」は、XMarks Bookmark Sync 拡張機能の識別子です。
このような文字列を生成するために、ここではどのアルゴリズムが使用されていますか? 彼らはどのようにして一意性を確保していますか?
正確には、base 16 でエンコードされた RSA 公開鍵の SHA256 の最初の 128 ビットです。
もう 1 つのランダムなトリビアは、エンコーディングが 0-9a-f の代わりに ap を使用することです。その理由は、オリジンのホスト フィールドの先頭の数字が、Chrome によって潜在的な IP アドレスとして扱われてしまう可能性があるためです。内部では、それを思いついた人にちなんで「mpdecimal」と呼んでいます。
Chromium は公開鍵を介して ID を生成します。拡張機能ギャラリーを使用する場合は、それらがすべて処理されます。
ソースから:
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/decoding の生成など、より詳細な情報が含まれています。
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'
秘密鍵から拡張機能IDを計算するための短いRubyスクリプトを投稿しました:http ://supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233 。これは、ErikKayによるフォーマットの説明にほぼ従っています。
拡張機能の ID を見つけるための「馬鹿げた証明」方法のための素敵な小さな bash スクリプト。oneliner コマンドを提供してくれた A-Tuin に感謝します。
#!/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
appid を簡単に計算できるようにcrx_appid gem を作りました。
https://rubygems.org/gems/crx_appid
$ gem install crx_appid
$ crx_appid extension.pem
さらに正確に言うと、SHA256 ハッシュへの入力は、DER エンコードされた X.509 SubjectPublicKeyInfo ブロックです。CRX Package Formatで説明されているように、これは crx ヘッダーの 5 番目のフィールドです。これは、マニフェストの "key" の値を取得して base-64 でデコードした場合に得られるバイト シーケンスでもあります。
DER でエンコードされた X.509 SubjectPublicKeyInfo ブロックを取得するための bash (および openssl) の簡単な方法を次に示します。
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 文字の文字列を取得して、通常の 16 進数 ( [0-9][ af ]) から ([ap]a
)に0
変更するだけです。p
f
少し努力すれば、これらの 2 つのステップをワンライナーにできると確信しています。お役に立てば幸いです。もしそうなら、お知らせください。