C #: ทำไมต้องลงนามในการชุมนุม?


146

ในรหัส C # บางตัวที่ฉันได้ครอบครอง (ใน Visual Studio 2005) ฉันสังเกตเห็นว่าชุดประกอบทั้งหมดถูกเซ็นชื่อด้วย.snkไฟล์เดียวกัน

  • เหตุใดผู้เขียนคนก่อนหน้าจึงลงนามชุดประกอบด้วยวิธีนี้
  • จำเป็นต้องใช้ชุดประกอบการเซ็นชื่อและจะเกิดอะไรขึ้นหากไม่ลงชื่อ?
  • มีข้อเสียอะไรบ้างในชุดประกอบการเซ็นชื่อ - มันทำให้เกิดความล่าช้าหรือไม่?

คำตอบ:


186

เหตุใดผู้เขียนคนก่อนหน้าจึงลงนามชุดประกอบด้วยวิธีนี้

ไม่มีความคิดบางทีเขาต้องการให้ชุดประกอบทั้งหมดของเขาถูกเซ็นด้วยรหัสเดียวกัน

จำเป็นต้องมีชุดประกอบการเซ็นชื่อและจะเกิดอะไรขึ้นถ้าไม่เซ็นชื่อ?

ไม่มันไม่จำเป็น แต่เป็นกลไกที่ช่วยให้คุณมั่นใจได้ถึงความถูกต้องของการชุมนุม จะช่วยให้คุณมั่นใจได้ว่าการชุมนุมไม่ได้ถูกดัดแปลงและเป็นต้นกำเนิดจากผู้เขียนคนนี้ นอกจากนี้ยังจำเป็นถ้าคุณต้องการใส่ลงใน GAC

มีข้อเสียอะไรบ้างในชุดประกอบการเซ็นชื่อ - มันทำให้เกิดความล่าช้าหรือไม่?

แอสเซมบลีที่เซ็นชื่อสามารถโหลดแอสเซมบลีที่เซ็นชื่อเท่านั้น นอกจากนี้ยังเชื่อมโยงกับรุ่นที่ระบุซึ่งหมายความว่าคุณต้องใช้การเปลี่ยนเส้นทางการเชื่อมโยงหรือคอมไพล์แอปพลิเคชันใหม่หากคุณต้องการใช้เวอร์ชันอื่น มีค่าใช้จ่ายเล็กน้อยเช่นกันเนื่องจากการตรวจสอบลายเซ็น แต่ก็น้อยมากที่คุณไม่ควรกังวล


2
โปรดทราบว่าการตรวจสอบลายเซ็นจะไม่เกิดขึ้นอีกต่อไป (ตั้งแต่. NET 2.0) เมื่ออยู่ใน GAC มันจะเกิดขึ้นครั้งเดียวเมื่อเพิ่มไป GAC
Abel

1
คุณคิดยังไงกับการเซ็นชื่อในทุกวันนี้? บนระบบบนเว็บ? ถ้าฉันถูกต้องมันจำเป็นเฉพาะเมื่อพูดถึงซอฟต์แวร์ที่ติดตั้งใช่ไหม? หากฉันเผยแพร่แอปของฉันไปยัง Azure โดยใช้ TFS ฉันรู้ว่ามันไม่ได้ถูกดัดแปลงใช่มั้ย หรือฉันไม่มีส่วนความปลอดภัยบ้าง
Rick Wolff

ในคำถามแรก: เขาสร้างเทมเพลตโครงการจากโครงการที่มีไฟล์รหัสลายเซ็นแอสเซมบลีจากนั้นเขาใช้เทมเพลตโครงการนั้นเพื่อสร้างสิ่งอื่นและลืมที่จะแทนที่ไฟล์คีย์ (เพียงแค่แทนที่ "เขา" ด้วย "ฉัน" และคุณรู้ว่าฉันกำลังทำอะไรเมื่อเช้านี้ :)) ดังนั้นมันจึงเป็นอุบัติเหตุ
hardyVeles

33

คุณจำเป็นต้องลงชื่อประกอบถ้าคุณต้องการที่จะนำพวกเขาในGAC

หากคุณลงนามในการปฏิบัติการแล้วคลาสไลบรารีใด ๆ ที่ลิงก์ไปยังจำเป็นต้องลงชื่อด้วย สิ่งนี้อาจเป็นเรื่องยากหากคุณใช้ห้องสมุดบุคคลที่สาม (โดยเฉพาะถ้าคุณต้องการใช้ตัวควบคุมActiveXหรือคล้ายกัน)

Richard Grimes ได้เขียนเวิร์กช็อปที่ดีเกี่ยวกับความปลอดภัยใน. NETและที่มีบทเกี่ยวกับเรื่องนี้: Security Workshop

