19

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

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

4

8 回答 8

32

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

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

于 2010-01-12T17:24:25.590 回答
17

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

于 2009-12-25T22:10:07.177 回答
16

这是一个 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'
于 2012-04-10T13:29:53.070 回答
8

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

于 2010-01-18T22:39:45.863 回答
2

一个不错的小 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
于 2014-10-30T09:08:54.117 回答
1

我制作了crx_appid gem 来轻松计算 appid。

https://rubygems.org/gems/crx_appid

$ gem install crx_appid
$ crx_appid extension.pem
于 2013-04-16T07:28:05.167 回答
0

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

于 2011-07-18T20:54:58.913 回答
0

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

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

$pemRSA 编码的私钥文件在哪里。

要获取 SHA256 摘要,您需要对上一行生成的文件运行以下命令:

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

剩下的就是获取生成的 32 个字符字符串并将其从常规十六进制 ( [0-9][af]) 更改为 ([ap] )a匹配0p匹配f

通过一些努力,我很确定这两个步骤可以变成一个单行。我希望你觉得它有帮助,如果有,请告诉我。

于 2011-12-28T16:21:54.757 回答