Penamaan kuat yang ditingkatkan
Tanda tangan nama yang kuat adalah mekanisme identitas dalam .NET Framework untuk mengidentifikasi rakitan. Ini adalah tanda tangan digital kunci publik yang biasanya digunakan untuk memverifikasi integritas data yang diteruskan dari pencetus (penanda tangan) ke penerima (pemverifikasi). Tanda tangan ini digunakan sebagai identitas unik untuk rakitan dan memastikan bahwa referensi ke rakitan tidak ambigu. Rakitan ditandatangani sebagai bagian dari proses build dan kemudian diverifikasi saat dimuat.
Tanda tangan nama yang kuat membantu mencegah pihak jahat merusak rakitan dan kemudian menandatangani ulang perakitan dengan kunci penanda tangan asli. Namun, kunci nama yang kuat tidak berisi informasi yang dapat diandalkan tentang penerbit, juga tidak berisi hierarki sertifikat. Tanda tangan nama yang kuat tidak menjamin kepercayaan orang yang menandatangani rakitan atau mengindikasikan apakah orang itu adalah pemilik kunci yang sah; itu hanya mengindikasikan bahwa pemilik kunci menandatangani rakitan. Oleh karena itu, kami tidak menyarankan menggunakan tanda tangan nama yang kuat sebagai validator keamanan untuk mempercayai kode pihak ketiga. Kode autentikasi Microsoft adalah cara yang disarankan untuk mengautentikasi kode.
Keterbatasan nama kuat konvensional
Teknologi penamaan kuat yang digunakan dalam versi sebelum .NET Framework 4.5 memiliki kekurangan sebagai berikut:
Kunci terus-menerus diserang, dan teknik dan perangkat keras yang ditingkatkan membuatnya lebih mudah untuk membedakan kunci pribadi dari kunci publik. Untuk menjaga terhadap serangan, kunci yang lebih besar diperlukan. .NET Framework versi sebelum .NET Framework 4.5 memberikan kemampuan untuk masuk dengan kunci ukuran apa pun (ukuran default adalah 1024 bit), tetapi menandatangani rakitan dengan kunci baru memecah semua binari yang merujuk identitas rakitan yang lebih tua. Oleh karena itu, sangat sulit untuk meningkatkan ukuran kunci penandatanganan jika Anda ingin mempertahankan kompatibilitas.
Penandatanganan nama yang kuat hanya mendukung algoritma SHA-1. SHA-1 baru-baru ini ditemukan tidak memadai untuk aplikasi hashing yang aman. Oleh karena itu, algoritma yang lebih kuat (SHA-256 atau yang lebih besar) diperlukan. Ada kemungkinan bahwa SHA-1 akan kehilangan kedudukan yang sesuai dengan FIPS, yang akan menimbulkan masalah bagi mereka yang memilih untuk hanya menggunakan perangkat lunak dan algoritma yang sesuai dengan FIPS.
Keuntungan dari nama kuat yang disempurnakan
Keuntungan utama dari nama kuat yang disempurnakan adalah kompatibilitas dengan nama kuat yang sudah ada sebelumnya dan kemampuan untuk mengklaim bahwa satu identitas setara dengan yang lain:
Pengembang yang memiliki rakitan bertanda tangan yang sudah ada sebelumnya dapat memigrasikan identitas mereka ke algoritma SHA-2 sambil mempertahankan kompatibilitas dengan rakitan yang mereferensikan identitas lama.
Pengembang yang membuat rakitan baru dan tidak peduli dengan tanda tangan nama kuat yang sudah ada sebelumnya dapat menggunakan algoritma SHA-2 yang lebih aman dan menandatangani rakitan seperti yang selalu mereka lakukan.
Gunakan nama kuat yang disempurnakan
Kunci nama yang kuat terdiri dari kunci tanda tangan dan kunci identitas. Perakitan ditandatangani dengan kunci tanda tangan dan diidentifikasi oleh kunci identitas. Sebelum .NET Framework 4.5, kedua kunci ini identik. Dimulai dengan .NET Framework 4.5, kunci identitas tetap sama seperti di versi .NET Framework sebelumnya, tetapi kunci tanda tangan ditingkatkan dengan algoritma hash yang lebih kuat. Selain itu, kunci tanda tangan ditandatangani dengan kunci identitas untuk membuat tanda tangan balasan.
Atribut AssemblySignatureKeyAttribute memungkinkan metadata rakitan untuk menggunakan kunci publik yang sudah ada sebelumnya untuk identitas rakitan, yang memungkinkan referensi rakitan lama terus berfungsi. Atribut AssemblySignatureKeyAttribute menggunakan tanda tangan balasan untuk memastikan bahwa pemilik kunci tanda tangan baru juga merupakan pemilik kunci identitas lama.
Masuk dengan SHA-2, tanpa migrasi kunci
Jalankan perintah berikut dari bilah perintah untuk menandatangani rakitan tanpa memigrasikan tanda tangan nama yang kuat:
Buat kunci identitas baru (jika perlu).
sn -k IdentityKey.snk
Ekstrak kunci publik identitas, dan tentukan bahwa algoritma SHA-2 harus digunakan saat menandatangani dengan kunci ini.
sn -p IdentityKey.snk IdentityPubKey.snk sha256
Delay-sign (tanda tangan tunda) rakitan dengan file kunci publik identitas.
csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+
Tanda tangani kembali rakitan dengan pasangan kunci identitas lengkap.
sn -Ra MyAssembly.exe IdentityKey.snk
Masuk dengan SHA-2, dengan migrasi utama
Jalankan perintah berikut dari bilah perintah untuk menandatangani rakitan dengan tanda tangan nama kuat yang dimigrasikan.
Buat pasangan kunci identitas dan tanda tangan (jika perlu).
sn -k IdentityKey.snk sn -k SignatureKey.snk
Ekstrak kunci publik tanda tangan, dan tentukan bahwa algoritma SHA-2 harus digunakan saat menandatangani dengan kunci ini.
sn -p SignatureKey.snk SignaturePubKey.snk sha256
Ekstrak kunci publik identitas, yang menentukan algoritma hash yang menghasilkan tanda tangan balasan.
sn -p IdentityKey.snk IdentityPubKey.snk
Buat parameter untuk AssemblySignatureKeyAttribute atribut, dan lampirkan atribut ke assembly.
sn -a IdentityPubKey.snk IdentityKey.snk SignaturePubKey.snk
Ini menghasilkan output yang serupa dengan berikut.
Information for key migration attribute. (System.Reflection.AssemblySignatureKeyAttribute): publicKey= 002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519 d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936 e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b4 3893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a3 4d153cdd counterSignature= e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91eb e1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8 ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3 ae5fec2c682e57b7442738
Output ini kemudian dapat diubah menjadi AssemblySignatureKeyAttribute.
[assembly:System.Reflection.AssemblySignatureKeyAttribute( "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd", "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738" )]
Delay-sign (tanda tangan tunda) rakitan dengan kunci publik identitas.
csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+
Tanda tangani rakitan sepenuhnya dengan pasangan kunci tanda tangan.
sn -Ra MyAssembly.exe SignatureKey.snk