C #: tại sao ký một hội đồng?


146

Trong một số mã C # tôi đã tiếp quản (trong Visual Studio 2005), tôi đã nhận thấy rằng các hội đồng đều được ký với cùng một .snktệp.

  • Tại sao tác giả trước đó đã ký các hội đồng theo cách này?
  • Việc ký kết các hội đồng có cần thiết không và có gì sai khi không ký?
  • Có những bất lợi gì trong việc ký kết các hội đồng - nó có gây ra sự chậm trễ không?

Câu trả lời:


186

Tại sao tác giả trước đó đã ký các hội đồng theo cách này?

Không biết, có lẽ anh ta muốn tất cả các hội đồng của mình được ký với cùng một khóa.

Việc ký kết các hội đồng là cần thiết và điều gì sẽ là sai khi không ký nó?

Không, nó không cần thiết nhưng nó là một cơ chế cho phép bạn đảm bảo tính xác thực của lắp ráp. Nó cho phép bạn đảm bảo rằng một hội đồng đã không bị giả mạo và thực sự nó bắt nguồn từ tác giả này. Nó cũng là cần thiết nếu bạn muốn đưa chúng vào GAC.

Có những bất lợi gì trong việc ký kết các hội đồng - nó có gây ra sự chậm trễ không?

Các hội đồng đã ký chỉ có thể tải các hội đồng đã ký khác. Ngoài ra, chúng được gắn với một phiên bản cụ thể có nghĩa là bạn cần sử dụng các chuyển hướng ràng buộc hoặc biên dịch lại ứng dụng nếu bạn muốn sử dụng một phiên bản khác. Có một chút chi phí hoạt động cũng là do xác minh chữ ký nhưng nó quá ít mà bạn không nên quan tâm.


2
Lưu ý rằng việc xác minh chữ ký sẽ không diễn ra nữa (kể từ .NET 2.0) khi được đặt trong GAC; nó chỉ xảy ra một lần, khi thêm nó vào GAC .
Abel

1
Bạn nghĩ gì về việc ký nó ngày nay? Trên hệ thống dựa trên web? Nếu tôi đúng, nó chỉ cần thiết khi nói về phần mềm được cài đặt, phải không? Nếu tôi xuất bản ứng dụng của mình lên Azure bằng TFS, tôi biết nó đã bị giả mạo, phải không? Hay tôi thiếu một phần bảo mật?
Rick Wolff

Ở câu hỏi đầu tiên: anh ta tạo Mẫu dự án từ một dự án có tệp khóa chữ ký lắp ráp, sau đó anh ta sử dụng Mẫu dự án đó để tạo một nội dung khác và quên thay thế tệp khóa. (chỉ cần thay "anh ấy" bằng "tôi" và bạn biết những gì tôi đã làm sáng nay :)). Vì vậy, nó là tình cờ.
hardyVele

33

Bạn cần phải ký các hội đồng nếu bạn muốn đưa chúng vào GAC .

Nếu bạn ký một tệp thực thi, thì bất kỳ thư viện lớp nào nó liên kết đến cũng cần phải được ký. Điều này có thể khó khăn nếu bạn đang sử dụng thư viện của bên thứ ba (đặc biệt nếu bạn cần sử dụng điều khiển ActiveX hoặc tương tự).

Richard Grimes đã viết một hội thảo tốt về bảo mật trong .NET và bao gồm một chương về điều này: Hội thảo bảo mật

Lý do cho tất cả các hội đồng được ký với cùng một tệp .snk có thể là nếu anh ta sử dụng thử nghiệm đơn vị với phạm vi bảo hiểm mã. Để có thể thực hiện bảo hiểm mã (ít nhất là với các công cụ được tích hợp trong phiên bản thử nghiệm của Visual Studio 2005) và nếu các hội đồng được ký, bạn cần chỉ định tệp .snk nào được sử dụng để ký, nhưng tôi nghĩ bạn chỉ có thể chỉ định một tệp .snk cho toàn bộ giải pháp, vì vậy nếu bạn ký các thư viện lớp khác nhau với các tệp .snk khác nhau, bạn chỉ có thể kiểm tra phạm vi bảo hiểm mã trên một trong số chúng tại một thời điểm.


17

Một lý do rất quan trọng để ký một hội đồng là để bạn có thể chắc chắn đó là hội đồng của bạn. Vì khóa riêng là của bạn, không ai khác có thể ký một hội đồng với cùng khóa đó. Điều này có nghĩa là khi khóa công khai của một hội đồng là một khóa bạn biết (bạn có thể truy xuất khóa này bằng cách sử dụng GetType().Assembly.GetName().GetPublicKey()chức năng), thì hội đồng là của bạn và nó không bị giả mạo.


1

Kiểm tra tất cả các tập quán của việc ký dll, dll nên được ký chỉ vì hai lý do

1. Phiên bản

2. Xác thực

a. Phiên bản biểu thị phiên bản nào dll đã được xây dựng và trong khi đẩy chúng vào GAC, hai dll có cùng tên có thể tồn tại nhưng phiên bản khác

b. Xác thực biểu thị cho dù dll không bị giả mạo và tồn tại như vậy khi nó được tạo.

Nếu bạn muốn hiểu thêm về những điều cơ bản và ký dll, bạn có thể tham khảo tại đây


1
Bạn nghĩ gì về việc ký nó ngày nay? Trên hệ thống dựa trên web? Nếu tôi đúng, nó chỉ cần thiết khi nói về phần mềm được cài đặt, phải không? Nếu tôi xuất bản ứng dụng của mình lên Azure bằng TFS, tôi biết nó đã bị giả mạo, phải không? Hay tôi thiếu một phần bảo mật?
Rick Wolff

1
Tôi không thấy lý do tại sao chúng ta nên ký một dll bây giờ một ngày, điều đó sẽ được triển khai như là giải pháp Paas ở phương vị. Nhưng nếu bạn đang có giải pháp iaas, bạn có thể sử dụng lại dll bằng ứng dụng web trong cùng một iis. Mà tôi không đề nghị. chúng ta nên gọi chúng là url api, thay vì sử dụng các dll đó từ GAC (microservice architecture).
Karthikeyan VK

1

Ngoài các câu trả lời hiện có, tôi sẽ thêm rằng bạn phải sử dụng ký khi DLL của bạn sẽ được tải và sử dụng động bởi phần mềm bên thứ 3. Đây không phải là yêu cầu kỹ thuật, nhưng nó rất hợp lý, do đó rất phổ biến, nhà sản xuất phần mềm bên thứ 3 thực thi chính sách đó do lo ngại bảo mật.

Ví dụ về nơi bạn phải ký một hội đồng:

  • phát triển phần mở rộng Windows Shell / Windows Explorer, như: phần mở rộng menu ngữ cảnh cho Windows Explorer
  • phát triển các tiện ích mở rộng Visual Studio, như: GUI GUI của Project / Item Template

0

Ký kết và lắp ráp là quan trọng. Để đảm bảo rằng exe hoặc lắp ráp được cài đặt trên PC đó.

Tức là: nếu bạn sao chép thư mục đó và đưa vào PC khác thì nó không hoạt động. vì nó chỉ ký hợp đồng với máy đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.