Có gì sai khi KHÔNG ký hợp ngữ .NET không?


94

Một trong những đồng nghiệp của tôi rất quan tâm đến việc ký hợp đồng. Anh ta thực sự cố gắng ký bất cứ thứ gì. Ngay cả khi chúng tôi sử dụng các bản lắp ráp từ Microsoft không có chữ ký, anh ấy sẽ lấy mã nguồn, ký nó và sau đó yêu cầu các nhà phát triển khác sử dụng bản sao của anh ấy thay thế.

Tôi có thể hiểu ý tưởng cơ bản đằng sau việc ký một hội đồng: để đảm bảo một hội đồng cụ thể không bị xâm phạm bởi một số hacker ranh mãnh. Vì vậy, nếu chúng tôi là một công ty phát triển phần mềm, chúng tôi nên ký hợp đồng trước khi phát hành một số thư viện .NET cho khách hàng của chúng tôi.

Tuy nhiên, chúng tôi chủ yếu phát triển các ứng dụng web cho mục đích sử dụng của chính chúng tôi ở đây và tôi chỉ không thể thấy điểm ký kết từng cụm mà chúng tôi sử dụng.

Am i thiếu cái gì ở đây?


1
Cần lưu ý một số nhầm lẫn ở đây, "chữ ký điện tử" (có mục đích bảo mật) và "Các tập hợp được đặt tên mạnh" là một bản sửa lỗi cho dll hell và hỗ trợ GAC liên kết với các thư viện. Việc sử dụng cái này hay cái khác là tương tự nhau và cả hai đều có thể được nói đến khi ký một hội đồng. Có vẻ như một số áp phích đang nghĩ về cái này và những người khác đang nghĩ về cái khác hoặc cả hai.
amalgamate

Câu trả lời:


49

Đối với tôi, các tổ hợp ký tên được sử dụng trong một môi trường đáng tin cậy có vẻ là quá mức cần thiết.

Một điểm thú vị trên các tập hợp có dấu là chúng tải chậm hơn một chút so với các tập hợp không có dấu, vì chúng phải được xác minh bằng mật mã.

Để ký hợp đồng, bất kỳ hội đồng nào mà nó phụ thuộc cũng phải được ký. Tôi đoán rằng điều này góp phần khiến đồng nghiệp của bạn muốn ký mọi thứ - trình biên dịch đang yêu cầu điều đó.


CHỈNH SỬA Vì khi viết câu trả lời này, bạn có thể thấy cả phe ủng hộ và chống lại đều có sự hỗ trợ gần như tương đương. Rõ ràng là không có câu trả lời đúng ở đây.

Tuy nhiên, điểm thúc đẩy bản chỉnh sửa này là ngày nay chúng ta lấy quá nhiều thư viện mã nguồn mở từ NuGet, và nhiều thư viện trong số đó không có chữ ký. Nếu bạn muốn ký hợp đồng của mình, bạn cũng cần phải ký bất kỳ phụ thuộc nào. Nhiều thư viện mã nguồn mở được ký có các khóa riêng được sử dụng để ký có sẵn công khai trong kho lưu trữ nguồn của chúng.

Như với mọi thứ đều có sự đánh đổi. Theo kinh nghiệm của tôi khi làm việc trong môi trường riêng tư, lợi ích của việc ký chủ yếu là lý thuyết (hoặc học thuật, như @ user289100 đã đề cập), trừ khi bạn lo lắng về việc các cơ quan chính phủ sửa đổi mã của bạn trong trường hợp đó bạn cần phải hoang tưởng về rất nhiều cấp độ cơ sở hạ tầng của bạn mà việc ký kết có vẻ như là một nỗ lực nhỏ. Nếu không, số lượng thử thách xảy ra ngoài việc phải ký mọi thứ dường như không đáng. Tuy nhiên, môi trường của bạn có thể có những yêu cầu khác nhau, hoặc bạn có thể là một kẻ tự bạo!

Xem thêm câu trả lời của Teun D để biết thông tin về những thách thức liên quan đến việc tạo phiên bản cho các cụm khi sử dụng các tên mạnh.


17
Đồng ý, nó giống như một vết nứt nghiện với anh bây giờ
Janie

3
Một điểm cần lưu ý nữa là nếu bạn muốn chia sẻ assembly này trên các ứng dụng khác nhau thì việc ký là bắt buộc (tức là GAC).
rajesh tabletai

60

Tôi đã tận dụng các tập hợp không có chữ ký để giải quyết các vấn đề trước đây và trong môi trường học thuật cho mọi người thấy tại sao nó lại quan trọng. Tôi đã thay thế tệp DLL chưa được ký (một lần nữa trong cài đặt học thuật) bằng tệp tôi đã tạo có cùng tên, cùng chữ ký và sử dụng .NET Reflector để sao chép và dán mã gốc, nhưng trong trường hợp của tôi, tôi đã gửi qua email tên người dùng và mật khẩu đã được chuyển vào trước khi gọi mã 'thực'.

