2009-02-21 22 views
23

'Mã thông báo khóa công khai' là gì và được tính như thế nào trong các tên mạnh lắp ráp?Mã thông báo khóa công khai là gì và được tính như thế nào trong các tên mạnh lắp ráp?

+0

Xem thêm http: // stackoverf low.com/q/1321419/284795 –

+0

Khóa công khai là khóa tương ứng với khóa riêng (được sử dụng để ký các hội đồng). Hãy xem [Hội đồng được đặt tên mạnh] (https://msdn.microsoft.com/en-us/library/wd40t7ad (v = vs.110) .aspx) – Lu55

Trả lời

16

Về câu hỏi của bạn, "Cách tính", đó là hàm băm SHA1.

Từ dot net blog:

Microsoft giải quyết "công cộng quan trọng sưng lên" vấn đề bằng cách sử dụng một hash của khóa công khai mạnh mẽ tên lắp ráp của. Các băm này được gọi là mã thông báo khóa công khai và là 8 byte thấp của mã băm SHA1 của khóa công khai được đặt tên mạnh là . Băm SHA1 là băm 160 bit (20 byte) và đầu trang 12 byte của băm đơn giản là được loại bỏ trong thuật toán này.

0

Đó là các byte băm của khóa được sử dụng để ký tên hội đồng.

Vì vậy, thay vì liệt kê hàng trăm chữ số thập phân cho khóa, bạn có thứ gì đó đơn giản hơn, nhưng vẫn có ít rủi ro bị va chạm.

+0

Thực ra đó là một Hash từ khóa, chứ không phải đuôi byte. Và các khóa thực sự là hàng chục byte, không phải hàng trăm byte. –

+0

Băm cố định (cảm ơn). Khóa mặc định là 1024 hoặc 512 bites, cần 256 hoặc 128 chữ số hex, đó là (chỉ :-)) hàng trăm. – Richard

3

Mã thông báo khóa công khai được sử dụng để xác định tổ chức trong một hội đồng được đặt tên mạnh. Thông tin này được thêm vào metabase lắp ráp. Tôi cho rằng Richard đúng về cách thức kỹ thuật được lưu trữ.

Nếu bạn muốn xem metabase của một hội đồng, hãy sử dụng ILDASM. Bạn có thể đi sâu vào những gì được lưu trữ trong metabase ngoài việc nhìn thấy IL.

4

Từ ECMA-335:

khai này được sử dụng để lưu trữ 8 byte thấp của băm SHA-1 của khóa công khai của người khởi trong tài liệu tham khảo lắp ráp, chứ không phải là khóa công khai đầy đủ .
Tham chiếu lắp ráp có thể lưu toàn bộ khóa công cộng hoặc mã thông báo khóa công cộng 8 byte. Hoặc có thể được sử dụng để xác thực rằng cùng một khóa riêng được sử dụng để ký assembly tại thời điểm biên dịch cũng đã ký kết hội đồng được sử dụng tại thời gian chạy. Không cần phải có mặt, và trong khi cả hai đều có thể được lưu trữ, điều này không hữu ích.

[Lý do: Khóa công cộng hoặc mã thông báo khóa công khai được lưu trữ trong tham chiếu assembly được sử dụng để đảm bảo rằng lắp ráp được tham chiếu và lắp ráp thực tế được sử dụng trong thời gian chạy được thực hiện bởi một thực thể sở hữu của cùng khóa riêng, và do đó có thể được giả định là đã được dự định cho cùng một mục đích. Mặc dù khóa công khai đầy đủ là an toàn về mặt mã hóa, nhưng nó yêu cầu nhiều bộ nhớ hơn trong tham chiếu. Việc sử dụng mã khóa công khai làm giảm không gian cần thiết để lưu trữ tham chiếu trong khi chỉ làm giảm nhẹ quá trình xác thực. cuối Lý]

Đối với cách băm được tính (tôi giả sử điều này có thể là những gì bạn đang yêu cầu kể từ token khóa công khai không phải là "tính toán"), từ cùng một spec:

Siêu dữ liệu CLI cho phép nhà sản xuất lắp ráp tính toán băm mật mã của assembly đó (sử dụng hàm băm SHA-1 ) và sau đó mã hóa nó bằng thuật toán RSA (xem phần I) và cặp khóa công khai/riêng của nhà sản xuất lựa chọn. Kết quả của điều này (một "chữ ký số SHA-1/RSA") sau đó có thể được lưu trữ trong siêu dữ liệu (§25.3.3) cùng với phần công khai của cặp khóa theo yêu cầu của thuật toán RSA. Chỉ thị .publickey được sử dụng để chỉ định khóa công khai được sử dụng để tính chữ ký. Để tính hàm băm, chữ ký bằng 0, giá trị băm được tính và sau đó kết quả được lưu vào chữ ký.

Quy trình ký tên mạnh (SN) sử dụng thuật toán băm và mật mã chuẩn để ký tên mạnh. An Hàm băm SHA-1 trên hầu hết tệp PE được tạo. Giá trị băm đó được RSA ký với khóa riêng SN. Đối với mục đích xác minh khóa công khai được lưu trữ trong tệp PE cũng như giá trị băm đã ký.
Ngoại trừ những điều sau, tất cả các phần của Tệp PE được băm: • Mục nhập Chữ ký Authenticode: Tệp PE có thể là ký hiệu xác thực. Mã xác thực chữ ký được chứa trong mục 8-byte tại offset 128 của PE Header Data Directory (“Bảng chứng nhận” trong §25.2.3.3) và nội dung của tệp PE trong phạm vi được chỉ định bởi mục nhập thư mục này. [Ghi chú: Trong một tệp PE phù hợp, mục nhập này sẽ bằng không. end note] • Tên mạnh Blob: Mục 8-byte tại offset 32 ​​của tiêu đề CLI (“StrongNameSignature” trong §25.3.3) và nội dung của dữ liệu băm chứa trong RVA này trong PE File. Nếu mục nhập 8 byte là 0, không có chữ ký tên mạnh được liên kết. • PE Header Checksum: Mục nhập 4 byte tại offset 64 của PE Header Windows NT-Specific Fields (“File Checksum” trong §25.2.3.2). [Ghi chú: Trong một tệp PE phù hợp, mục nhập này sẽ bằng không. cuối note]

Bạn có thể tải spec ở đây miễn phí: http://www.ecma-international.org/publications/standards/Ecma-335.htm

6

Nếu bạn cần phải tạo một token khóa công khai dựa trên một khóa công khai đầy đủ, ít phương pháp tĩnh này hoạt động:

private static byte[] GetKeyTokenFromFullKey(byte[] fullKey) 
    { 
     SHA1CryptoServiceProvider csp = new SHA1CryptoServiceProvider(); 
     byte[] hash = csp.ComputeHash(fullKey); 
     byte[] token = new byte[8]; 
     for (int i = 0; i < 8; i++) 
      token[i] = hash[hash.Length - (i+1)]; 

     return token; 
    } 
10

Bạn có thể lấy PublicKeyToken từ VS Command Line bằng cách gõ:

sn –T DLLName.dll 
+1

+1, cú pháp (mới hơn?) Là 'sn -q -T DLLName.dll'. –

Các vấn đề liên quan