python - que - mongodb español
¿Cómo calcular programáticamente la ID de extensión de Chrome? (2)
Una forma sencilla y simple de obtener la clave pública del archivo .crx usando python, ya que Chrome solo genera la clave .pem privada para usted. La clave pública en realidad está almacenada en el archivo .crx.
Esto se basa en el formato del archivo .crx que se encuentra aquí 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])
Aunque esto no es posible "omitir la interacción con el navegador", porque aún necesita generar el archivo .crx con un comando como
chrome.exe --pack-extension=my_extension --pack-extension-key=my_extension.pem
Estoy construyendo un proceso automatizado para producir extensiones. ¿Hay un ejemplo de código para calcular la ID de extensión directamente y omitir completamente la interacción con el navegador?
(Estoy respondiendo mi propia pregunta, a continuación).
Solo pude encontrar un artículo relacionado con un fragmento de Ruby, y solo está disponible en la IA: http://web.archive.org/web/20120606044635/http://supercollider.dk/2010/01/calculating- chrome-extension-id-from-your-private-key-233
Importante saber:
- Esto depende de una clave pública codificada DER (binario en bruto), no una clave codificada en PEM (buena ASCII generada por base64-codificación de la clave DER).
- Los ID de extensión son base-16, pero están codificados usando [ap] (llamado "mpdecimal"), en lugar de [0-9a-f].
Usando una clave pública codificada en PEM, siga los siguientes pasos:
- Si su clave pública con formato PEM todavía tiene el encabezado y pie de página y está dividida en varias líneas, vuelva a formatearla a mano para que tenga una única cadena de caracteres que excluya el encabezado y el pie de página, y se ejecute de manera que cada línea del la clave se ajusta a la siguiente.
- Base64: descodifica la clave pública para representar una clave pública con formato DER.
- Genera un resumen hexadecimal SHA256 de la clave con formato DER.
- Tome los primeros 32 bytes del hash. No necesitarás el resto.
- Para cada personaje, conviértalo a base-10 y agregue el código ASCII para ''a''.
La siguiente es una rutina de Python para hacer esto:
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()
Eres más que bienvenido para probar esto con una extensión existente y su ID. Para recuperar su clave pública con formato PEM:
- Vaya a la lista de sus extensiones existentes en Chrome. Coge la ID de extensión de uno.
- Encuentra el directorio donde está alojada la extensión. En mi cuadro de Windows 7, es: C: / Users // AppData / Local / Google / Chrome / User Data / Default / Extensions /
- Tome la clave pública del archivo manifest.json en "clave". Como la clave ya está lista para ser decodificada en base64, puede omitir el paso (1) del proceso.
La clave pública en el ejemplo es de la extensión "Chrome Reader". Su ID de extensión es "lojpenhmoajbiciapkjkiekmobleogjc".
Ver también: