複製鏈接
請複製以下鏈接發送給好友

代碼簽名

鎖定
代碼簽名(英語:Code signing)是對可執行文件腳本進行數字簽名以確認軟件作者及保證軟件在簽名後未被修改或損壞的措施。此措施使用加密散列來驗證真實性和完整性。
中文名
代碼簽名
外文名
Code Signing
軟件技術
軟件加密技術
技術用途
保護開發者權益防止植入代碼病毒
學    科
密碼學
領    域
密碼學

代碼簽名定義

代碼簽名(英語:Code signing)是對可執行文件腳本進行數字簽名以確認軟件作者及保證軟件在簽名後未被修改或損壞的措施。此措施使用加密散列來驗證真實性和完整性。 [1] 
代碼簽名可以提供幾大功能價值。最常用的需求是代碼簽名為部署提供了安全性。在某些編程語言中,它也可用來幫助防止名字空間衝突。幾乎每個代碼簽名的實現都提供某種數字簽名機制來驗證作者或構建系統的身份,以及校驗對象是否未被修改。它也可用來提供對象相關的版本信息,以及存儲對象的其他元數據。
代碼簽名作為軟件安全性依賴的效果取決於所支持簽名密鑰的安全性。與其他公鑰基礎設施(PKI)技術一樣,系統的完整性依賴於發佈者對其私鑰免受未經授權訪問的保護。存儲在通用計算機的軟件中的密鑰易於受到影響。因此,將密鑰存儲在安全、防篡改的硬件密碼設備(也稱硬件安全模塊,HSM)是更加安全的最佳實踐

代碼簽名功能實現原理

代碼簽名的基礎是PKI安全體系。代碼簽名證書由簽名證書私鑰公鑰證書兩部分組成。私鑰用於代碼的簽名,公鑰用於私鑰簽名的驗證和證書持有者的身份識別。 [1] 
1. 發佈者從CA機構(如VeriSign)申請數字證書
2. 發佈者開發出代碼;藉助代碼簽名工具,發佈者將使用MD5或SHA算法產生代碼的哈希值,然後用代碼簽名證書私鑰對該哈希值簽名,從而產生一個包含代碼簽名和軟件發佈者的簽名證書的軟件包
3. 用户的運行環境訪問到該軟件包,並檢驗軟件發佈者的代碼簽名數字證書的有效性。由於VeriSign根證書的公鑰已經嵌入到用户的運行環境的可信根證書庫,所以運行環境可驗證發佈者代碼簽名數字證書的真實性;
4. 用户的運行環境使用代碼簽名數字證書中含有的公鑰解密被簽名的哈希值
5. 用户的運行環境使用同樣的算法新產生一個原代碼的哈希值
6. 用户的運行環境比較兩個哈希值。如果相同,將發出通知聲明代碼已驗證通過。所以用户可以相信該代碼確實由證書擁有者發佈,並且未經篡改。
整個過程對用户完全透明,用户將可以看到軟件發佈者提示信息,並可以選擇是否信任該軟件發佈者。在選擇信任軟件發佈者之後,運行所有該軟件發佈者簽名的程序時將可以不再收到任何提示信息。

代碼簽名種類