เหตุผลสำหรับแอสเซมบลีทั้งหมดที่มีการเซ็นชื่อด้วยไฟล์. snk เดียวกันอาจเป็นได้ถ้าเขาใช้การทดสอบหน่วยที่มีรหัสครอบคลุม เพื่อให้สามารถครอบคลุมรหัส (อย่างน้อยด้วยเครื่องมือที่สร้างขึ้นในรุ่นทดสอบของ Visual Studio 2005) และหากมีการลงนามชุดประกอบคุณต้องระบุว่าจะใช้ไฟล์. snk ใดสำหรับการลงชื่อ แต่ฉันคิดว่าคุณสามารถทำได้เท่านั้น ระบุไฟล์. snk หนึ่งไฟล์สำหรับโซลูชันทั้งหมดดังนั้นหากคุณเซ็นชื่อไลบรารีคลาสต่างๆด้วยไฟล์. snk ที่แตกต่างกันคุณสามารถตรวจสอบความครอบคลุมของรหัสได้ครั้งละหนึ่งไฟล์เท่านั้น


17

เหตุผลที่สำคัญมากในการเซ็นชื่อชุดประกอบคือเพื่อให้คุณมั่นใจได้ว่าเป็นชุดประกอบของคุณ เนื่องจากคีย์ส่วนตัวเป็นของคุณจึงไม่มีใครสามารถลงทะเบียนชุดประกอบด้วยรหัสเดียวกันได้ ซึ่งหมายความว่าเมื่อคีย์สาธารณะของแอสเซมบลีเป็นสิ่งที่คุณรู้ (คุณสามารถดึงข้อมูลนี้โดยใช้GetType().Assembly.GetName().GetPublicKey()ฟังก์ชั่น) แอสเซมบลีเป็นของคุณและไม่ได้รับการแก้ไข


1

ทั้งๆที่มีประเพณีของการลงนาม dll ที่ dll ควรลงนามด้วยเหตุผลเพียงสองประการ

1. การกำหนดเวอร์ชัน

2. การรับรองความถูกต้อง

การกำหนดเวอร์ชันหมายถึงว่า DLL รุ่นใดถูกสร้างขึ้นและในขณะที่ผลักพวกเขาไปยัง GAC สอง dll ที่มีชื่อเดียวกันสามารถมีอยู่ได้ แต่รุ่นที่แตกต่างกัน

ข การรับรองความถูกต้องระบุว่า dll ไม่ได้ถูกดัดแปลงและมีอยู่เหมือนเดิมเมื่อมันถูกสร้างขึ้น

หากคุณต้องการเข้าใจเพิ่มเติมเกี่ยวกับพื้นฐานและการลงนาม dll คุณสามารถดูที่นี่


1
คุณคิดยังไงกับการเซ็นชื่อในทุกวันนี้? บนระบบบนเว็บ? ถ้าฉันถูกต้องมันจำเป็นเฉพาะเมื่อพูดถึงซอฟต์แวร์ที่ติดตั้งใช่ไหม? หากฉันเผยแพร่แอปของฉันไปยัง Azure โดยใช้ TFS ฉันรู้ว่ามันไม่ได้ถูกดัดแปลงใช่มั้ย หรือฉันไม่มีส่วนความปลอดภัยบ้าง
Rick Wolff

1
ฉันไม่เห็นเหตุผลว่าทำไมเราควรลงชื่อ dll ตอนนี้ต่อวันซึ่งจะถูกปรับใช้เป็นโซลูชัน Paas ในสีฟ้า แต่ถ้าคุณมีวิธีแก้ปัญหาคุณอาจใช้ dll ซ้ำโดยแอปพลิเคชันเว็บในระบบเดียวกัน ซึ่งฉันไม่แนะนำ เราควรจะเรียกพวกเขาผ่านทาง API แทนที่จะใช้ dll เหล่านั้นจาก GAC (สถาปัตยกรรมบริการไมโคร)
Karthikeyan VK

1

นอกจากคำตอบที่มีอยู่แล้วฉันจะเพิ่มว่าคุณต้องใช้การลงชื่อเมื่อ DLL ของคุณกำลังจะถูกโหลดและใช้งานโดยซอฟต์แวร์บุคคลที่สาม มันไม่ได้เป็นข้อกำหนดทางเทคนิคต่อ se แต่เป็นเหตุผลที่พบบ่อยมากว่าผู้ผลิตซอฟต์แวร์บุคคลที่สามบังคับใช้นโยบายดังกล่าวเนื่องจากความกังวลด้านความปลอดภัย

ตัวอย่างที่คุณต้องลงนามในการชุมนุม:

  • การพัฒนาส่วนขยาย Windows Shell / Windows Explorer เช่น: ส่วนขยายเมนูบริบทสำหรับ Windows Explorer
  • การพัฒนาส่วนขยายของ Visual Studio เช่น: โครงการ / ตัวช่วยสร้างแม่แบบรายการ GUI

0

การลงนามและการชุมนุมเป็นสิ่งสำคัญ เพื่อให้แน่ใจว่า exe หรือชุดประกอบที่ติดตั้งบนพีซีนั้นเท่านั้น

เช่น: ถ้าคุณคัดลอกโฟลเดอร์นั้นและใส่ลงในพีซีเครื่องอื่นมันไม่ทำงาน เนื่องจากเป็นการลงชื่อเข้าใช้ชุดประกอบในเครื่องนั้นเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.