มีอะไรผิดปกติกับการไม่เซ็นชื่อแอสเซมบลี. NET


95

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

ฉันเข้าใจแนวคิดพื้นฐานเบื้องหลังการลงนามในแอสเซมบลี: เพื่อให้แน่ใจว่าแอสเซมบลีบางตัวจะไม่ถูกแฮ็กเกอร์ที่หลบหลีก ดังนั้นหากเราเป็น บริษัท พัฒนาซอฟต์แวร์เราควรลงนามในแอสเซมบลีของเราก่อนที่จะปล่อยไลบรารี. NET ให้กับลูกค้าของเรา

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

ฉันขาดอะไรที่นี่?


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

คำตอบ:


50

การลงนามแอสเซมบลีที่ใช้ภายในสภาพแวดล้อมที่เชื่อถือได้ดูเหมือนจะเกินความจำเป็นสำหรับฉัน

จุดที่น่าสนใจเกี่ยวกับแอสเซมบลีที่มีการลงนามคือโหลดได้ช้ากว่าแอสเซมบลีที่ไม่ได้ลงชื่อเล็กน้อยเนื่องจากต้องผ่านการตรวจสอบการเข้ารหัส

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


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

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

เช่นเดียวกับทุกสิ่งที่มีการแลกเปลี่ยนที่จะทำ จากประสบการณ์ของฉันในการทำงานในสภาพแวดล้อมส่วนตัวผลประโยชน์ของการเซ็นชื่อส่วนใหญ่เป็นไปในทางทฤษฎี (หรือเชิงวิชาการตามที่@ user289100กล่าวถึง) เว้นแต่คุณจะกังวลเกี่ยวกับหน่วยงานของรัฐที่แก้ไขโค้ดของคุณซึ่งในกรณีนี้คุณจะต้องหวาดระแวงเกี่ยวกับหลายระดับ โครงสร้างพื้นฐานของคุณการลงนามดูเหมือนจะเป็นความพยายามเล็กน้อย มิฉะนั้นจำนวนของความท้าทายที่ลดหลั่นจากการต้องลงนามทุกอย่างก็ดูเหมือนจะไม่คุ้มค่า อย่างไรก็ตามสภาพแวดล้อมของคุณอาจมีข้อกำหนดที่แตกต่างกันหรือคุณอาจจะเป็นนักมาโซคิสต์!

ดูคำตอบของ Teun Dสำหรับข้อมูลเกี่ยวกับความท้าทายที่เกี่ยวข้องกับการกำหนดเวอร์ชันเมื่อใช้ชื่อที่ชัดเจน


17
ตกลงมันเหมือนการติดยาเสพติดสำหรับเขาตอนนี้
เจนี่

3
สิ่งที่ควรทราบอีกประการหนึ่งคือหากคุณต้องการแชร์แอสเซมบลีนี้กับแอปพลิเคชันอื่นคุณต้องเซ็นชื่อ (เช่น GAC)
rajesh pillai

61

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

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

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


11
หากแฮ็กเกอร์สามารถเปลี่ยน dll ได้เขายังสามารถเปลี่ยนแอปพลิเคชันที่เรียก dll ได้
ZippyV

13
นั่นคือ Zippy ที่ถูกต้อง แต่หากไม่มีรหัสในการลงนามแอปพลิเคชันพวกเขาจะมีช่วงเวลาที่ยากลำบากในการทำให้แอปพลิเคชันทำงานในสภาพแวดล้อมที่อนุญาตให้เรียกใช้เฉพาะแอปพลิเคชันดั้งเดิมที่ลงนามแล้วเท่านั้นซึ่งจะเป็นในหลายกรณี สภาพแวดล้อมที่ฉันเคยทำงานมาคุณหายไปจากป่าสำหรับต้นไม้: การไม่เซ็นชื่อในการชุมนุมกำลังเสี่ยงต่อความปลอดภัยที่ไม่จำเป็นซึ่งต้องใช้เวลา 30 วินาทีในการหลีกเลี่ยงและไม่มีกรณีทางธุรกิจหรือกรณีในโลกแห่งความจริงที่ฉันเคยเห็นมาก่อน ลงนามการชุมนุม
user289100

39

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

ในความคิดของฉันคุณควรประกอบโค้ดเซ็นเท่านั้นหากคุณเห็นผลประโยชน์ที่เป็นรูปธรรมจากมัน:

  • หากคุณปรับใช้กับสภาพแวดล้อมที่บุคคลที่ไม่น่าเชื่อถืออาจสัมผัสส่วนประกอบของคุณ
  • ในปลั๊กอินบางรุ่นซึ่งคุณต้องการใช้ใบรับรองเป็นหลักฐานในการอัพเกรดความน่าเชื่อถือ
  • หากรหัสของคุณควรเรียกได้จากรหัสที่มีการลงนามอื่น ๆ (โครงการเช่น log4net แสดงว่าลงชื่อรหัสของพวกเขาให้ใช้งานได้อย่างมีเหตุผลพวกเขาสับสนในความเข้ากันได้อย่างมากโดยการสูญเสียรหัสลับเมื่อไม่กี่ปีที่ผ่านมาซึ่งเป็นความเสี่ยงอีกประการหนึ่งของการเซ็นรหัส) .
  • หากคุณต้องการปรับใช้กับ GAC

9

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