不同數字認證公司提供的代碼簽名分類不同,以下分類按照代碼簽名證書產品類型劃分。
VeriSign 作為國際頂級的認證機構(CA),支持以下所有產品並且兼容性最好。其中微軟徽標認證證書、微軟移動代碼簽名證書、Brew代碼簽名證書是 VeriSign 專有的產品。其他代碼簽名證書產品則可以有更多的選擇餘地。
(1) 代碼簽名數字 ID(Code Signing Digital IDs): 主要包括:微軟代碼簽名證書 (Microsoft Authenticode Digital ID) :數字簽名 .exe, .dll, .cab, .msi, .ocx, .sys, .cat, .vbs;火狐控件(FireFox Extension)簽名證書:數字簽名 .xpi; Java 代碼簽名證書 (Sun Java Signing Digital ID) :數字簽名 Sun J2SE/J2EE 的 Java Applet 文件,以及數字簽名 J2ME MIDlet Suite 文件,支持業界最多型號和最多品牌的手機。 Office宏代碼簽名證書 (Microsoft® Office and VBA):數字簽名 Office VBA 及宏代碼;Adobe AIR代碼簽名證書 (Adobe® AIR);數字簽名 .AIR 桌面應用程序;Shockwave代碼簽名證書 (Macromedia Shockwave®);數字簽名使用Macromedia® Director® 8 Shockwave Studio創建的應用程序。
(2) 微軟產品徽標認證證書 ("Designed for Windows logo" Digital IDs) :用於數字簽名微軟 Windows Logo 認證的各種軟件、硬件驅動程序等,提交已經簽名的軟件給微軟測試認證,還包括微軟 Windows Hardware Quality Labs (WHQL) testing programs(Windows 硬件質量實驗室測試計劃 ) 認證。用户在向微軟提交註冊申請前,必須首先獲取一張微軟代碼簽名證書 (Microsoft Authenticode Digital ID)。在獲取微軟代碼簽名證書後,對微軟Windows Logo 認證的各種軟件、硬件驅動程序等進行數字簽名,而後將已簽名的軟件給微軟測試認證。從 Windows Vista開始,微軟在x64位的系統上強制推行數字簽名,沒有經過WHDL和RDS認證並數字簽名的硬件驅動程序將無法在Vista x64版本上成功安裝。在後續的Vista版本上,微軟會逐步加強對數字簽名的要求,最終要求所有的應用程序必須經過簽名才能在Windows系統上運行。對於開發過程中的項目,微軟允許進行TestSign模式的簽名。用户可以使用工具64Signer實現TestSign簽名,避免把每一個開發中產生的臨時版本的驅動文件都進行數字簽名的麻煩。
(3) 微軟移動代碼簽名證書 (Authenticated Content Signing for Microsoft Windows Mobile)(簡稱ACS,現已更名為Code Signing Account for Microsoft® Mobile2Market):支持使用微軟 Windows Mobile 的 SmartPhone 和 Pocket PC 的移動終端操作系統的移動應用軟件的非特權簽名和特權簽名,以確保移動下載的軟件代碼在移動終端 ( 如智能手機和 PDA) 的安全。
(4) Brew代碼簽名證書 (Authentic Document IDs for BREW) :用於數字簽名高通公司推出的無線二進制運行開發操作環境下的 基於CDMA網絡 "無線互聯網發射平台" 上增值業務開發運行的 Brew 代碼。支持高通公司 (Qualcomm)BREW 系統的 BREW 應用代碼的數字簽名,以確保 BREW 文件的安全應用。
(5) Symbian代碼簽名證書 (Symbian Siged) :用於數字簽名 Symbian S60 操作系統的智能手機下的 sis、sisx 格式文件。
(6) Adobe PDF代碼簽名證書 (True Credentials® for Adobe) :用於數字簽名 Adobe PDF 文檔。
Code Signing Certificate for Apple
可以讓軟件開發商使用此簽名證書在證書有效期內不限數量的對 Apple操作系統上運行的代碼進行數字簽名。

代碼簽名特點

  1. 代碼簽名證書可消除 Internet Explorer 以及 Windows 操作系統中彈出的「不明發行商」。
  2. 完整的時間戳服務包括免費的在你的代碼上蓋上時間戳以保證簽名不會過期。每月簽名次數不超過50次。 可以隨時進行證書更換。
  3. 短時間之內快速反饋。
  4. 自證書審核完畢之日起,7 天內無條件退款。
  5. 一般都會有風險擔保。
  6. 完善的在線服務電話和電子郵件技術支持。
  7. 免費證書安裝狀態檢查。

代碼簽名安全保證

許多代碼簽名的實現提供方法來使用涉及一組密鑰的系統來簽名代碼,這類似SSL與SSH的流程。例如,在.NET中,開發人員每次構建之時,都將使用一個私鑰來簽名自己的或可執行文件。此密鑰唯一且分屬給單個開發人員、小組,或者特定應用程序或實體。開發人員可以自己生成此密鑰,也可以從受信任的數字證書認證機構(CA)獲取一份密鑰。 [2] 
代碼簽名在分發目的下很有價值,因為所提供代碼的源代碼可能並不明顯,如Java applet、ActiveX控件或其他類似代碼。它的另一個重要用途是,為現有軟件安全地提供更新和補丁。Windows、Mac OS X和大多數Linux發行版為更新使用代碼簽名,從而確保其他人不可能通過補丁系統分發惡意代碼。它可以使操作系統驗證更新是否合法,即使更新是由第三方或藉助物理介質(如光盤U盤)分發。
在Windows和Mac OS X上,首次運行軟件時將檢查代碼簽名以驗證軟件的身份,確保軟件沒有被第三方分銷商或下載網站惡意篡改。因為平台的分散性,這種代碼簽名形式沒有在Linux上使用,軟件包管理系統是所有軟件形式(不僅僅更新和補丁)的主要發行模式,並且允許直接檢查源代碼的開放源代碼模型(如果需要)。

