Google Chrome - буквенно-цифровые хеши для идентификации расширений
Google Chrome использует альфа-числовые хеши как идентификаторы расширений Chrome. Напр. "ajpgkpeckebdhofmmjfgcjjiiejpodla" является идентификатором XMarks Расширение закладки закладки.
Какой алгоритм используется здесь для создания таких строк? Как они обеспечивают уникальность?
Ответы
Ответ 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'
Ответ 4
Я отправил короткий Ruby script для вычисления идентификатора расширения из закрытого ключа: http://supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233. Это в значительной степени соответствует описанию формата Эрика Кей.
Ответ 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
Ответ 6
Я сделал crx_appid gem, чтобы легко вычислить приложение.
https://rubygems.org/gems/crx_appid
$ gem install crx_appid
$ crx_appid extension.pem
Ответ 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
.
С небольшими усилиями я уверен, что эти два шага могут быть сделаны в однострочный. Надеюсь, вы сочтете это полезным, и если да, сообщите мне.