2008-09-25 16 views
132

Tệp .snk là gì? Tôi biết nó là viết tắt của Được đặt tên mạnh Key, nhưng tất cả các giải thích về nó là gì và nó hoạt động như thế nào trên đầu tôi.Một .snk là gì?

Có cách giải thích đơn giản nào về cách sử dụng khóa mạnh được đặt tên và cách hoạt động không?

Trả lời

194

Tệp .snk được sử dụng để áp dụng strong name to a .NET assembly. một tên mạnh mẽ như vậy bao gồm

một tên văn bản đơn giản, số phiên bản, và thông tin văn hóa (nếu cung cấp) -plus một khóa công khai và chữ ký kỹ thuật số .

SNK chứa một cặp khóa duy nhất - khóa riêng và khóa công khai có thể được sử dụng để đảm bảo rằng bạn có một tên mạnh duy nhất cho hội đồng. Khi assembly được đặt tên mạnh, một "băm" được xây dựng từ nội dung của assembly, và hash được mã hóa bằng khóa riêng. Sau đó, băm đã ký này được đặt trong assembly cùng với khóa công khai từ .snk.

Sau đó, khi ai đó cần xác minh tính toàn vẹn của hội đồng được đặt tên mạnh, họ xây dựng hàm băm của nội dung của hội đồng và sử dụng khóa công khai từ lắp ráp để giải mã băm đi kèm với lắp ráp - nếu hai băm phù hợp, việc xác minh lắp ráp sẽ được thực hiện.

Điều quan trọng là phải có thể xác minh các hội đồng theo cách này để đảm bảo rằng không ai hoán đổi một hội đồng cho một bản độc hại sẽ làm hỏng toàn bộ ứng dụng. Đây là lý do tại sao các hội đồng không được đặt tên mạnh không được tin cậy theo cùng cách mà các hội đồng được đặt tên mạnh, vì vậy chúng không thể được đặt trong GAC. Ngoài ra, có một chuỗi tin cậy - bạn không thể tạo ra một assembly có tên mạnh mẽ tham chiếu đến các assembly không được đặt tên mạnh.

Bài viết "The Secrets of Strong Naming". Có một công việc tuyệt vời để giải thích các khái niệm này chi tiết hơn không. Với hình ảnh.

+2

Điều này có nghĩa là khi bạn ký một hội đồng với một .PFX, nó thực sự chỉ sử dụng để tạo ra một .SNK trên bay bất cứ khi nào nó biên dịch? – Patrick

+5