代碼簽名使用證書頒發機構

用於代碼簽名的公鑰應該可以追溯到受信任的根機構CA,使用安全的公鑰基礎設施(PKI)是最佳做法。這雖不能保證代碼本身的可信,但可以確保它來自所聲明的來源(更明確來説,來自特定私鑰)。一個CA提供者可以提供根級別的信任,並能以代理方式將信任分配給其他人。如果用户信任一個CA,那麼用户也相信該CA及其代理生成的密鑰所簽名的代碼合法性。許多操作系統和框架都內置對一個或多個現有CA的信任(例如VeriSign/SymantecDigiCert、TC TrustCenter、ComodoGoDaddyGlobalSign等)。對大型組織來説,實現與公共CA功能相同但僅在組織內信任的私有CA也是常見的選擇。

代碼簽名CA的替代品

類似目的的另一種方式是——開發人員可以使用自己生成的密鑰。在此種情況下,用户首次通常必須直接從開發人員那裏獲取公鑰,以便驗證對象的來源。許多代碼簽名系統將存儲簽名中的公鑰。部分軟件框架和操作系統將在執行前檢查代碼的簽名,並允許用户選擇是否信任該開發者。應用程序開發者可以在安裝程序中包含公鑰以提供類似的系統。然後可以使用密鑰來確保需要運行的任何後續對象(例如升級、插件或其他應用程序)都是來自同一開發人員。

代碼簽名時間戳

時間戳旨在解決證書過期後開始出現的信任警告。在實際應用中,時間戳將使代碼的信任期延長到證書有效期之後。
如果由於鑑權泄露或失效而必須撤銷證書,則撤銷事件的具體時間將納入撤銷記錄。在這種情況下,時間戳有助於確認代碼是在證書信任受損之前還是之後簽署。

代碼簽名問題

同任何安全措施一樣,代碼簽名也可以被擊破。用户可能被誘騙而運行無簽名乃至拒絕被驗證的代碼,並且系統只能儘可能保持私鑰的安全性。
同樣重要的是,代碼簽名不會保護最終用户免受軟件作者的惡意行為或無意破壞,而只是確認軟件未被作者以外的人修改。

代碼簽名未簽名代碼

在諸如遊戲主機等消費者設備語境中,未簽名代碼通常指一個未被通常必須有加密密鑰的應用程序接受和執行的軟件。大多數主機遊戲必須使用主機制造商設計的私鑰簽名,否則遊戲不會在主機上加載。使未簽名代碼被執行通常有幾種方法,包括軟件漏洞、使用modchip、運用交換技巧技術,或者運行一個softmod。
對於有簽名的應用程序複製到另一張DVD上就不能啓動的原因,通常不那麼顯而易見。在Xbox上,原因是Xbox可執行文件(XBE)包含一個媒體類型標誌,它指定了XBE可引導形式的媒體類型。對幾乎所有Xbox軟件來説,此設置使得可執行文件只能從工廠生產的光盤啓動,將可執行文件複製到可燒錄媒體上將終止軟件的可執行性。
但是,因為可執行文件本已簽名,因此僅更改標記值不可行,那將使可執行文件的簽名失效,從而在最初的驗證階段就檢查失敗。

代碼簽名展望

伴隨着物聯網(IoT)增長的互聯設備正成為代碼簽名的新需求。隨着越來越多的傳感器和設備被接入緊密的網絡生態系統,證書頒發機制已被擴展到人員識別以外的機器識別。與代碼簽名一樣,該技術使用數字證明確保了代碼的物理真實性和完整性,及在產品生命週期內隨時進行代碼的驗證與升級。這正為代碼簽名創造新的緯度:提高安全意識,以及需要在專用的保護環境中保存私有簽名密鑰,為整個系統創建信任的根源。鑑於惡意軟件和高級持久威脅(APT)的流行,許多軟件供應商、在線服務提供商、企業IT組織和高科技IoT設備的製造商都面臨着增加其高科技製造和代碼簽名過程安全性的壓力。
參考資料
  • 1.    孫青, 蔣偉, 陳波. 代碼簽名技術及應用探討[J]. 電腦編程技巧與維護, 2009 (6): 21-26.
  • 2.    凌寧. 基於 iOS 系統的安全性研究[D]. 北京: 北京郵電大學, 2014.