2010-10-20 29 views
120

Trong một số mã C# tôi đã thực hiện qua (trong Visual   Studio   2005), tôi đã nhận thấy rằng tất cả các hội đồng được ký với cùng một tệp .snk.C#: tại sao ký một hội đồng?

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

Trả lời

138

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

Không có ý tưởng, có thể anh ấy muốn tất cả các hội đồng của anh ấy được ký bằng cùng một khóa.

Có phải ký hợp đồng cần thiết và điều gì sẽ sai khi không ký?

Không, không cần thiết nhưng đây là cơ chế cho phép bạn đảm bảo tính xác thực của hội đồng. 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ự là nguồn gốc từ tác giả này. Nó cũng cần thiết nếu bạn muốn đưa chúng vào GAC.

Có những nhược điểm nào trong việc ký kết các hội đồng - điều này có gây ra sự chậm trễ không?

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 phải sử dụng 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 hiệu suất trên không cũng do việc xác minh chữ ký nhưng nó là quá ít mà bạn không nên quan tâm.

+3

Câu trả lời rõ ràng – Eon

+0

Lưu ý rằng việc xác minh chữ ký 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] (http://davidyardy.com/archive/strong-names-and-signing-assemblies-netaspx/). – Abel

+0

Bạn nghĩ gì về việc ký nó ngày nay? Trên các 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ài đặt, đúng 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ó không bị giả mạo, đúng không? Hay tôi thiếu một số phần bảo mật? –

31

Bạn cần ký hợp đồng nếu bạn muốn đặt chúng trong GAC.

Nếu bạn ký một tệp thực thi, thì mọi thư viện lớp mà nó liên kết tới cũng cần đượ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ề an ninh trong .NET và bao gồm một chương về vấn đề này: Security Workshop

Lý do cho tất cả các hội đồng được ký kết với các tập tin .snk cùng có thể là nếu ông sử dụng đơn vị thử nghiệm với phạm vi mã. Để có thể thực hiện bảo mật mã (ít nhất là với các công cụ được tích hợp vào 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 phải 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 đăng 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 mã trên một trong số chúng tại một thời điểm.

+0

Chuyển đến http://www.grimes.nildram.co.uk/workshops.htm – LiamV

+0

@LiamV Cảm ơn, cập nhật. –

15

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à lắp ráp của bạn. Vì khóa riêng là của bạn, không ai khác có thể ký một assembly với cùng khóa đó.Điều này có nghĩa rằng khi khóa công khai của một hội đồng là một trong những bạn biết (bạn có thể lấy này bằng cách sử dụng chức năng GetType().Assembly.GetName().GetPublicKey()), lắp ráp là của bạn và nó đã không bị giả mạo.

1

Mặc dù có của tất cả các tập quán của ký dll, dll nên ký hợp đồng với chỉ có hai lý do

1. Versioning

2. Xác thực

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

b. Xác thực cho biết dll không bị giả mạo và không tồn tại giống như khi nó được tạo ra.

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

+1

Bạn nghĩ gì về việc ký nó ngày nay? Trên các 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ài đặt, đúng 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ó không bị giả mạo, đúng không? Hay tôi thiếu một số phần bảo mật? –

+1

Tôi không thấy lý do tại sao chúng ta nên đăng ký một dll bây giờ một ngày, mà sẽ được triển khai như là giải pháp Paas trong xanh. Nhưng nếu bạn đang có giải pháp iaas, bạn có thể sử dụng lại dll của ứng dụng web trong cùng một iis. Mà tôi không khuyên bạn nên. chúng ta nên gọi họ qua url api, thay vì sử dụng các dll đó từ GAC (kiến trúc microservice). –

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