定義
代碼簽名(英語:
Code signing)是對
執行檔或
腳本進行
數字簽名以確認軟體作者及保證軟體在簽名後未被修改或損壞的措施。此措施使用加密散列來驗證真實性和完整性。
代碼簽名可以提供幾大功能價值。最常用的需求是代碼簽名為部署提供了安全性。在某些
程式語言中,它也可用來幫助防止名字空間衝突。幾乎每個代碼簽名的實現都提供某種數字簽名機制來驗證作者或構建系統的身份,以及校驗對象是否未被修改。它也可用來提供對象相關的版本信息,以及存儲對象的其他元數據。
代碼簽名作為軟體安全性依賴的效果取決於所支持簽名密鑰的安全性。與其他
公鑰基礎設施(PKI)技術一樣,系統的完整性依賴於發布者對其私鑰免受未經授權訪問的保護。存儲在通用計算機的軟體中的密鑰易於受到影響。因此,將密鑰存儲在安全、防篡改的硬體密碼設備(也稱
硬體安全模組,HSM)是更加安全的
最佳實踐。
功能實現原理
代碼簽名的基礎是PKI安全體系。
代碼簽名證書由簽名證書
私鑰和
公鑰證書兩部分組成。
私鑰用於代碼的簽名,公鑰用於私鑰簽名的驗證和證書持有者的身份識別。
1. 發布者從CA機構(如VeriSign)申請
數字證書;
2. 發布者開發出代碼;藉助代碼簽名工具,發布者將使用MD5或SHA算法產生代碼的
哈希值,然後用
代碼簽名證書私鑰對該哈希值簽名,從而產生一個包含代碼簽名和軟體發布者的簽名證書的
軟體包;
3. 用戶的運行環境訪問到該軟體包,並檢驗軟體發布者的代碼簽名
數字證書的有效性。由於VeriSign根證書的
公鑰已經嵌入到用戶的運行環境的可信根證書庫,所以運行環境可驗證發布者代碼簽名
數字證書的真實性;
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作業系統上運行的代碼進行數字簽名。
特點
代碼簽名證書可消除 Internet Explorer 以及 Windows 作業系統中彈出的「不明發行商」。
完整的時間戳服務包括免費的在你的代碼上蓋上時間戳以保證簽名不會過期。每月簽名次數不超過50次。 可以隨時進行證書更換。
短時間之內快速反饋。
自證書審核完畢之日起,7 天內無條件退款。
一般都會有風險擔保。
完善的線上服務電話和電子郵件技術支持。
免費證書安裝狀態檢查。
安全保證
許多代碼簽名的實現提供方法來使用涉及一組密鑰的系統來簽名代碼,這類似
SSL與
SSH的流程。例如,在
.NET中,開發人員每次構建之時,都將使用一個私鑰來簽名自己的
庫或執行檔。此密鑰唯一且分屬給單個開發人員、小組,或者特定應用程式或實體。開發人員可以自己生成此密鑰,也可以從受信任的數字證書認證機構(CA)獲取一份密鑰。
代碼簽名在分發目的下很有價值,因為所提供代碼的原始碼可能並不明顯,如Java applet、
ActiveX控制項或其他類似代碼。它的另一個重要用途是,為現有軟體安全地提供更新和補丁。
Windows、
Mac OS X和大多數Linux發行版為更新使用代碼簽名,從而確保其他人不可能通過補丁系統分發惡意代碼。它可以使作業系統驗證更新是否合法,即使更新是由第三方或藉助物理介質(如
光碟、
隨身碟)分發。
在Windows和Mac OS X上,首次運行軟體時將檢查代碼簽名以驗證軟體的身份,確保軟體沒有被第三方分銷商或下載網站惡意篡改。因為平台的分散性,這種代碼簽名形式沒有在Linux上使用,軟體包管理系統是所有軟體形式(不僅僅更新和補丁)的主要發行模式,並且允許直接檢查原始碼的
開放原始碼模型(如果需要)。
使用證書頒發機構
用於代碼簽名的
公鑰應該可以追溯到受信任的根機構CA,使用安全的
公鑰基礎設施(PKI)是最佳做法。這雖不能保證代碼本身的可信,但可以確保它來自所聲明的來源(更明確來說,來自特定
私鑰)。一個CA提供者可以提供根級別的信任,並能以代理方式將信任分配給其他人。如果用戶信任一個CA,那么用戶也相信該CA及其代理生成的密鑰所簽名的代碼合法性。許多作業系統和框架都內置對一個或多個現有CA的信任(例如
VeriSign/
Symantec、DigiCert、TC TrustCenter、
Comodo、
GoDaddy及
GlobalSign等)。對大型組織來說,實現與公共CA功能相同但僅在組織內信任的私有CA也是常見的選擇。
CA的替代品
類似目的的另一種方式是——開發人員可以使用自己生成的密鑰。在此種情況下,用戶首次通常必須直接從開發人員那裡獲取公鑰,以便驗證對象的來源。許多代碼簽名系統將存儲簽名中的公鑰。部分軟體框架和作業系統將在執行前檢查代碼的簽名,並允許用戶選擇是否信任該開發者。應用程式開發者可以在安裝程式中包含公鑰以提供類似的系統。然後可以使用密鑰來確保需要運行的任何後續對象(例如升級、外掛程式或其他應用程式)都是來自同一開發人員。
時間戳
時間戳旨在解決證書過期後開始出現的信任警告。在實際套用中,時間戳將使代碼的信任期延長到證書有效期之後。
如果由於鑒權泄露或失效而必須撤銷證書,則撤銷事件的具體時間將納入撤銷記錄。在這種情況下,時間戳有助於確認代碼是在證書信任受損之前還是之後簽署。
問題
同任何安全措施一樣,代碼簽名也可以被擊破。用戶可能被誘騙而運行無簽名乃至拒絕被驗證的代碼,並且系統只能儘可能保持私鑰的安全性。
同樣重要的是,代碼簽名不會保護最終用戶免受軟體作者的惡意行為或無意破壞,而只是確認軟體未被作者以外的人修改。
未簽名代碼
在諸如遊戲主機等消費者設備語境中,未簽名代碼通常指一個未被通常必須有加密密鑰的應用程式接受和執行的軟體。大多數主機遊戲必須使用主機製造商設計的私鑰簽名,否則遊戲不會在主機上載入。使未簽名代碼被執行通常有幾種方法,包括
軟體漏洞、使用modchip、運用交換技巧技術,或者運行一個softmod。
對於有簽名的應用程式複製到另一張DVD上就不能啟動的原因,通常不那么顯而易見。在
Xbox上,原因是Xbox執行檔(XBE)包含一個媒體類型標誌,它指定了XBE可引導形式的媒體類型。對幾乎所有Xbox軟體來說,此設定使得執行檔只能從工廠生產的光碟啟動,將執行檔複製到可燒錄媒體上將終止軟體的可執行性。
但是,因為執行檔本已簽名,因此僅更改標記值不可行,那將使執行檔的簽名失效,從而在最初的驗證階段就檢查失敗。
展望
伴隨著
物聯網(IoT)增長的互聯設備正成為代碼簽名的新需求。隨著越來越多的
感測器和設備被接入緊密的網路生態系統,證書頒發機制已被擴展到人員識別以外的機器識別。與代碼簽名一樣,該技術使用數字證明確保了代碼的物理真實性和完整性,及在產品生命周期內隨時進行代碼的驗證與升級。這正為代碼簽名創造新的緯度:提高安全意識,以及需要在專用的保護環境中保存私有簽名密鑰,為整個系統創建信任的根源。鑒於
惡意軟體和高級持久威脅(APT)的流行,許多軟體供應商、線上服務提供商、企業IT組織和高科技IoT設備的製造商都面臨著增加其高科技製造和代碼簽名過程
安全性的壓力。