2009-12-10 33 views
18

Google Chrome đang sử dụng băm số alpha làm số nhận dạng cho tiện ích của Chrome. Ví dụ: "ajpgkpeckebdhofmmjfgcjjiiejpodla" là số nhận dạng cho XMarks tiện ích Đồng bộ hóa dấu trang.Google Chrome - Các băm chữ và số để xác định các tiện ích mở rộng

Thuật toán nào được sử dụng ở đây để tạo các chuỗi như vậy? Làm cách nào để đảm bảo tính duy nhất?

+14

Chắc chắn tôi có thể. Nhưng điều đó có nghĩa là các câu hỏi liên quan đến các dự án nguồn mở có được "đi và tra cứu" như là câu trả lời không? –

Trả lời

16

Chromium tạo id thông qua khóa công khai. Nếu bạn sử dụng thư viện tiện ích, họ sẽ xử lý tất cả những điều đó cho bạn.

Từ 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; 
} 

Hãy xem tập tin extension.cc nó có thông tin chi tiết hơn như tạo ra các tập tin .pem nào exncoding/giải mã vv

+1

LƯU Ý: khi tải một phần mở rộng từ tập tin, đường dẫn tập tin (không có một dòng mới) được sử dụng để tính toán băm. – Lekensteyn

28

Để được chính xác, đó là 128 bit đầu tiên của SHA256 của khóa công khai RSA được mã hóa trong cơ sở 16.

Một bit nhỏ khác của câu đố là mã hóa sử dụng ap thay vì 0-9a-f. Lý do là các ký tự số hàng đầu trong trường máy chủ của một nguồn gốc có thể được Chrome coi là địa chỉ IP tiềm năng. Chúng tôi gọi nó là "mpdecimal" trong nội bộ, sau khi anh ta đến với nó.

+2

Tốt Morris Peterman cũ! – bzlm

+0

Có phương pháp "lấy ID" cho tiện ích mở rộng không? Điều này đặc biệt hữu ích khi gỡ lỗi vì ID thay đổi mỗi lần bạn tải tiện ích mở rộng chưa được giải nén. – jonathanberi

+1

beriberikix: vâng, 'chrome.i18n.getMessage (" @@ extension_id ")' –

0

Để chính xác hơn, đầu vào cho hàm băm SHA256 là khối X.509 SubjectPublicKeyInfo, mã hóa DER. Đây là trường thứ 5 trong tiêu đề crx như được mô tả trong CRX Package Format. Nó cũng là chuỗi byte bạn nhận được nếu bạn lấy giá trị của "key" trong tệp kê khai và base-64 giải mã nó.

0

Dưới đây là cách dễ dàng trong bash (và openssl) để có được khối X.509 SubjectPublicKeyInfo, DER-mã hóa:

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

đâu $pem là file private key, RSA được mã hóa.

Để có được SHA256 Digest bạn cần phải chạy lệnh sau đây trên tập tin kết quả từ dòng trước:

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

Tất cả những gì còn lại là để có những kết quả chuỗi 32 char và thay đổi nó từ hex thường xuyên ([0-9] [af]) tới ([ap]) trong đó a khớp với 0p khớp với f.

Với một chút nỗ lực, tôi khá chắc chắn rằng hai bước này có thể được thực hiện thành một lớp lót. Tôi hy vọng bạn thấy nó hữu ích và nếu có, xin vui lòng cho tôi biết.

13

Dưới đây là một linux lót:

cat FILE.PEM | openssl rsa -pubout -outform DER | openssl dgst -sha256 | awk '{print $2}' | cut -c 1-32 | tr '0-9a-f' 'a-p' 

định dạng độc đáo để có thể đọc

cat FILE.PEM | \ 
openssl rsa -pubout -outform DER | \ 
openssl dgst -sha256 | \ 
awk '{print $2}' | \ 
cut -c 1-32 | \ 
tr '0-9a-f' 'a-p' 
+0

bạn đá! cảm ơn vì đã cung cấp giải pháp - err ngoại trừ việc nó không tạo ra khóa bên phải – qodeninja

+1

Phiên bản ngắn hơn: 'openssl rsa -pubout -outform DER Lekensteyn

+0

LƯU Ý: không sử dụng biến, (nul) byte được ăn sẽ làm hỏng băm. Xem https://github.com/Lekensteyn/apk-downloader/commit/bd41dad20928365c1410b014e86cfa5309f1bb1e bằng cách sai để thực hiện và thay thế tính toán băm chính xác. – Lekensteyn

2

A nice chút bash kịch bản cho một "bằng chứng idiot" cách để tìm hiểu phần mở rộng id của bạn. Nhờ A-Tuin cho lệnh 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 
Các vấn đề liên quan