@Patrick no, đó là [Chữ ký Authenticode] (http://technet.microsoft.com/en-us/library/cc750035.aspx), trong khi cũng chứng minh tệp không được sửa đổi giữa ký và séc, không đáp ứng các yêu cầu về tên mạnh. Vấn đề là Authenticode không yêu cầu một chuỗi niềm tin của các assembly mà việc đặt tên mạnh đòi hỏi bạn có thể Authenticode ký một assembly dựa vào các assembly không được ký tên/không mạnh. –

+1

Bạn có thể chỉ cần loại bỏ tiếng lách và thay thế bằng một cái khác .. tôi không biết một kịch bản thực sự ở đâu hữu ích .. về cơ bản, cặp khóa chính của chúng tôi không thể xây dựng niềm tin vào đó – Ibrahim

4

Tệp .snk là phiên bản liên tục của "Khóa" được tạo bởi tiện ích sn trong bộ tiện ích khung công tác. Sau đó, bạn sử dụng tệp này để 'ký điện tử' các hội đồng của bạn. Đây là khóa gồm 2 phần .. kết hợp khóa công khai riêng. Phần công khai của khóa được xuất bản, tức là mọi người đều biết. Phần riêng tư chỉ được biết đến với bạn, thành viên/nhà phát triển ứng dụng và được dự định để được giữ như vậy.

Khi bạn đăng ký hội đồng của mình, nó sử dụng khóa riêng và giá trị băm cho lắp ráp của bạn để tạo chữ ký điện tử được nhúng trong hội đồng của bạn. Sau đó, bất cứ ai tải lắp ráp của bạn đi qua một bước xác minh. Khóa công khai được sử dụng để xác thực nếu assembly thực sự xuất phát từ bạn .. bạn chỉ cần khóa công khai cho điều này (cũng được nhúng trong một biểu mẫu được mã hóa trong tệp kê khai assembly). Nếu lắp ráp đã bị giả mạo, giá trị băm sẽ khác nhau và tải lắp ráp sẽ bị hủy bỏ. Đây là một cơ chế bảo mật.

22

Trong thế giới.Net, SNK tệp được sử dụng để ký các tệp nhị phân đã biên dịch của bạn. Điều này cho phép một vài điều xảy ra:

  1. Bạn có thể đăng ký hội thông qua vào GAC (Global Assembly Cache).Về cơ bản để bạn có thể tham khảo nó từ nhiều nơi trên cùng một máy mà không cần phải duy trì nhiều bản sao).
  2. Bạn có thể sử dụng Binaries của bạn từ bên trong các tệp nhị phân khác cũng được ký (đây là một loại hành vi vi rút lạ đối với các hội đồng đã ký).
  3. Việc lắp ráp của bạn không thể (dễ dàng) được sửa đổi bởi Các bên thứ ba người không có quyền truy cập vào tệp SNK, cung cấp ít nhất một lượng bảo mật nhỏ.

Tôi không quen thuộc với cách BizTalk Server công trình, vì vậy tôi không nghĩ rằng tôi có thể làm sáng tỏ mục đích gì cụ thể mà họ phục vụ trong môi trường đó.

Hy vọng điều này có phần hữu ích.

7

Tệp .snk được sử dụng để ký các assembly để có thể thêm chúng vào Global Assembly Cache (GAC).

Tệp .snk chứa mã thông báo công khai và riêng tư cho khóa của bạn. Khi bạn muốn ký một số dữ liệu (hoặc nhị phân) với khóa đó, một kiểm tra được tính toán trên dữ liệu, sau đó được mã hóa bằng mã thông báo riêng. Sau đó, checksum được mã hóa sẽ được thêm vào dữ liệu. Bất kỳ ai cũng có thể sử dụng mã thông báo công cộng từ khóa của bạn để giải mã tổng kiểm tra và so sánh nó với tổng kiểm tra mà họ tính toán để xác minh rằng dữ liệu đã ký không bị giả mạo.

Bạn có thể đọc thêm về mật mã khóa công khai tại http://en.wikipedia.org/wiki/Public-key_cryptography.

3

Tệp .snk được sử dụng để đảm bảo rằng người khác không thể trượt lắp ráp của riêng mình ở vị trí của bạn. Nó cung cấp một cặp khóa mã hóa/giải mã.

Khi tệp .snk được sử dụng để ký một hội đồng, giá trị hashcode được tính từ tệp lắp ráp và được mã hóa bằng khóa riêng. Sau đó, "digest" được mã hóa sau đó được gắn vào assembly cùng với khóa công khai từ tệp .snk.

Sau đó, khi ai đó nhận được lắp ráp của bạn, họ cũng có thể tính giá trị hashcode đó. Họ sử dụng khóa công khai để giải mã khóa mà bạn đã tính toán và so sánh các giá trị được tính. Nếu lắp ráp đã được thay đổi ở tất cả, những giá trị sẽ khác nhau và người sử dụng của hội đồng sẽ biết rằng lắp ráp bạn có không phải là một trong những bạn cung cấp.

Trong ngữ cảnh BizTalk Server, bất kỳ ai xây dựng bất kỳ hội đồng tùy chỉnh nào được sử dụng bởi giải pháp BizTalk của bạn sẽ cần phải sử dụng tệp .snk để ký kết assembly sao cho máy chủ BizTalk có thể tải nó vào GAC và sử dụng nó.

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