假設同一個桌面應用程式在發行頁和一個鏡像網站上都提供下載。檔案名稱相同,版本號也相同,使用者卻仍然需要回答:它們是不是同一份檔案?由誰發佈?是否來自預期的程式碼和建置過程?適不適合在自己的裝置上運行?
這些問題需要不同的證據。把所有驗證方式統稱為“安全認證”,容易讓使用者期待它們實際無法保證的事情,也會讓開發者忽略發行流程中的空白。
校驗碼回答檔案是否一致
下載後計算雜湊,並與預期值比較,可以檢查檔案內容是否一致。但這裡有一個重要前提:預期值本身來自可信渠道。如果檔案與校驗值都來自同一個未經確認的頁面,兩者一致仍不足以證明發佈者身分。
反過來,雜湊不同意味著檔案存在差異,卻不能僅憑這一點斷定惡意。不同建置、重新打包或錯誤下載都可能造成變化。正確做法是暫停把它當作已驗證版本,重新確認檔案來源、目標平台和對應的校驗記錄。
對發行方而言,清晰的檔案命名、版本資訊和校驗清單,應當一起維護。不要讓使用者從舊文章複製一串雜湊,再拿它比較另一個平台或另一次建置的安裝套件。
簽章需要驗證“預期是誰”
數位簽章把簽署者與被簽資料關聯起來,但驗證程式還需要判斷這個身分是否符合預期。Sigstore 的驗證文件要求核對簽章以及相關身分、簽發者等條件,體現的就是這種區分。Sigstore 驗證文件
因此,使用者看到“簽章有效”時,還應確認它對應哪個發佈者或工作流程;開發者則應明確允許哪些身分簽署正式發行物。任何能通過某種數學驗證的簽章,都不應自動獲得產品正式版本的地位。
發行方更換憑證或簽章方式時,也需要提供可核對的說明。讓使用者臨時信任一個來歷不明的憑證,並不是一個完整的更新流程。
建置來源把安裝套件連接到生產過程
GitHub 的 artifact attestation 可以記錄建置來源,幫助驗證產物與倉庫、工作流程等資訊的關聯。它為核對“這份檔案怎樣產生”提供了證據,但驗證時仍需檢查實際產物及預期身分。GitHub 建置證明文件
SLSA 的建置等級進一步區分來源記錄的存在、託管平台生成的簽章來源記錄,以及更嚴格的建置平台防護要求。引用等級時,應說明適用範圍與依據,不能把等級數字當作覆蓋所有軟體風險的評分。SLSA 建置等級
| 證據 | 主要幫助回答 | 單獨不能證明 |
|---|---|---|
| 校驗碼 | 是否拿到了預期的檔案內容 | 發佈者身分、程式行為安全 |
| 數位簽章 | 誰對哪些資料作了簽章 | 簽署者一定符合你的信任要求 |
| 建置來源證明 | 產物來自什麼建置過程 | 所有原始碼和依賴都沒有問題 |
| 可重現建置 | 指定條件下能否重建相同產物 | 軟體不存在漏洞或不當行為 |
這些證據可以相互補充。開發者應讓使用者知道已經提供了哪些證據,以及哪些檢查還需要獨立完成。
可重現建置需要明確輸入與環境
Reproducible Builds 項目把可重現建置定義為:給定相同原始碼、建置環境和建置說明,能夠得到逐位元組一致的指定產物。它比“在我的電腦上能編譯”提出了更明確的驗證目標。可重現建置定義
我們建議發行方保留工具鏈、依賴鎖定資訊、建置參數與產物對應關係。若尚未達到可重現,也應準確記錄目前能夠重建到哪一步,而不是省略差異後宣佈通過。
公開倉庫的範圍也要講清楚。倉庫可能包含核心原始碼,也可能主要包含建置工具、配置和上游生成的應用套件。使用者需要知道自己實際能檢查和重新建置哪些部分,才能合理評價來源證據。
使用者可以採用的下載檢查順序
- 從項目的正式入口確認發行倉庫,避免僅依賴搜尋廣告或轉發連結。
- 閱讀版本說明,確認作業系統、處理器架構和發行通道。
- 核對檔案與對應校驗值;有簽章或來源證明時,再驗證預期身分及適用範圍。
- 檢查維護狀態和已知限制,避免把“最新標籤”直接理解為適合生產使用。
- 遇到資訊不一致時,保留版本與檔案名,通過項目支持渠道核實。
這套流程不要求每位使用者都成為建置工程師。產品可以把複雜證據整理成清楚的發行頁面:檔案從哪裡來、適合誰、怎樣檢查、出現異常去哪裡詢問。
對開發者來說,長期維護這條資訊鏈比一次性貼出“已驗證”的標籤更有價值。舊版本撤回、簽章更換和更新失敗時,使用者仍應找得到對應說明。
AlphaBiz 的公開倉庫說明區分了建置工具與上游生成的應用套件。討論此類桌面應用程式時,我們也應按真實範圍解釋可檢查的內容,而不把公開倉庫、完整原始碼和可重現發行混為一談。AlphaBiz 項目說明
開發者可以從補齊一份發行證據清單開始;使用者則可以先檢查自己最常用應用的一個下載檔案。歡迎在 AlphaBiz Discussions 交流你希望發行頁提供哪些驗證資訊。