【发布时间】:2009-12-10 18:20:55
【问题描述】:
Google Chrome 使用字母数字哈希作为 Chrome 扩展程序的标识符。例如。 “ajpgkpeckebdhofmmjfgcjjiiejpodla”是XMarks书签同步扩展的标识符。
这里使用哪种算法来生成这样的字符串?他们如何确保独特性?
【问题讨论】:
Google Chrome 使用字母数字哈希作为 Chrome 扩展程序的标识符。例如。 “ajpgkpeckebdhofmmjfgcjjiiejpodla”是XMarks书签同步扩展的标识符。
这里使用哪种算法来生成这样的字符串?他们如何确保独特性?
【问题讨论】:
准确地说,它是以 16 进制编码的 RSA 公钥的 SHA256 的前 128 位。
另一个随机的琐事是编码使用 a-p 而不是 0-9a-f。原因是来源的主机字段中的前导数字字符最终可能会被 Chrome 视为潜在的 IP 地址。在提出它的人之后,我们在内部将其称为“mpdecimal”。
【讨论】:
chrome.i18n.getMessage("@@extension_id")
chrome.runtime.id 现在是访问扩展 ID 的首选方式。
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等。
【讨论】:
这是一个 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 < FILE.PEM | sha256sum | head -c32 | tr 0-9a-f a-p 小心换行,当将 openssl 的输出存储在变量中时,使用echo -n "$var" 而不是普通的echo 以避免添加换行。
我发布了一个简短的 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 哈希的输入是 DER 编码的 X.509 SubjectPublicKeyInfo 块。这是 crx 标头中的第 5 个字段,如 CRX Package Format 中所述。如果您在清单中获取“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][a-f]) 更改为 ([a-p]),其中 a 匹配 @987654325 @ 和 p 匹配 f。
只要稍加努力,我很确定这两个步骤可以变成一条线。希望对您有所帮助,如果有帮助,请告诉我。
【讨论】: