9

拡張機能を生成する自動プロセスを構築しています。拡張機能 ID を直接計算し、ブラウザとの対話を完全にバイパスするコード例はありますか?

(私は以下の私自身の質問に答えています。)

4

3 に答える 3

11

私は Ruby の断片を含む関連記事しか見つけることができませんでした。これは IA でのみ利用可能です: http://web.archive.org/web/20120606044635/http://supercollider.dk/2010/01/calculating- chrome-extension-id-from-your-private-key-233

知っておくべき重要事項:

  1. これは、PEM でエンコードされたキー (DER キーを base64 でエンコードして生成された適切な ASCII) ではなく、DER でエンコードされた公開キー (生のバイナリ) に依存します。
  2. 拡張 ID は base-16 ですが、[0-9a-f] ではなく [ap] (「mpdecimal」と呼ばれます) を使用してエンコードされます。

PEM でエンコードされた公開鍵を使用して、次の手順に従います。

  1. PEM 形式の公開鍵にまだヘッダーとフッターがあり、複数の行に分割されている場合は、手動で再フォーマットして、ヘッダーとフッターを除外した単一の文字列を持ち、すべての行がキーは次へラップします。
  2. 公開鍵を Base64 デコードして、DER 形式の公開鍵をレンダリングします。
  3. DER 形式のキーの SHA256 16 進ダイジェストを生成します。
  4. ハッシュの最初の 32 バイトを取得します。残りは必要ありません。
  5. 各文字を base-10 に変換し、'a' の ASCII コードを追加します。

以下は、これを行うための Python ルーチンです。

import hashlib
from base64 import b64decode

def build_id(pub_key_pem):
    pub_key_der = b64decode(pub_key_pem)
    sha = hashlib.sha256(pub_key_der).hexdigest()
    prefix = sha[:32]

    reencoded = ""
    ord_a = ord('a')
    for old_char in prefix:
        code = int(old_char, 16)
        new_char = chr(ord_a + code)

        reencoded += new_char

    return reencoded

def main():
    pub_key = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjvF5pjuK8gRaw/2LoRYi37QqRd48B/FeO9yFtT6ueY84z/u0NrJ/xbPFc9OCGBi8RKIblVvcbY0ySGqdmp0QsUr/oXN0b06GL4iB8rMhlO082HhMzrClV8OKRJ+eJNhNBl8viwmtJs3MN0x9ljA4HQLaAPBA9a14IUKLjP0pWuwIDAQAB'

    id_ = build_id(pub_key)
    print(id_)

if __name__ == '__main__':
    main()

これを既存の拡張機能とその ID に対してテストすることは大歓迎です。PEM 形式の公開鍵を取得するには:

  1. Chrome の既存の拡張機能のリストに移動します。1 つの拡張 ID を取得します。
  2. 拡張機能がホストされているディレクトリを見つけます。私の Windows 7 ボックスでは、C:\Users<username>\AppData\Local\Google\Chrome\User Data\Default\Extensions<extension ID> です。
  3. 「key」の下の manifest.json ファイルから公開鍵を取得します。キーはすでに base64 でデコードする準備ができているため、プロセスのステップ (1) をスキップできます。

この例の公開鍵は、「Chrome Reader」拡張機能からのものです。その拡張 ID は「lojpenhmoajbiciapkjkiekmobleogjc」です。

以下も参照してください。

  1. Google Chrome - 拡張機能を識別するための英数字のハッシュ
  2. http://blog.roomanna.com/12-14-2010/getting-an-extensions-id
于 2013-06-07T21:48:20.490 に答える
3

chrome は秘密の .pem キーのみを生成するため、python を使用して .crx ファイルから公開キーを取得するための便利で簡単な方法です。公開鍵は、実際には .crx ファイルに保存されます。

これは、 http: //developer.chrome.com/extensions/crx.html にある .crx ファイルの形式に基づいています。

import struct
import hashlib
import string

def get_pub_key_from_crx(crx_file):
    with open(crx_file, 'rb') as f:
        data = f.read()
    header = struct.unpack('<4sIII', data[:16])
    pubkey = struct.unpack('<%ds' % header[2], data[16:16+header[2]])[0]
    return pubkey

def get_extension_id(crx_file):
    pubkey = get_pub_key_from_crx(crx_file)
    digest = hashlib.sha256(pubkey).hexdigest()

    trans = string.maketrans('0123456789abcdef', string.ascii_lowercase[:16])
    return string.translate(digest[:32], trans)

if __name__ == '__main__':
    import sys
    if len(sys.argv) != 2:
        print 'usage: %s crx_file' % sys.argv[0]

    print get_extension_id(sys.argv[1])

これは「ブラウザーとの対話をバイパスする」ことはできませんが、次のようなコマンドで .crx ファイルを生成する必要があるためです。

chrome.exe --pack-extension=my_extension --pack-extension-key=my_extension.pem
于 2014-02-11T20:10:25.897 に答える