Nếu đã ký, bạn có thể khớp chữ ký, nhưng không thể thay thế. Trái ngược với những gì Zippy nói, sẽ có một lỗi khen ngợi thời gian chạy.

Ký hợp đồng không bao giờ là quá mức cần thiết. Mất 30 giây. Nó giống như nói rằng khóa cửa của bạn là quá mức cần thiết nếu bạn sống trong nước. Nếu bạn muốn đánh bạc với đồ đạc của mình, hãy tiếp tục, hãy để nó mở. Chỉ cần một lần vi phạm an ninh để bị sa thải. Chỉ mất 30 giây để ký hợp đồng và không có trường hợp kinh doanh nào là không. Các tác động đến hiệu suất là không thể bỏ qua.


11
Nếu một hacker có thể thay đổi dll, anh ta cũng có thể thay đổi ứng dụng gọi dll.
ZippyV

12
Đó là chính xác của Zippy, nhưng nếu không có chìa khóa để ký ứng dụng thì họ sẽ gặp khó khăn để ứng dụng chạy trong môi trường mà chỉ phiên bản đã ký của ứng dụng gốc mới được phép chạy, đó sẽ là một số trường hợp môi trường tôi đã làm việc. Việc bạn bỏ lỡ rừng cho cây: Không ký vào một hội đồng là bạn đang gặp phải rủi ro bảo mật không cần thiết, mất 30 giây để tránh và không có trường hợp kinh doanh hoặc trường hợp thực tế nào mà tôi từng thấy. ký hợp đồng.
user289100

39

Một điểm bổ sung: việc ký hợp đồng của bạn phá vỡ khả năng tương thích ngược so với các phiên bản. Tất cả các tham chiếu của bạn đều bắt đầu bao gồm số phiên bản và các phiên bản có số phiên bản khác được coi là không tương thích. Điều này cản trở việc nâng cấp lên các phiên bản mới hơn của các cụm phân phối.

Theo ý kiến ​​của tôi, bạn chỉ nên ký mã lệnh nếu bạn thấy một số lợi ích cụ thể từ nó:

  • nếu bạn triển khai đến các môi trường nơi những người không đáng tin cậy có thể chạm vào các tổ hợp của bạn
  • trong một số mô hình trình cắm nhất định, nơi bạn muốn sử dụng chứng chỉ làm bằng chứng để nâng cấp độ tin cậy
  • nếu mã của bạn có thể gọi được từ mã đã ký khác (một dự án như log4net, ký hiệu chính đáng để mã của họ có thể sử dụng rộng rãi; chúng đã gây rối rất lớn về khả năng tương thích bằng cách mất khóa bí mật của họ vài năm trước, một nguy cơ khác của việc ký mã) .
  • nếu bạn muốn triển khai GAC

9

Đồng nghiệp của bạn đã cho bạn bất kỳ dấu hiệu nào về việc tại sao anh ấy thích ký hợp đồng chưa? Một ưu điểm của việc ký kết chưa được thảo luận ở đây là chỉ có thể đưa các tập hợp đã ký vào GAC (tức là được chia sẻ trên các quy trình được quản lý), nhưng nhược điểm của nó dường như lớn hơn những mặt trái theo quan điểm của tôi (thừa nhận là thiếu kinh nghiệm).

Giai thoại của bạn về mã Microsoft tự ký có vẻ đặc biệt đáng ngờ đối với tôi. Nếu MS không ký mã, có lẽ là có lý do, phải không? Và bằng cách ký tên vào nó, bạn đang chịu trách nhiệm về nó khi bạn không viết nó - một cơ hội khác cho tương lai cắn bạn.


2
thực sự tôi không chắc chắn lý do tại sao nhưng Microsoft chắc chắn đã không ký doanh nghiệp Thư viện 3.1
oscarkuo

1
Tại sao việc chia sẻ tập hợp giữa các quy trình lại yêu cầu tập hợp đó phải nằm trong GAC?
Dirk Vollmar 28-07-09

4
Không phải là bạn không thể chia sẻ các tham chiếu thời gian chạy đến cùng một tệp .dll, đó là chỉ những tổ hợp có tên mạnh (tức là những tổ hợp có chữ ký) mới có thể vào GAC - và các tập hợp được đưa vào GAC để chúng có thể được chia sẻ.
Dan Davies Brackett

4

Một điều khác về việc ký hợp đồng là, người ta không thể đưa một bản lắp ráp không chính xác vào vị trí của bạn (cũng như - bạn vô tình). Ví dụ: nếu bạn tạo một chương trình tham chiếu đến một hợp ngữ Foo.dll, phiên bản 1.0, ai đó có thể tạo một hợp ngữ, với cùng một phiên bản và thay thế của bạn, khi bạn ký vào thư viện của mình, điều đó sẽ không thể thực hiện được (tại ít nhất tôi không nghĩ rằng nó có thể dễ dàng).


4

Chữ ký chỉ cần thiết nếu các tập hợp được đặt trong GAC, không có gì khác. Các tập hợp đã ký không ngăn cản ai đó gây rối với chúng. Một tin tặc vẫn có thể tước bỏ chữ ký và bất kỳ mã nào khác để kiểm tra chữ ký.


2
Đối với một ứng dụng web, tin tặc cũng sẽ phải sửa đổi web.config.
Tangurena 29-07-09

3
Nếu một tin tặc có thể xóa chữ ký khỏi một hội đồng, thì web.config cũng sẽ không ngăn chúng.
ZippyV

4
Những người phản đối nên đọc ianpicknell.blogspot.com/2010/02/… và các bài báo tương tự được liên kết từ đó.
Constantin

1
Hiện tại: có và không. Tôi đã thử và mặc định của Windows là KHÔNG kiểm tra chữ ký ("tên mạnh"). Có thể là Thân thiện với Người dùng :-) Các liên kết được tham chiếu hiển thị những gì cần thêm vào App.config để thực thi kiểm tra chữ ký. Và sau đó, trái ngược với bài báo, kiểm tra chữ ký thực sự hoạt động và phát hiện bất kỳ sự giả mạo nào, cho dù với phiên bản nr hay nội dung.
Roland

3

Tôi đồng ý rằng nó có vẻ như là một chút lãng phí. Nó thực sự cần thiết để đảm bảo tệp đúng như bạn nghĩ (và không bị giả mạo). Nhưng nếu bạn tin tưởng vào giới hạn của bảo mật mạng và máy chủ web của riêng mình, thì việc ký các tập hợp web của bạn có vẻ như là một bước thừa.

Nhưng có lẽ đó là kinh nghiệm nói chuyện kinh doanh nhỏ của tôi. Nếu bạn đang nói về một trang web ngân hàng trực tuyến quan trọng về sứ mệnh, thì hãy đăng ký.


2

Hãy suy nghĩ về việc làm điều đó nếu bạn định vận chuyển một thứ gì đó và / hoặc thực sự có lý do để làm điều đó. Trong mọi trường hợp khác, nó chỉ là rắc rối. Tôi muốn hỏi đồng nghiệp của bạn rằng anh ta thực sự nhận được gì khi làm việc này

Tôi đã từng gặp phải tình trạng ký hợp đồng có chữ ký trước đây và đó là một nỗi đau ở hậu trường, đặc biệt là khi bạn xem xét số lượng người có rất ít hoặc không có kiến ​​thức về ký hợp đồng, nó dùng để làm gì và làm như thế nào. Đó chỉ là một điều khác mà bạn không nên quan tâm trừ khi thực sự cần thiết.


1

Bạn cần ký hợp đồng của mình khi nó được sử dụng trong ClickOnce XBAP triển khai từ web .

Ngoài ra, tất cả các tập hợp được tham chiếu cũng cần phải được ký.


1

Chúng tôi ký hợp đồng của mình bởi vì đôi khi chúng tôi gặp lỗi như sau (lỗi này là do thử nghiệm, nhưng có thể xảy ra khi chạy ứng dụng):

System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

TearDown : System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Chúng tôi nhận thấy rằng Visual Studio đôi khi gặp lỗichạy mã cũ .

Nếu bạn muốn gặp lỗi nếu bạn đang chạy mã cũ, thì hãy ký các hợp ngữ của bạn.

Nếu bạn đang viết một gói nuget , vui lòng ký vào các tập hợp của bạn . Các hợp ngữ chưa được ký là điều khó xử đối với chúng tôi, những người muốn đảm bảo rằng chúng tôi đang chạy phiên bản mã mới nhất của mình. Tôi không thể sửa chữa Visual Studio . Tất cả những gì tôi có thể làm là phát hiện ra rằng Visual Studio đã sai. Vì vậy, xin vui lòng, ký vào các tập hợp nuget của bạn .


Cập nhật: Dòng chảy của việc sử dụng các tập hợp không được ký đang thắng;) Chúng tôi đang giải quyết vấn đề ở trên theo cách khác: xây dựng & thử nghiệm trên máy chủ CI bắt đầu từ một thư mục trống hoặc "sạch". Có thể chúng ta có kịch bản cục bộ trên máy phát triển của mình, nhưng hiếm khi nó xảy ra hoặc không có nhiều tác động thực tế.
Clay Lenhart
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.