C #: mengapa menandatangani sebuah majelis?

146

Dalam beberapa kode C # saya telah mengambil alih (dalam Visual Studio 2005), saya perhatikan bahwa semua majelis ditandatangani dengan .snkfile yang sama .

  • Mengapa penulis sebelumnya telah menandatangani majelis dengan cara ini?
  • Apakah menandatangani majelis diperlukan dan apa yang salah dengan tidak menandatangani?
  • Kerugian apa yang ada di majelis penandatanganan - apakah itu menyebabkan penundaan?
Craig Johnston
sumber

Jawaban:

186

Mengapa penulis sebelumnya telah menandatangani majelis dengan cara ini?

Tidak tahu, mungkin dia ingin semua majelisnya ditandatangani dengan kunci yang sama.

Apakah menandatangani majelis diperlukan dan apa yang salah dengan tidak menandatanganinya?

Tidak, itu tidak perlu tetapi ini adalah mekanisme yang memungkinkan Anda untuk memastikan keaslian suatu majelis. Ini memungkinkan Anda untuk memastikan bahwa majelis belum dirusak dan memang asalnya dari penulis ini. Ini juga perlu jika Anda ingin memasukkannya ke GAC.

Kerugian apa yang ada di majelis penandatanganan - apakah itu menyebabkan penundaan?

Majelis yang ditandatangani hanya dapat memuat majelis yang ditandatangani lainnya. Juga mereka terikat ke versi tertentu yang berarti bahwa Anda perlu menggunakan pengalihan yang mengikat atau mengkompilasi ulang aplikasi jika Anda ingin menggunakan versi yang berbeda. Ada sedikit overhead kinerja juga karena verifikasi tanda tangan tetapi sangat sedikit sehingga Anda tidak perlu khawatir.

Darin Dimitrov
sumber
2
Perhatikan bahwa verifikasi tanda tangan tidak lagi terjadi (sejak .NET 2.0) ketika ditempatkan di GAC; itu hanya terjadi sekali, saat menambahkannya ke GAC .
Abel
1
Apa pendapat Anda tentang menandatanganinya saat ini? Di sistem berbasis web? Jika saya benar, itu hanya perlu ketika berbicara tentang perangkat lunak yang diinstal, kan? Jika saya menerbitkan aplikasi saya ke Azure menggunakan TFS, saya tahu itu belum dirusak, kan? Atau saya kehilangan bagian keamanan?
Rick Wolff
Pada pertanyaan pertama: dia membuat Template Proyek dari sebuah proyek yang memiliki file kunci tanda tangan perakitan, kemudian dia menggunakan Template Proyek itu untuk membuat hal-hal lain dan lupa untuk mengganti file kunci. (ganti saja "dia" dengan "saya" dan Anda tahu apa yang saya lakukan pagi ini :)). Jadi, itu tidak disengaja.
hardyVeles
33

Anda harus menandatangani majelis jika ingin menempatkannya di GAC .

Jika Anda menandatangani file yang dapat dieksekusi, maka semua perpustakaan kelas yang ditautkannya juga perlu ditandatangani. Ini bisa sulit jika Anda menggunakan perpustakaan pihak ketiga (terutama jika Anda perlu menggunakan kontrol ActiveX atau yang serupa).

Richard Grimes telah menulis lokakarya yang baik tentang keamanan di .NET dan itu termasuk bab tentang ini: Lokakarya Keamanan

Alasan untuk semua majelis yang ditandatangani dengan file .snk yang sama bisa jika ia menggunakan pengujian unit dengan cakupan kode. Untuk dapat melakukan cakupan kode (setidaknya dengan alat yang dibangun ke dalam versi pengujian Visual Studio 2005) dan jika rakitan ditandatangani, Anda perlu menentukan file .snk apa yang digunakan untuk penandatanganan, tapi saya pikir Anda hanya bisa tentukan satu file .snk untuk seluruh solusi, jadi jika Anda menandatangani berbagai pustaka kelas dengan file .snk yang berbeda, Anda hanya dapat memeriksa cakupan kode pada salah satu dari mereka sekaligus.

Hans Olsson
sumber
17

Alasan yang sangat penting untuk menandatangani majelis adalah agar Anda dapat memastikan bahwa itu adalah majelis Anda. Karena kunci pribadi adalah milik Anda, tidak ada orang lain yang dapat menandatangani majelis dengan kunci yang sama. Ini berarti bahwa ketika kunci publik rakitan adalah yang Anda tahu (Anda dapat mengambil ini menggunakan GetType().Assembly.GetName().GetPublicKey()fungsi), rakitan itu milik Anda dan belum dirusak.

Pieter van Ginkel
sumber
1

Terlepas dari semua penggunaan tanda tangan dll, dll harus ditandatangani hanya karena dua alasan

1. Versi

2. Otentikasi

Sebuah. Versi menunjukkan versi apa dll telah dibangun dan sambil mendorong mereka ke GAC dua dll dengan nama yang sama dapat ada tetapi versi yang berbeda

b. Otentikasi menunjukkan apakah dll tidak dirusak dan memang ada sama ketika dibuat.

Jika Anda ingin lebih memahami tentang dasar-dasar dan penandatanganan dll, Anda dapat merujuk di sini

Karthikeyan VK
sumber
1
Apa pendapat Anda tentang menandatanganinya saat ini? Di sistem berbasis web? Jika saya benar, itu hanya perlu ketika berbicara tentang perangkat lunak yang diinstal, kan? Jika saya menerbitkan aplikasi saya ke Azure menggunakan TFS, saya tahu itu belum dirusak, kan? Atau saya kehilangan bagian keamanan?
Rick Wolff
1
Saya tidak melihat alasan mengapa kami harus menandatangani dll sekarang hari, yang akan digunakan sebagai solusi Paas dalam warna biru. Tetapi jika Anda memiliki solusi besarbesaran, Anda dapat menggunakan kembali dll oleh aplikasi web di iis yang sama. Yang saya tidak rekomendasikan. kita harus memanggil mereka melalui api url, daripada menggunakan dll itu dari GAC (microservice architecture).
Karthikeyan VK
1

Selain jawaban yang ada, saya akan menambahkan bahwa Anda harus menggunakan penandatanganan ketika DLL Anda akan dimuat secara dinamis dan dikonsumsi oleh perangkat lunak pihak ke-3. Ini bukan persyaratan teknis tetapi itu rasional, karena itu sangat umum, bahwa produsen perangkat lunak pihak ke-3 menegakkan kebijakan tersebut karena masalah keamanan.

Contoh di mana Anda harus menandatangani majelis:

  • pengembangan ekstensi Windows Shell / Windows Explorer, seperti: ekstensi menu konteks untuk Windows Explorer
  • pengembangan ekstensi Visual Studio, seperti: Project / Item Template Wizard GUI
hardyVeles
sumber
0

Penandatanganan dan perakitan penting. Untuk memastikan bahwa exe atau rakitan yang diinstal pada PC itu saja.

Yaitu: jika Anda menyalin folder itu dan dimasukkan ke PC lain itu tidak berfungsi. karena itu menandatangani perakitan itu ke mesin itu saja.

Ram Kumar
sumber