Google Chrome - alfanumérico hashes para identificar extensões
-
19-09-2019 - |
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?
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.