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

Google Chrome использует альфу числовые хеши в качестве идентификаторов для расширений Chrome. Для, например, "ajpgkpeckebdhofmmjfgcjjiiejpodla" идентификатор для расширения Синхронизации Закладки XMarks.

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

19
задан Rob W 3 December 2012 в 15:27
поделиться

3 ответа

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

Из исходного кода :

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 и т.д.

.
17
ответ дан 30 November 2019 в 01:58
поделиться

Похоже, что копия только обрабатывает отдельные файлы . Вот функция для рекурсивного копирования я нашел в этой заметке на странице копирования документации :

<?php 
function recurse_copy($src,$dst) { 
    $dir = opendir($src); 
    @mkdir($dst); 
    while(false !== ( $file = readdir($dir)) ) { 
        if (( $file != '.' ) && ( $file != '..' )) { 
            if ( is_dir($src . '/' . $file) ) { 
                recurse_copy($src . '/' . $file,$dst . '/' . $file); 
            } 
            else { 
                copy($src . '/' . $file,$dst . '/' . $file); 
            } 
        } 
    } 
    closedir($dir); 
} 
?>
-121--3473510-

Спасибо за ответы. Я чувствую, что каждый ответ был частью ответа. Вот что я искал. Символ

  1. ? является просто кратким для (something 'start) . Таким образом, (a 'start) можно переписать как a? . Таким образом, пример становится:

     b * (abb *) * a?
    

    В питоне мы бы написали:

     p = re.compile (r '^ b * (abb *) * a? $')
    
  2. Прямая трансляция синтаксиса регулярного регулярного выражения в python (т.е. копирование и вставка) не работает, потому что python соответствует самой короткой подстроке (если символы $ или ^ отсутствуют), в то время как теоретические регулярные выражения соответствуют самой длинной начальной подстроке .
    Так, например, если у нас была последовательность:

     s = 'aa'
    

    Наш учебник regex b * (abb *) * a? не будет соответствовать ему, потому что у него есть два а. Однако если скопировать его прямо в python:

     > > p = re.compile (r 'b * (abb *) * a?')
    > > bool (p.match (s))
    Правда
    

    Это происходит потому, что наш регекс соответствует только подстроке «a» нашей последовательности «aa».
    Для того, чтобы сказать Питону, чтобы сделать совпадение в целом ряде мы должны сказать ему, где начало и конец последовательности, с ^ и $ соответственно:

     > > p = re.compile (r '^ b * (abb *) * a? $')
    > > bool (p.match (s))
    Ложный
    

    Обратите внимание, что python regex match () совпадает с началом последовательностей, поэтому он автоматически принимает ^ в начале. Однако функция search () не выполняет, и поэтому мы сохраняем ^ .
    Так например:

     > > s = 'aa'
    > > p = re.compile (r 'b * (abb *) * a? $')
    > > bool (p.match (s))
    Ложь # Правильно
    > > bool (p.search (s))
    True # Неверно - поиск проигнорировал первый «» а
    
-121--4594708-

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

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

32
ответ дан 30 November 2019 в 01:58
поделиться

Я опубликовал короткий скрипт Ruby для расчета идентификатора расширения от закрытого ключа: http://supercollider.dk/2010/01/calculation-chroome-extion-id -Из-ваше-частное ключ-233 . Это в значительной степени следует описать erik Kay в формате.

8
ответ дан 30 November 2019 в 01:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: