Подтвердить что ты не робот

Google Chrome - буквенно-цифровые хеши для идентификации расширений

Google Chrome использует альфа-числовые хеши как идентификаторы расширений Chrome. Напр. "ajpgkpeckebdhofmmjfgcjjiiejpodla" является идентификатором XMarks Расширение закладки закладки.

Какой алгоритм используется здесь для создания таких строк? Как они обеспечивают уникальность?

4b9b3361

Ответ 1

Chromium генерирует идентификатор через открытый ключ. Если вы используете галерею расширений, они обрабатывают все это для вас.

Из источника :

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

Взгляните на файл extension.cc, он имеет более подробную информацию, такую ​​как генерация exncoding/decoding файла .pem и т.д.

Ответ 2

Чтобы быть точным, это первые 128 бит SHA256 открытого ключа RSA, закодированного в базе 16.

Другой случайный бит мелочей состоит в том, что в кодировке используется a-p вместо 0-9a-f. Причина в том, что ведущие числовые символы в поле хоста происхождения могут быть обработаны как потенциальные IP-адреса Chrome. Мы называем его внутренне как "mpdecimal" после того парня, который придумал его.

Ответ 3

Здесь linux один вкладыш:

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

красиво отформатирован для удобства чтения

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

Ответ 5

Хороший маленький bash script для "idiot proof", чтобы узнать ваш идентификатор расширения. Спасибо A-Tuin за команду 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

Ответ 7

Чтобы быть более точным, вход в хэш SHA256 представляет собой блок X.509 SubjectPublicKeyInfo, закодированный DER. Это пятое поле в заголовке crx, как описано в CRX Package Format. Это также байтовая последовательность, которую вы получаете, если вы принимаете значение "ключ" в манифесте, а base-64 декодирует его.

Ответ 8

Вот простой способ в bash (и openssl) получить блок X.509 SubjectPublicKeyInfo, DER-encoded:

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

Где $pem - файл закрытого ключа, закодированный RSA.

Чтобы получить дайджест SHA256, вам нужно запустить следующее в файле, полученном в предыдущей строке:

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

Все, что осталось, - взять полученную 32 char строку и изменить ее из обычного hex ([0-9] [af]) на ([ap]), где a соответствует 0 и p соответствует f.

С небольшими усилиями я уверен, что эти два шага могут быть сделаны в однострочный. Надеюсь, вы сочтете это полезным, и если да, сообщите мне.