2014-10-09 37 views
4

我正在尋找一種數字簽名共享庫的方式,以便我可以驗證所述庫的真實性。我建議的解決方案是散列庫並將其存儲在加載並調用庫的Java文件中,但問題是如果庫將來更新(除非所有使用該庫的應用程序也被更新),這會失敗。在Android上數字簽署共享庫

我在想,也許可以將使用私鑰簽名的庫的散列插入到例如.so文件的末尾,以便可以信任此簽名哈希,而不會需要存儲在調用應用程序中進行驗證。在Android API中有沒有這方面的支持,並以這種方式將數據插入到庫中可能會導致庫加載器出現問題?

+0

在對象中嵌入簽名效果不佳,因爲它會更改對象,從而在驗證期間計算散列值。通常它會一起分發,添加到容器中,或以驗證者知道忽略的方式附加。您想要構建到應用程序中的是驗證簽名所需的公鑰。但要注意 - 根據你分發庫的方式 - 可能會有一個攻擊媒介將一個未經認可的庫加載到系統上,這也可能是一種可以修補你的驗證邏輯的攻擊媒介。 – 2014-10-09 17:22:00

回答

1

如果您的庫未安裝在/system/lib中,它通常由一個應用程序使用 - 即將庫裝入其APK的應用程序,典型的更新過程將涉及C++庫和Java應用程序。因此,您的驗證不需要更新。

另一方面,標準認證技術也適用於庫簽名。例如。添加一個新的API「GetVersion(int salt)」,它將返回共享密鑰(可能是同一個文件的哈希),用隨機輸入「salted」。現在,你可以更難地對你的簽名進行逆向工程,因爲沒有中間人分析不能給他們提供線索。

這比在庫文件的固定偏移處查找簽名更容易實現,而且更難解決問題。

無論如何,在共享對象末尾添加一個任意的blob不會導致加載器出現問題。您可以在Android.mk文件中添加修改.so文件的自定義步驟。您必須在install步驟中或之後執行該步驟,該步驟從庫中剝離調試信息。

+0

@ChrisStratton:如果我沒有說清楚,我很抱歉。我提到了/ system/lib,因爲作者詢問了在應用程序之間共享庫,所以他可能會尋找使用可信系統庫構建和升級定製ROM的方法。 – 2014-10-09 18:26:00

+0

@MilindDeore請澄清你的問題。最有可能的是,你想在SO上打開一個新的問題,而不是用不必要的評論來拋棄這個問題 – 2017-04-23 12:16:17