Google Chrome 使用字母数字哈希作为 Chrome 扩展的标识符。例如。“ajpgkpeckebdhofmmjfgcjjiiejpodla”是XMarks书签同步扩展的标识符。
这里使用哪种算法来生成这样的字符串?他们如何确保独特性?
Google Chrome 使用字母数字哈希作为 Chrome 扩展的标识符。例如。“ajpgkpeckebdhofmmjfgcjjiiejpodla”是XMarks书签同步扩展的标识符。
这里使用哪种算法来生成这样的字符串?他们如何确保独特性?
准确地说,它是以 16 为基数编码的 RSA 公钥的 SHA256 的前 128 位。
另一个随机的琐事是编码使用 ap 而不是 0-9a-f。原因是来源的主机字段中的前导数字字符最终可能会被 Chrome 视为潜在的 IP 地址。在提出它的人之后,我们在内部将其称为“mpdecimal”。
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 等。
这是一个 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'
我发布了一个简短的 Ruby 脚本来计算私钥的扩展 ID:http: //supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233。这几乎遵循 Erik Kay 对格式的描述。
一个不错的小 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
我制作了crx_appid gem 来轻松计算 appid。
https://rubygems.org/gems/crx_appid
$ gem install crx_appid
$ crx_appid extension.pem
更准确地说,SHA256 散列的输入是 X.509 SubjectPublicKeyInfo 块,DER 编码。这是 crx 标头中的第 5 个字段,如CRX 包格式中所述。如果您在清单中获取“key”的值并进行 base-64 解码,这也是您获得的字节序列。
这是在 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][af]) 更改为 ([ap] )a
匹配0
和p
匹配f
。
通过一些努力,我很确定这两个步骤可以变成一个单行。我希望你觉得它有帮助,如果有,请告诉我。