C #: Neden bir meclis imzalasın


149

Devraldığım bazı C # kodlarında (Visual Studio 2005'te), derlemelerin hepsinin aynı .snkdosya ile imzalandığını fark ettim .

  • Önceki yazar neden meclisleri bu şekilde imzaladı?
  • İmza meclisleri gerekli midir ve imzalamamak yanlış olur mu?
  • Derlemeleri imzalamada ne gibi dezavantajlar var - gecikmelere neden oluyor mu?

Yanıtlar:


187

Önceki yazar neden meclisleri bu şekilde imzaladı?

Fikrim yok, belki de tüm meclislerinin aynı anahtarla imzalanmasını istedi.

İmza meclisleri gerekli midir ve imzalamamak yanlış olur mu?

Hayır, gerekli değildir ancak bir montajın orijinalliğini sağlamanıza izin veren bir mekanizmadır. Bir montajın tahrif edilmediğinden ve aslında bu yazardan kaynaklandığından emin olmanızı sağlar. Bunları GAC'ye koymak istiyorsanız da gereklidir.

Derlemeleri imzalamada ne gibi dezavantajlar var - gecikmelere neden oluyor mu?

İmzalı montajlar yalnızca diğer imzalı montajları yükleyebilir. Ayrıca, belirli bir sürüme bağlıdırlar, yani bağlama yönlendirmeleri kullanmanız veya farklı bir sürüm kullanmak istiyorsanız uygulamayı yeniden derlemeniz gerekir. İmzanın doğrulanması nedeniyle küçük bir performans yükü de var, ancak endişelenmemeniz gereken çok az şey var.


2
İmzaların doğrulanmasının artık GAC'ye yerleştirildiğinde (.NET 2.0'dan beri) gerçekleşmediğini unutmayın; GAC'ye eklerken yalnızca bir kez olur .
Abel

1
Bugünlerde imzalamaya ne dersin? Web tabanlı sistemlerde mi? Eğer haklıysam, sadece kurulu yazılımlardan bahsederken gerekliydi, değil mi? Uygulamamı TFS kullanarak Azure'da yayınlarsam, değiştirilmediğini biliyorum, değil mi? Yoksa bazı güvenlik kısımlarını mı kaçırıyorum?
Rick Wolff

İlk soru üzerine: Montaj imza anahtar dosyası olan bir projeden Proje Şablonu yaptı, sonra bu Proje Şablonunu başka bir malzeme oluşturmak için kullandı ve anahtar dosyayı değiştirmeyi unuttu. ("o" yerine "ben" yazın ve bu sabah ne yaptığımı biliyorsunuz :)). Yani tesadüfi.
hardyVeles

33

GAC'ye yerleştirmek istiyorsanız derlemeleri imzalamanız gerekir .

Bir yürütülebilir dosyayı imzalarsanız, bağlantı oluşturduğu sınıf kitaplıklarının da imzalanması gerekir. Üçüncü taraf bir kitaplık kullanıyorsanız (özellikle bir ActiveX denetimi veya benzerini kullanmanız gerekiyorsa) bu zor olabilir .

Richard Grimes, .NET'te güvenlik hakkında iyi bir atölye yazmıştır ve bununla ilgili bir bölüm içermektedir: Güvenlik Atölyesi

Tüm derlemelerin aynı .snk dosyasıyla imzalanmasının nedeni, kod kapsamı ile birim testi kullanması olabilir. Kod kapsamını yapabilmek için (en azından Visual Studio 2005'in test sürümünde yerleşik olan araçlarla) ve derlemeler imzalanmışsa, imzalama için hangi .snk dosyalarının kullanılacağını belirtmeniz gerekir, ancak bence bunu yalnızca yapabilirsiniz tüm çözüm için bir .snk dosyası belirtin, bu nedenle çeşitli sınıf kitaplıklarını farklı .snk dosyalarıyla imzalarsanız, bir seferde yalnızca birinin kod kapsamını kontrol edebilirsiniz.


17

Bir montajı imzalamanın çok önemli bir nedeni, onun sizin montajınız olduğundan emin olmanızdır. Özel anahtar sizin olduğundan, başka hiç kimse aynı anahtarla bir derleme imzalayamaz. Bu, bir derlemenin genel anahtarı bildiğiniz ( GetType().Assembly.GetName().GetPublicKey()işlevi kullanarak bunu geri alabilirsiniz ), derlemenin size ait olduğu ve üzerinde değişiklik yapılmadığı anlamına gelir.


1

Dll imzalamanın tüm kullanımlarına rağmen, dll sadece iki nedenden dolayı imzalanmalıdır.

1. Sürüm oluşturma

2. Kimlik Doğrulama

a. Sürüm oluşturma, dll'nin hangi sürümde kurulu olduğunu gösterir ve bunları GAC'ye gönderirken aynı ada sahip iki dll var olabilir ancak farklı bir sürüm olabilir.

b. Kimlik doğrulama, dll'nin değiştirilip değiştirilmediğini ve oluşturulduğunda aynı şekilde var olup olmadığını gösterir.

Temel bilgiler ve dll imzalama hakkında daha fazla bilgi edinmek istiyorsanız buraya başvurabilirsiniz .


1
Bugünlerde imzalamaya ne dersin? Web tabanlı sistemlerde mi? Eğer haklıysam, sadece kurulu yazılımlardan bahsederken gerekliydi, değil mi? Uygulamamı TFS kullanarak Azure'da yayınlarsam, değiştirilmediğini biliyorum, değil mi? Yoksa bazı güvenlik kısımlarını mı kaçırıyorum?
Rick Wolff

1
Bir gün bir dll imzalamamız için bir neden göremiyorum, bu gök mavisi Paas çözümü olarak kullanılacak. Ancak iaas çözümüne sahipseniz, dll'yi aynı iis'de web uygulaması ile yeniden kullanabilirsiniz. Ben de önermiyorum. GAC'deki (mikro hizmet mimarisi) dll'leri kullanmak yerine onları api url aracılığıyla çağırmalıyız.
Karthikeyan VK

1

Mevcut yanıtlara ek olarak , DLL dosyanızın 3. taraf yazılımlar tarafından dinamik olarak yüklenip kullanılacağı durumlarda imzalamayı kullanmanız gerektiğini ekleyeceğim . Tek başına teknik bir gereklilik değildir, ancak üçüncü taraf yazılım üreticisinin güvenlik endişeleri nedeniyle bu tür politikaları uygulaması mantıklıdır ve bu nedenle çok yaygındır.

Bir montajı imzalamanız gereken örnekler:

  • Windows Kabuğu / Windows Gezgini uzantısının geliştirilmesi, örneğin: Windows Gezgini için bağlam menüsü uzantısı
  • Visual Studio uzantılarının geliştirilmesi, örneğin: Project / Item Template Wizard GUI

1

Eski bir soruyu cevapladığım için bana izin verirseniz. Ancak buradaki yanıtların çoğu, güçlü adlandırmanın güvenlik sağladığını ima ediyor. Ancak Microsoft, güvenlik için kullanılmamasını tavsiye ediyor.

Kesin ad imzalamayla ilgili dokümanlar şu anda şunları söylüyor:

⚠ Uyarı

Güvenlik için güçlü isimlere güvenmeyin. Yalnızca benzersiz bir kimlik sağlarlar.

Çoğunlukla, beklediğiniz ikili dosyaya sahip olduğunuzdan ve tesadüfen aynı ada ve sürüme sahip (veya bağlama yönlendirmesi tarafından ayarlanan sürüm) farklı bir ikili dosyaya sahip olduğunuzdan emin olmak için yararlıdır

Microsoft, güçlü adlandırma kullanmanın nedenlerini listeler:

  • Derlemelerinizin kesin adlandırılmış derlemeler tarafından referans alınmasını sağlamak veya diğer kesin adlandırılmış derlemelerden arkadaşlarınıza derlemelerinize erişim izni vermek istiyorsunuz.
  • Bir uygulamanın aynı derlemenin farklı sürümlerine erişmesi gerekiyor. Bu, çakışma olmadan aynı uygulama etki alanında yan yana yüklemek için bir derlemenin farklı sürümlerine ihtiyacınız olduğu anlamına gelir. Örneğin, aynı basit ada sahip derlemelerde bir API'nin farklı uzantıları mevcutsa, güçlü adlandırma, derlemenin her sürümü için benzersiz bir kimlik sağlar.
  • Derlemenizi kullanan uygulamaların performansını olumsuz etkilemek istemezsiniz, bu nedenle derlemenin etki alanından bağımsız olmasını istersiniz. Bu, genel birleştirme önbelleğine etki alanı bağımsız bir derlemenin yüklenmesi gerektiğinden güçlü adlandırma gerektirir.
  • Yayıncı politikasını uygulayarak uygulamanız için servisi merkezileştirmek istiyorsunuz, bu da derlemenin genel derleme önbelleğine yüklenmesi gerektiği anlamına gelir.

Ayrıca şunları da not eder:

.NET Core için, güçlü adlandırılmış derlemeler maddi faydalar sağlamaz.

ve

Açık kaynaklı bir geliştiriciyseniz ve .NET Framework ile daha iyi uyumluluk için güçlü adlandırılmış bir derlemenin kimlik avantajlarından yararlanmak istiyorsanız, kaynak denetim sisteminize bir derlemeyle ilişkili özel anahtarı kontrol etmeyi düşünün.

Bu nedenle Microsoft, kodla birlikte güçlü adlandırma özel anahtarınızı yayınlamanın uygun olduğunu söylüyor. Yani, herkes doğru genel anahtarla güçlü adlandırılmış derlemeler oluşturabilir. Güçlü isimlendirmenin güvenli bir Özgünlük kaynağı olmadığını varsaymanın güvenli olduğunu söyleyebilirim.

Buradan daha fazla bilgi edinin: https://docs.microsoft.com/en-us/dotnet/standard/assembly/strong-named



0

İmza ve montaj önemlidir. Sadece o PC'de kurulu olan exe veya assembly'i sağlamak için.

Yani: bu klasörü kopyalayıp başka bir bilgisayara koyarsanız çalışmaz. çünkü o montajı sadece o makineye imzalıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.