KC Blog

打造更安全的Android應用程式! 學習導入Samsung Knox SDK的簡單方法

9 min read
AndroidDev#Android#Debug#Samsung#knox

Samsung Knox SDK 是一個安全解決方案

提供多種安全性控制和管理選項,讓企業輕鬆地保護其敏感數據和應用程序。 可以讓開發者在應用程式中實現以下功能:

安全容器:可用於分隔和保護企業數據和應用程式,以防止非授權的訪問。

VPN:可用於建立安全的VPN連接,以保護網絡流量和數據。

加密:可用於將數據加密,以保護其在傳輸過程中的安全性。

策略管理:可用於管理設備設置和策略,例如密碼規則、設備鎖定、數據清除等。

身份驗證:可用於實現強大的身份驗證功能,包括生物識別驗證和智能卡驗證。

安全更新:可用於安全地更新應用程式和操作系統,以提高整體安全性。

這篇文章主要會解說

Samsung knox sdk 導入時的一些基本觀念

以及遇到的坑跟你們分享

前導

  • 目前支持與對應的samsung 手機與版本:參考

    • 不支援knox的時候,官方提供的建議與方法:參考
    • 各knox服務參考
  • 下載、安裝Knox SDK

    • 根據官網Install the SDK 將相關SDK導入專案
    • 導入時會遇到要用哪一版可參考mapping表
    • 需取得license key
      • 若開發的是 Knox 2.7前的版本,生成的license key 可以「選擇」向後兼容的key
      • license key 分為 Development Key、與 Commercial Key 可根據測試發布 配置
      • 關聯apk:只有關聯的apk才能使用生成的license key (在後台有個optional的選項,可以打勾關聯或不選)
      • 實測後,Development Key 同一帳號下只能有一把 -> license key規則與限制
    • 開發時激活license key 不同Knox版本有不同方式 : 參考這
    • Knox開發相關範例官方有提供:參考
    • Knox license

      • license可用權限列表
      • license三種比較好讀版
      • 後台實測後看到SDK license key 更細分為:
        • KPE Development : 測試環境用, key 存活時間0.5年
        • KPE Standard: 允許存取 Standard permissions, 10,000,000 seats, key 存活時間2年
        • KPE Premium: 允許存取 Standard, Premium, and Custom permissions, 10,000,000 seats ,key 存活時間2年
        • KPE DualDAR: 允許存取 Standard, Premium, Custom and DualDAR permissions, 與代理商洽談按年數或永久訂閱
      • 開發權限聲明:
        • Knox 3.0 提供宣告部分權限,可在AndroidManifest.xml宣告Knox權限,如果未宣告,則預設全部Knox權限開啟,如果宣告,則只允許使用宣告的權限,參考
    • 目前與原生AirDroid Biz用的 DevicePolicyManager初步對比 (僅先比對相似API,可討論想用哪些,再測試實際行為)

      • 所有權限可看這
      • 實際比對常用DevicePolicyManager與 Knox提供的功能參考
    • 連結參考

Knox架構開發者文件

  • Samsung Knox提供 web-base 與 device-base兩種方式來做使用,其目前的架構:
    <img src="https://docs.samsungknox.com/dev/common/images/knox-ecosystem.png" style="width: 60%"/ class="prose-img">

Activite license note

  • android 6.0.1 samsung s6 ,測試Knox 3.8

    • 下載samsung開發者後台的Knox 3.8版 ,使用方法knox3.7.1 higher,解析URI時,報exception

    • 改用knox2.7 lower報出java.lang.RuntimeException: Stub!

      -> 解決方法:加入supportlib.jar並加入gradle dependencies

      用IDE的Add as library功能的需注意以下: 這裡需將原本knox sdk與supportlib 兩個jar檔案改成以下,runtime才不會再報錯

    • 上述成功後激活license key時,需啟動admin權限,不然會回傳internal error

    • 這裡有個坑 啟動license時需使用Boardcast接收返回結果

      • 但目前官方文件顯示 knox 啟用license 的廣播action 是使用

      但是舊版 Knox API level 19 (Knox 2.6) 上實測Knox不會發上面Action,而是如下

      • 這邊看到官方說 2.x升級3.x時nameSpace有改 (Knox api 30這版開始改了)

      • 所以他這邊提供一個方法:參考

        • 就是加入supportlib.jar 並把上方連結內的相關receiver加入Manifest.xml
  • android 12 samsung A52s ,測試Knox 3.8

    • 使用knox3.7.1 higherknox2.7 lower 方法皆可以啟用license key
  • 其他行為

    • 開發者後台目前能下載的有 Knox SDK 3.3 ~ 3.8 ,

      上述test case都使用Knox3.8 能過編譯,

      但可能部分行為僅支持其對應的版本,

      後來有在Android 12上測試 Knox 3.3,

      這時用knox3.7.1 higheractive就會崩潰,

      在Android 6.0.1 Knox 3.8 使用knox3.7.1 higheractive同樣會崩潰

開發遇到的事及研究

  • Vpn 開發

    • 根據開發文件 有提供兩種Vpn方案

      1. 跟之前研究的原生Android Vpn Service類似 Knox在此基礎上擴展相關功能:參考

      2. 另一個則是GenericVpnPolicy API

      createVpnProfile,其提到提供對應的JSON格式來設定其vpn profile

      不同json format對應不同模式

      可參考:vpn JSON格式 -> 目前Knox文件與之前需求類似的有 :

      ipsec Hybrid RSA 、PSK、xauth RSA、IKE2 PSK、IKE2 RSA...等等

      另外文件中寫到Knox api level 35 Deprecated -> 對應至Android 12

  • LockScreen Password

    • 生物解鎖,設置指紋解鎖或臉部解鎖:點此

分享實際開發啟動license與knox permission的思路

其實如何啟動Knox只需要看官方文件上的方式去想就可

這邊我提供我規劃的思維給大家,如下:

  • 目前將它包成dagger2 module
  • 結構如圖 :

knox_module.png - ExampleKnoxActivity 用來demo 裡面會放一些其他類實作的呼叫範例 - 之後只需要inject KnoxManager跟initKnoxModule就能使用

  ![knox_inject_01.png](/images/others/knox_inject_01.png)

  ![knox_inject_02.png](/images/others/knox_inject_02.png)

  - `KnoxLicense`內存放一些常數與key值可再自行變更,未來如要不上傳key也可再調整
  - 實際使用只需了解`KnoxManager`
  - 主要新增了註冊/解綁knox廣播、起/停用license等功能
    後續主要會從`KnoxManager`新增相關func
  - 其中 `KnoxLicenseReceiver` 因為官方Knox3.7含以下的只有提供Boardcast的方式來接收激活成功與否

  這邊利用Kotlin特性包好

  實際使用knoxManager內的方法註冊並返回結果

  ![knox_inject_03.png](/images/others/knox_inject_03.png)

理論上用Koin當DI也可,而且個人也比較喜歡Koin,之後有空再寫一篇koin寫的DI

  • 加入knox permission

    • 加入權限宣告至manifest knox_permission.png
    • Knox API 30是新舊包名的分水嶺,

    這次實測Knox API 19 無法使用新的permission request 如:

    com.samsung.android.knox.permission.KNOX_APP_MGMT

    使用com.example.supportlibclient.SUPPORT_PERMISSION才成功

    • runtime permission knox_run_time_permission_01.png
  • 其他相關

    部分API操控需解析對應URI 這邊拉出共用的

    knox_constant.png