เกร็ดเล็กเกร็ดน้อยของคุณเกี่ยวกับการลงนามรหัส Microsoft ด้วยตนเองดูเหมือนจะสงสัยสำหรับฉันเป็นพิเศษ ถ้า MS ไม่ได้ลงนามในรหัสอาจมีเหตุผลใช่ไหม? และการเซ็นชื่อแสดงว่าคุณต้องรับผิดชอบเมื่อคุณไม่ได้เขียนมันซึ่งเป็นโอกาสอีกครั้งสำหรับอนาคตที่จะกัดคุณ


2
ที่จริงฉันไม่แน่ใจว่าทำไม แต่ Microsoft ไม่ได้ลงนาม Enterprise Library 3.1 อย่างแน่นอน
oscarkuo

1
เหตุใดการแบ่งปันแอสเซมบลีระหว่างกระบวนการจึงจำเป็นต้องมีแอสเซมบลีใน GAC
Dirk Vollmar

4
ไม่ใช่ว่าคุณไม่สามารถแชร์การอ้างอิงรันไทม์กับ. dll เดียวกันได้ แต่เฉพาะแอสเซมบลีที่มีชื่อรัดกุม (เช่นชื่อที่เซ็นชื่อ) เท่านั้นที่จะเข้าสู่ GAC ได้และแอสเซมบลีจะถูกใส่ใน GAC เพื่อให้สามารถแชร์ได้
Dan Davies Brackett

4

อีกประการหนึ่งเกี่ยวกับการลงนามในการชุมนุมคือเราไม่สามารถฉีดชิ้นส่วนที่ไม่ถูกต้องแทนของคุณได้ (เช่นตัวคุณเองโดยบังเอิญ) ตัวอย่างเช่นหากคุณสร้างโปรแกรมที่อ้างถึงแอสเซมบลี Foo.dll เวอร์ชัน 1.0 ใครบางคนสามารถสร้างแอสเซมบลีด้วยเวอร์ชันเดียวกันและแทนที่ของคุณเมื่อคุณลงชื่อเข้าใช้ไลบรารีของคุณจะเป็นไปไม่ได้ (ที่ อย่างน้อยฉันก็ไม่คิดว่ามันจะเป็นไปได้ง่ายๆ)


4

ลายเซ็นมีความจำเป็นก็ต่อเมื่อมีการวางส่วนประกอบไว้ใน GAC เท่านั้นไม่มีอะไรอื่น การประกอบที่มีลายเซ็นไม่ได้ป้องกันไม่ให้ใครมายุ่ง แฮ็กเกอร์ยังคงสามารถตัดลายเซ็นและรหัสอื่น ๆ ที่ตรวจสอบลายเซ็นได้


2
สำหรับเว็บแอปพลิเคชันแฮ็กเกอร์จะต้องแก้ไข web.config ด้วย
Tangurena

3
หากแฮ็กเกอร์สามารถลบลายเซ็นออกจากแอสเซมบลี web.config ก็จะไม่หยุดพวกเขาเช่นกัน
ZippyV

4
ผู้โหวตควรอ่านianpicknell.blogspot.com/2010/02/…และบทความที่คล้ายกันที่เชื่อมโยงจากบทความนั้น
คอนสแตนติน

1
ปัจจุบัน: ใช่และไม่ใช่ ฉันลองแล้วและค่าเริ่มต้นของ Windows คือไม่ตรวจสอบลายเซ็น ("ชื่อที่คาดเดายาก") อาจจะเป็นมิตรกับผู้ใช้ :-) ลิงก์ที่อ้างอิงจะแสดงสิ่งที่ต้องเพิ่มใน App.config เพื่อบังคับใช้การตรวจสอบลายเซ็น จากนั้นตรงกันข้ามกับบทความการตรวจสอบลายเซ็นใช้งานได้จริงและตรวจพบการปลอมแปลงใด ๆ ไม่ว่าจะเป็นเวอร์ชัน nr หรือเนื้อหา
Roland

3

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

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


2

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

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


1

คุณต้องลงนามแอสเซมบลีของคุณเมื่อใช้ในClickOnce XBAP ที่ใช้งานได้จากเว็บ XBAP

นอกจากนี้แอสเซมบลีที่อ้างอิงทั้งหมดจะต้องลงนามด้วย


1

เราลงนามแอสเซมบลีของเราเนื่องจากมีหลายครั้งที่เราได้รับข้อผิดพลาดดังต่อไปนี้ (อันนี้มาจากการทดสอบ แต่อาจเกิดขึ้นได้เมื่อเรียกใช้แอปพลิเคชัน):

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)

เราพบว่าVisual Studio ทำผิดในบางครั้งและเรียกใช้โค้ดเก่าวิ่งรหัสเดิม

หากคุณต้องการข้อผิดพลาดหากคุณกำลังเรียกใช้โค้ดเก่าให้ลงชื่อแอสเซมบลีของคุณ

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


อัปเดต: กระแสของการใช้แอสเซมบลีที่ไม่ได้ลงชื่อกำลังชนะ;) เรากำลังแก้ปัญหาข้างต้นที่แตกต่างออกไป: สร้างและทดสอบบนเซิร์ฟเวอร์ CI โดยเริ่มจากไดเร็กทอรีว่างหรือ "clean" ed บางทีเราอาจมีสถานการณ์อยู่ในเครื่อง dev ของเรา แต่ก็หายากที่มันจะเกิดขึ้นหรือไม่มีผลกระทบในทางปฏิบัติมากนัก
Clay Lenhart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.