Vai trò của mã thông báo khóa công khai là gì? Nó có bất kỳ phần nào trong việc giải mã hàm băm đã ký. Trong GAC, tại sao có rất nhiều tổ hợp từ Microsoft có cùng mã thông báo khóa công khai ?.
Vai trò của mã thông báo khóa công khai là gì? Nó có bất kỳ phần nào trong việc giải mã hàm băm đã ký. Trong GAC, tại sao có rất nhiều tổ hợp từ Microsoft có cùng mã thông báo khóa công khai ?.
Câu trả lời:
Vai trò của mã thông báo khóa công khai là gì?
Mã thông báo khóa công khai là một số nhỏ, là một "mã thông báo" thuận tiện đại diện cho khóa công khai. Khóa công khai khá dài; mục đích của mã thông báo khóa công khai là cho phép bạn tham chiếu đến các khóa mà không cần nói toàn bộ khóa. Sắp xếp theo cùng một cách nói "Chúa tể của những chiếc nhẫn" là năm từ đại diện cho một cuốn tiểu thuyết dài nửa triệu từ. Sẽ khá bất tiện nếu mỗi lần bạn muốn nói về nó, bạn phải nói ra nửa triệu từ đó.
Nó có phần nào trong việc giải mã hàm băm đã ký không?
Không. Mã thông báo khóa công khai không có "thông tin" trong đó. Nó chỉ là một số đại diện cho một khóa công khai. Bản thân nó không phải là một khóa công khai.
tại sao có rất nhiều tổ hợp từ Microsoft với cùng một mã thông báo khóa công khai?
Bởi vì tất cả chúng đều được ký bằng cùng một khóa riêng - khóa riêng của Microsoft - và do đó tất cả đều được xác minh bằng cùng một khóa công khai, và do đó tất cả đều có cùng một mã thông báo khóa công khai.
Assembly.FullNametài sản, để có được nó thông qua các công cụ dòng lệnh thấy câu trả lời này
Từ Wikipedia
"Mã thông báo khóa công khai được sử dụng để làm cho tên lắp ráp là duy nhất. Do đó, hai cụm được đặt tên mạnh có thể có cùng tên tệp PE nhưng .NET sẽ nhận ra chúng là các cụm khác nhau. Hệ thống tệp Windows (FAT32 và NTFS) chỉ nhận dạng Tên tệp PE, vì vậy hai tổ hợp có cùng tên tệp PE (nhưng văn hóa, phiên bản hoặc mã thông báo khóa công khai khác nhau) không thể tồn tại trong cùng một thư mục Windows. Để giải quyết vấn đề này .NET giới thiệu một thứ gọi là GAC (Global Assembly Cache). được .NET CLR coi như một thư mục duy nhất, nhưng thực sự được triển khai bằng cách sử dụng các thư mục NTFS (hoặc FAT32) lồng nhau.
Để ngăn chặn các cuộc tấn công giả mạo, trong đó một kẻ bẻ khóa sẽ cố gắng chuyển một assembly xuất hiện dưới dạng một cái gì đó khác, assembly được ký bằng khóa riêng. Nhà phát triển của assembly dự định giữ bí mật về khóa riêng tư, vì vậy kẻ bẻ khóa không thể có quyền truy cập vào nó cũng như không đơn giản đoán nó. Vì vậy, người bẻ khóa không thể làm cho tổ hợp của mình mạo danh một thứ khác, thiếu khả năng ký tên chính xác sau khi thay đổi. Việc ký hợp ngữ liên quan đến việc lấy một hàm băm của các phần quan trọng của hợp ngữ và sau đó mã hóa hàm băm bằng khóa riêng. Hàm băm đã ký được lưu trữ trong assembly cùng với khóa công khai. Khóa công khai sẽ giải mã hàm băm đã ký.Khi CLR tải một assembly được đặt tên mạnh, nó sẽ tạo ra một hàm băm từ hợp ngữ và sau đó so sánh nó với hàm băm được giải mã. Nếu so sánh thành công thì điều đó có nghĩa là khóa công khai trong tệp (và do đó là mã thông báo khóa công khai) được liên kết với khóa riêng được sử dụng để ký hợp đồng. Điều này có nghĩa là khóa công khai trong assembly là khóa công khai của nhà xuất bản assembly và do đó, cuộc tấn công giả mạo sẽ bị cản trở. "
Hàm băm là một loại "dấu tay". Nó được ký bằng khóa riêng do người ký sở hữu (và chỉ được biết). Nếu bạn biết khóa công khai của người ký, bạn có thể kiểm tra xem băm có thực sự đến từ người ký hay không và do đó nếu dữ liệu / tệp thực sự bắt nguồn từ người ký (và không thay đổi). Các khóa công khai giống nhau cho một số tệp trong GAC có nghĩa là "tất cả được ký bởi cùng một người ký".
Mã thông báo khóa công khai là một phần trích dẫn dễ đọc của khóa công khai thực. Khóa công khai hoàn chỉnh được lưu trữ bên trong một assembly đã ký và được sử dụng để giải mã chữ ký (= mã băm được mã hóa). Trình nạp sử dụng điều này để xác minh nội dung không bị giả mạo (hoặc bị hỏng). Hàm băm ban đầu được tác giả mã hóa bằng khóa riêng và chỉ ai đó sở hữu khóa đó mới có thể tạo ra chữ ký hợp lệ.
Mỗi công ty (hoặc bộ phận) chỉ nên sử dụng 1 cặp khóa, đó là lý do tại sao bạn thấy các nhóm PKT giống hệt nhau trong GAC.
Tôi muốn bổ sung vào các câu trả lời trước (đặc biệt là câu có trích dẫn từ Wikipedia) rằng việc đặt tên mạnh mẽ qua khóa công khai / riêng tư không bảo vệ bạn khỏi việc thay đổi tập hợp hoặc ngăn ai đó giả mạo tập hợp của bạn.
Trước hết , tên tuổi mạnh không đảm bảo rằng lắp ráp có thể được tin cậy. Bạn chỉ có một mã thông báo khóa công khai / khóa công khai, nhưng bạn không biết người đã ký nó (ngoại trừ nếu bằng cách nào đó họ thông báo rằng họ sở hữu khóa công khai hợp ngữ).
Ví dụ: tin tặc có thể lấy tập hợp của bạn, xóa tên mạnh khỏi nó (có những công cụ làm điều đó) và ký tên bằng tên mạnh của chính nó. Đối với sự tin tưởng, có một loại ký mã kỹ thuật số khác với chứng chỉ. Nó liên quan đến việc bên thứ ba kiểm tra bạn và công ty của bạn và không miễn phí. Kiểm tra công nghệ Authenticode:
https://msdn.microsoft.com/en-us/library/ms537359(v=vs.85).aspx
Thứ hai , Trong cuộc thảo luận sau đây đã mô tả ngắn gọn phương pháp tấn công brute force để lấy cặp khóa công khai / riêng tư với cùng một mã thông báo khóa công khai sẽ tạo ra cùng một băm cho một hội bị giả mạo:
https://groups.google.com/forum/?hl=vi#!topic/microsoft.public.dotnet.security/Jo6PqypxJN8
Tôi phải lưu ý rằng điều này có thể đã được giải quyết bằng cách đặt tên mạnh mẽ nâng cao https://docs.microsoft.com/en-us/dotnet/framework/app-domains/enhanced-strong-naming
Cũng có một lỗi được đề cập trong cuộc thảo luận cho phép bỏ qua việc xác nhận lắp ráp và tải một lắp ráp bị giả mạo trong thời gian chạy. Nghiên cứu chi tiết ở đây, lỗi đã được sửa trong các phiên bản sau của .Net framework (vì vậy lỗi xuất hiện cho .Net 1 cũ):
http://www.grimes.nildram.co.uk/workshops/fusionWSCrackThree.htm
Thứ ba , khởi động .Net 3.5 sp1 để tăng hiệu suất tải của các hội đồng không được xác thực theo mặc định cho các hội đồng tin cậy đầy đủ.
Điều kiện cho các tập hợp: https://blogs.msdn.microsoft.com/shawnfa/2008/05/14/strong-name-bypass/
Thảo luận về nó trên Stack Overflow: Các tập hợp .net đã ký có bao giờ được xác minh đầy đủ khi tải không, để kiểm tra xem chúng có bị sửa đổi không?
Theo tôi hiểu, điều này có nghĩa là lắp ráp không được băm trong quá trình tải để kiểm tra xem nó có
Cuối cùng , tôi muốn đề cập rằng có một cuộc tranh luận về ưu và nhược điểm của việc đặt tên mạnh vì chúng yêu cầu bạn chỉ định một phiên bản lắp ráp. Microsoft xóa tên mạnh khỏi một số sản phẩm của họ: https://www.pedrolamas.com/2016/03/01/still-strong-naming-your-assemblies-you-do-know-its-2016-right/
Tóm lại là, Tôi muốn tóm tắt tất cả các điểm đã đề cập. Khi tôi gặp phải việc đặt tên mạnh mẽ, tôi đã nhầm lẫn với MSDN và Wikipedia rằng nó có thể cung cấp một số biện pháp bảo vệ cho các tổ hợp. Tôi nghĩ "Tuyệt" và cái tên mạnh mẽ vẫn còn trong ký ức của tôi như một cơ chế bảo vệ. Cho đến thời điểm tôi phải suy nghĩ về sự an toàn của tệp snk của tôi với khóa riêng tư và sau đó đồng nghiệp của tôi nói với tôi rằng nó không quá "tuyệt". Vì vậy, tôi đã làm một nghiên cứu nhỏ. Điều đầu tiên tôi học được là cái tên mạnh mẽ không có nghĩa là tin tưởng, bạn nên sử dụng chứng chỉ cho nó. Tuy nhiên, tôi nghĩ rằng nếu tôi giữ khóa cá nhân của mình an toàn thì cụm bị giả mạo sẽ không được tôi ký, có nghĩa là nếu ai đó sẽ sửa đổi cụm của tôi thì anh ta cũng phải sửa đổi ký hiệu và cụm đã sửa đổi sẽ không được tải bởi CLR. Bây giờ tôi không t nghĩ rằng đặt tên mạnh mẽ đảm bảo điều đó. Vì vậy, bạn chỉ nên dựa vào nó để đảm bảo tính duy nhất của lắp ráp.
Tái bút. Xin lỗi vì bài viết dài với rất nhiều tài liệu tham khảo.