2024年7月26日 星期五

如何在Android中儲存機要敏感資訊 文/恆逸資深講師 何孟翰

文/恆逸資深講師 何孟翰

在手持式的應用程式開發如Android、iOS中,如何安全的溝通伺服器和應用程式一直是個重要的課題,特別是在一個dev/ops持續建置與交付的環境中,為了安全起見,不要將api的key或者是secret存在git的repo是一種較為建議的常規。
當然在應用程式的實作中,有各種客製的方式能夠實作,但是Google其實替android/gradle提供了一種好方式能夠系統性的解決這個問題,Google採用的方式如下:

1.在專案的目錄下準備一個不會被版本控制的檔案,如同預設的local.properties,使用key/value的形式存放

2.程式在建置時,gradle會生成BuildConfig,就可以動態的存取到機敏資訊


這樣在dev/ops時的CICD時,可以動態的修改該檔案,建置出具有存取機敏資訊的artifact,但是source code並不會外泄這些機敏資訊,如此在一般的client/server通訊的程式。特別是目前這些GenAI的環境,這些生成式的框架都在伺服器,例如要存取OpenAI的ChatGPT或者是Gemini Pro甚至是一些企業內部的檢索增強生成RAG(Retrieval-Augmented Generation)系統都可以用這樣的方式處理。

讓我們用一個簡單的Android應用程式說明這樣的情境,假設有一個apiKey是abcde12345,我們可以用如下的方式存進一個不被版控的檔案並且在gradle建置時再取出。

首先將Android Studio新增到最新版,例如本文撰稿時是2023.3.1 Patch1(JellyFish),並且新增一個Empty View Activity。


專案名稱設定成SecretProperty,語言可以是Java或Kotlin,此處我們選取Java,最低API此處設定成API 25。


按下Finish即可,稍待片刻等待Gradle建置確認Hello World能夠生成即可。


套用Google提供的Secrets Gradle Plugin
  1. 找到project level的gradle,在此檔案中加入buildScript並且指定secret-gradle-plugin下的secrets-gradle-plugin,目前的版本是2.0.1
  2. 在App level中的plugins加入secrets-gradle-plugin的id如下:
  3. 要存取secret value必須要使用到一個BuildScript的類別,為了讓gradle能夠生成,可以在android中增加buildFeatures,設定buildConfig=true來啟動BuildConfig的使用
  4. 為了檢視結果,我們可以試著將Hello World!的字樣換成apiKey,因此在主程式的src/main/re/layout/activity_main.xml中設定id,並且將字型大小調大一點,方便程式存取驗證
  5. 在MainActivity.java中存取到該TextView並且透過BuildConfig來取得機敏資訊
  6. 在專案目錄下找到local.properties檔,如果沒有就生成一份新的
  7. 加入apiKey如下
  8. 此時可以重新建置,在模擬器下看到的結果應該如下
  9. 如果發現程式無法正確的解析到BuildConfig檔,則需要先點擊File、Invalid Caches,並且要重新啟動之後,將專案清空並且重新建置,也就是點擊Build/Clean Project再選取Build Rebuild Project即可
  10. 雖然應該在系統預設的範本中已經有設定了,但是還是可以檢查一下,在專案的.gitignore檔案中如果local.properties沒有加入請把它加入


🔎學習推薦

0 意見:

張貼留言