Как программно вычислять идентификатор расширения Chrome?

Я создаю автоматизированный процесс для создания расширений. Есть ли пример кода для вычисления идентификатора расширения напрямую и полностью в обход взаимодействия с браузером?

(Я отвечаю на свой вопрос ниже).

Мне удалось найти связанную статью с фрагментом Ruby, и она доступна только в IA: http://web.archive.org/web/20120606044635/http://supercollider.dk/2010/01/calculating- хром-разгибание Ид из-вашего-частного ключа-233

Важно знать:

  1. Это зависит от открытого ключа с DER-кодом (raw-двоичный код), а не от PEM-кодированного ключа (хороший ASCII, сгенерированный base64-кодировкой ключа DER).
  2. Идентификаторы расширения – base-16, но кодируются с использованием [ap] (называемого «mpdecimal»), а не [0-9a-f].

Используя открытый ключ PEM, выполните следующие действия:

  1. Если ваш открытый ключ PEM-формата по-прежнему имеет верхний и нижний колонтитулы и разделен на несколько строк, переформатируйте его вручную, чтобы у вас была одна строка символов, которая исключает верхний и нижний колонтитулы, и работает вместе так, что каждая строка привязки клавиш к следующему.
  2. Base64-decode открытый ключ для визуализации открытого ключа DER.
  3. Создайте шестнадцатеричный дайджест SHA256 ключа в формате DER.
  4. Возьмите первые 32 байта хэша. Вам не понадобятся остальные.
  5. Для каждого символа преобразуйте его в base-10 и добавьте код ASCII для 'a'.

Ниже приведена процедура 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() 

Вы более чем можете протестировать это против существующего расширения и его идентификатора. Чтобы получить открытый ключ PEM-формата:

  1. Перейдите в список существующих расширений в Chrome. Возьмите идентификатор расширения.
  2. Найдите каталог, в котором размещено расширение. В моем окне Windows 7 это: C: \ Users \\ AppData \ Local \ Google \ Chrome \ Пользовательские данные \ Стандартные \ Расширения \
  3. Возьмите открытый ключ из файла manifest.json в разделе «ключ». Поскольку ключ уже готов к декодированию base64, вы можете пропустить шаг (1) процесса.

Открытый ключ в этом примере относится к расширению «Chrome Reader». Его идентификатор расширения – «lojpenhmoajbiciapkjkiekmobleogjc».

Смотрите также:

  1. Google Chrome – буквенно-цифровые хеши для идентификации расширений
  2. http://blog.roomanna.com/12-14-2010/getting-an-extensions-id

Хороший и простой способ получить открытый ключ из .crx-файла с помощью python, так как chrome только генерирует закрытый ключ .pem для вас. Открытый ключ фактически хранится в файле .crx.

Это основано на формате файла .crx, найденного здесь http://developer.chrome.com/extensions/crx.html

 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