【问题标题】:Google Chrome - Alphanumeric hashes to identify extensionsGoogle Chrome - 用于识别扩展的字母数字哈希
【发布时间】:2009-12-10 18:20:55
【问题描述】:

Google Chrome 使用字母数字哈希作为 Chrome 扩展程序的标识符。例如。 “ajpgkpeckebdhofmmjfgcjjiiejpodla”是XMarks书签同步扩展的标识符。

这里使用哪种算法来生成这样的字符串?他们如何确保独特性?

【问题讨论】:

    标签: google-chrome-extension


    【解决方案1】:

    准确地说,它是以 16 进制编码的 RSA 公钥的 SHA256 的前 128 位。

    另一个随机的琐事是编码使用 a-p 而不是 0-9a-f。原因是来源的主机字段中的前导数字字符最终可能会被 Chrome 视为潜在的 IP 地址。在提出它的人之后,我们在内部将其称为“mpdecimal”。

    【讨论】:

    • 扩展有没有“get ID”的JS方法?这在调试时特别有用,因为每次加载解压缩的扩展时 ID 都会更改。
    • beriberikix:是的,chrome.i18n.getMessage("@@extension_id")
    • chrome.runtime.id 现在是访问扩展 ID 的首选方式。
    【解决方案2】:

    Chromium 通过公钥生成 id。如果您使用扩展库,他们会为您处理所有这些。

    来自source

    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文件,它有更详细的信息,例如生成.pem文件exncoding/decoding等。

    【讨论】:

    • 注意:从文件加载扩展时,该文件路径(不带尾随换行符)用于计算哈希。
    【解决方案3】:

    这是一个 linux one 班轮:

    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'
    

    【讨论】:

    • 你摇滚!感谢您提供解决方案 - 错误,但它没有生成正确的密钥
    • 短版:openssl rsa -pubout -outform DER &lt; FILE.PEM | sha256sum | head -c32 | tr 0-9a-f a-p 小心换行,当将 openssl 的输出存储在变量中时,使用echo -n "$var" 而不是普通的echo 以避免添加换行。
    • 注意:不要使用变量,(nul)字节会被吃掉,这会破坏散列。请参阅 github.com/Lekensteyn/apk-downloader/commit/… 了解错误的方法以及正确计算哈希的替代方法。
    【解决方案4】:

    我发布了一个简短的 Ruby 脚本,用于根据私钥计算扩展 ID:http://supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233。这几乎遵循 Erik Kay 对格式的描述。

    【讨论】:

      【解决方案5】:

      一个不错的小 bash 脚本,用于“白痴证明”的方式来找出您的扩展 ID。感谢 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 来轻松计算appid。

        https://rubygems.org/gems/crx_appid

        $ gem install crx_appid
        $ crx_appid extension.pem
        

        【讨论】:

          【解决方案7】:

          更准确地说,SHA256 哈希的输入是 DER 编码的 X.509 SubjectPublicKeyInfo 块。这是 crx 标头中的第 5 个字段,如 CRX Package Format 中所述。如果您在清单中获取“key”的值并对其进行base-64解码,这也是您得到的字节序列。

          【讨论】:

            【解决方案8】:

            这是在 bash(和 openssl)中获取 X.509 SubjectPublicKeyInfo 块、DER 编码的简单方法:

            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 个字符字符串并将其从常规十六进制 ([0-9][a-f]) 更改为 ([a-p]),其中 a 匹配 @987654325 @ 和 p 匹配 f

            只要稍加努力,我很确定这两个步骤可以变成一条线。希望对您有所帮助,如果有帮助,请告诉我。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-05-23
              • 2012-07-25
              • 2017-03-19
              • 2022-10-05
              • 2018-10-07
              • 2013-10-13
              • 1970-01-01
              相关资源
              最近更新 更多