在上一篇文章中,我們討論了如何保護移動代碼 。
提到的措施之一是簽名代碼。 這篇文章探討了Java程序如何工作。
數字簽名
數字簽名的基礎是密碼學 ,特別是公鑰密碼學 。 我們使用一組加密密鑰:私有密鑰和公共密鑰。
私鑰用于簽名文件,并且必須保持秘密。 公鑰用于驗證使用私鑰生成的簽名。 由于鍵之間的特殊數學關系,這是可能的。
簽名和公鑰都需要轉移給接收者。
證明書
為了信任文件,需要驗證該文件上的簽名。 為此,需要一個與用于簽署文件的私鑰相對應的公鑰。 那么我們如何才能信任公鑰呢?
這是證書的來源。證書包含公用密鑰和標識該密鑰所有者的專有名稱 。
信任來自證書本身已簽名的事實。 因此,證書還包含簽名和簽名者的專有名稱。
當我們控制通信的兩端時,我們既可以提供證書又可以完成證書 。 例如,這對于您編寫的連接到您控制的服務器的移動應用程序效果很好。
如果您不能同時控制兩端,那么我們需要一個替代方案。 簽名者的專有名稱可用于查找簽名者的證書。 使用該證書中的公鑰,可以驗證原始證書中的簽名。
我們可以以這種方式繼續創建證書鏈 ,直到我們明確信任的簽名者為止。 這通常是公認的證書頒發機構 (CA),例如VeriSign或Thawte 。
密鑰庫
在Java中,私鑰和證書存儲在稱為keystore的受密碼保護的數據庫中。
每個密鑰/證書組合由一個稱為別名的字符串標識。
代碼簽名工具
Java附帶了兩個用于代碼簽名的工具: keytool和jarsigner 。
使用jarsigner
程序使用存儲在密鑰庫中的證書對jar文件進行簽名。
使用keytool
程序創建私鑰和相應的公鑰證書,從/向/從密鑰庫檢索/存儲那些證書,以及管理密鑰庫。
keytool
程序無法創建由其他人簽名的證書。 它可以創建證書簽名請求 ,但是您可以將其發送到CA。 它還可以將CA的響應導入密鑰庫。
替代方法是使用支持此類CA功能的工具如OpenSSL或BSAFE 。
代碼簽名環境
代碼簽名應該在安全的環境中進行,因為涉及私鑰,并且私鑰需要保密。 如果私鑰落入他人之手,則第三方可能會使用您的密鑰對他們的代碼簽名 ,從而誘使客戶信任該代碼。
這意味著您可能不想在構建機器上維護密鑰庫,因為該機器可能對很多人都可用。 一種更安全的方法是引入專用的簽名服務器:
您還應該使用不同的簽名證書進行開發和生產。
時間戳記
證書僅在有限的時間內有效。 使用公鑰證書已過期的私鑰簽名的任何文件都不應再受信任,因為這些文件可能已在證書過期后進行了簽名。
我們可以通過給文件加上時間戳來減輕此問題。 通過將受信任的時間戳記添加到文件,即使簽名證書過期,我們也可以信任它。
但是,我們如何信任時間戳? 好吧,當然可以通過使用時間戳管理局進行簽名! OpenSSL
程序也可以幫助您。
超越代碼簽名
簽名代碼時,僅證明該代碼來自您。 為了使客戶能夠信任您的代碼,它必須是可信任的。 您可能希望設置一個完整的安全開發生命周期 (SDL),以確保它盡可能地多。
在這方面要考慮的另一件事是第三方代碼。 大多數軟件包都嵌入了商業和/或開源庫。 理想情況下,這些庫由其作者簽名。 但是無論如何,您都需要擁有所有權,因為客戶不在乎在您自己編寫的代碼還是在所使用的庫中是否發現了漏洞。
參考: 安全軟件開發博客上的JCG合作伙伴 Remon Sinnema 簽署Java代碼 。
翻譯自: https://www.javacodegeeks.com/2012/11/signing-java-code.html