實現 Android 手機每天自動更新密碼

今天要來設計一個應用程式,可以自動地幫你更新Android裝置的屏幕鎖密碼,減少密碼被破解的機率?而使用者只需要記住密碼設定的「規則」即可。

主要套用的API有下列兩個:
AlarmManager
DevicePolicyManager

參考資料:
【Android】AlarmManager - 於指定時刻執行特定工作
[Android] Android Developer Note Administration

AlarmManager:
Alarm若為名詞,中文翻譯就是鬧鐘,AlarmManager若搭配Broadcast其功能就類似於Linux裡面的Crontab。根據老灰鴨筆記本的描速,其原理是向Android系統註冊一個「指定時刻執行指定工作」,當到達指定時間的時候,系統會進行廣播,告訴所有註冊要在此時執行的程式,程式接收到廣播通知時,就知道要執行工作了。

DevicePolicyManager:
是一個用來管理「裝置上強制執行的政策」的介面,其大部分的類別必須先在系統裡註冊為Device Administrator。功能包含強制裝置加密,設定屏幕解鎖錯誤次數,設定密碼規則等等。

若想更深入了解AlarmManager和DevicePolicyManager的細節,可以去Android官方的Developer Console查閱,這邊就不多談,直接來看程式碼吧!

依照慣例,先將如同沒有豆芽菜的陽春麵一樣陽春的使用者介面設定好。

稍早提到DevicePolicyManager需要裝置管理員的權限,因此我們必須先將其啟動。先在AndroidManifest裡註冊一個Receiver,目的為接收DEVICE_ADMIN_ENABLED的Intent物件。

接著在res/xml/目錄底下新建一個用於宣告政策(Policy)的xml檔案。這些政策是採All-or-Nothing的策略,換句話說,只要使用者授予權限給這支應用程式,不管你宣告哪幾個政策,全部都是可以使用的,因此此檔案僅會影響提示所顯示的訊息。

然後建立一個繼承DeviceAdminReceiver的類別,設定不同情況下欲顯示的訊息。

最後,啟動裝置管理員,泰勞是寫在MainActivity裡的onCreate()方法裡面。

第一次開啟應用程式時就會看到裝置管理員的權限要求,使用者必須點選[ACTIVATE]才能使用相關功能,若是選擇[CANCEL]的話,那些裝置管理的政策就不能執行了。

我們可以在Settings->Security->Device administrators確認應用程式是否已經被授予裝置管理員的權限。

成功啟動裝置管理員之後,就有權限能夠透過DevicePolicyManager來設定密碼和密碼規則。回歸到本章節的主題,為了實現每天自動更新密碼,但又要確保自動更新的密碼是使用者能夠知道的,因此泰勞使用的是日期。例如:密碼規則是「英文名字+日期」,那今天的密碼就是kuan0223,明天的密碼就是kuan0224......依此類推。

我們可以透過DevicePolicyManager來重設密碼,然後使用Java提供的SimpleDateFormat和Calendar來取得當日日期並設定日期格式。

接下來要準備讓這支應用程式能夠自動更新密碼,類似上面的做法,先在AndroidManifest註冊一個Reveiver。

建立接收廣播的類別,以及接收到廣播後要執行的程式,除了更新密碼,還需要註冊下一次執行的時間,這樣一來才能夠達到每天都更新的狀態。

最後,在主程式裡面加入第一次的註冊,系統會在00時00分的時候發出一個廣播,而稍早寫好的MyReveiver接收到廣播之後,就會開始執行更新密碼的動作並再註冊一次。


需要注意的是,當Android重開機,先前註冊而尚未執行的工作會被清除,為了讓程式每天自動執行,可以再新增一個Receiver接收「開機已完成」的廣播,每當重開機就會再補執行一次。
設計這樣的一個應用程式,其實是好玩居多,對於安全,應該是沒太大的幫助啦,倒是有幾次測試時,沒注意裝置的日期設定跑掉了,不知道密碼變成什麼模樣,只好重刷...... 

GitHub:

留言

這個網誌中的熱門文章

Repo 實用指令

什麼是 Bootloader?

程式語言常用之符號與詞彙 - 中英文對照