Pergunta

O Google Chrome está usando alfa hashes numéricos como identificadores para as extensões do Chrome. Para, por exemplo. "Ajpgkpeckebdhofmmjfgcjjiiejpodla" é o identificador para XMarks extensão Bookmark Sync.

Qual algoritmo está em uso aqui para gerar tais cordas? Como eles estão garantindo singularidade?

Foi útil?

Solução

O cromo gera o ID via chave pública. Se você usar a galeria de extensões, eles lidar com tudo isso para você.

A partir da fonte :

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;
}

Dê uma olhada em arquivo extension.cc tem informações mais detalhadas, como gerar o arquivo .pem exncoding / decodificação, etc.

Outras dicas

Para ser mais preciso, é os primeiros 128 bits do SHA256 de uma chave pública RSA codificada em base 16.

Outro pouco aleatória de trivia é que a codificação usa a-p, em vez de 0-9a-f. A razão é que os principais caracteres numéricos no campo de host de origem pode acabar sendo tratados como potenciais endereços IP por Chrome. Referimo-nos a isso internamente como "mpdecimal", após o cara que veio com ele.

Aqui está um forro linux um:

cat FILE.PEM | openssl rsa -pubout -outform DER | openssl dgst -sha256 | awk '{print $2}' | cut -c 1-32 | tr '0-9a-f' 'a-p'

bem formatado para facilitar a leitura

cat FILE.PEM | \
openssl rsa -pubout -outform DER | \
openssl dgst -sha256 | \
awk '{print $2}' | \
cut -c 1-32 | \
tr '0-9a-f' 'a-p'

Eu publiquei um script Ruby curto para calcular o ID de extensão a partir da chave privada: http://supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233 . Este segue bastante descrição de Erik Kay do formato.

Um script pequena festa agradável para um caminho "à prova de idiotas" para descobrir o seu extensões id. Graças à A-Tuin para o comando 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

crx_appid gem para calcular AppId facilmente.

https://rubygems.org/gems/crx_appid

$ gem install crx_appid
$ crx_appid extension.pem

Para ser ainda mais preciso, a entrada para o hash SHA256 é o bloco X.509 SubjectPublicKeyInfo, DER-codificado. Este é o campo 5ª no cabeçalho crx conforme descrito no CRX Package Format . É também a sequência de bytes que você começa se você tomar o valor da "chave" no manifesto e base-64 decodificá-lo.

Aqui é o caminho mais fácil em bash (e openssl) para obter o bloco X.509 SubjectPublicKeyInfo, DER-codificado:

openssl rsa -pubout -outform DER < "$pem" > "$pub" 2>/dev/null

Onde $pem é o arquivo de chave privada, RSA codificada.

Para obter o SHA256 Digest que você precisa para executar o seguinte no arquivo resultante da linha anterior:

openssl dgst -sha256 $pub | awk '{print $2}' | cut -c 0-32

Tudo o que resta é tomar a string de 32 de char resultante e alterá-lo de hex normal ( [0-9] [af]) para ([ap] ), onde a Jogos Jogos 0 e p f.

Com um pouco de esforço, eu tenho certeza que essas duas etapas poderia ser feita em um one-liner. Eu espero que você achar útil e se assim for, por favor me avise.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top