密碼輸入時瞬間明文顯示的問題

背景

需要實現(xiàn)開機(jī)PIN密碼自動填充的功能,由于PIN輸入控件是一個自定義View com.android.keyguard.PasswordTextView extends View。在使用輔助功能AccessibilityService時,無法通過類似EditText一樣直接,將密碼填充進(jìn)去。只能通過模擬按鍵點擊。然后默認(rèn)下按鈕點擊輸入時密碼數(shù)字有一瞬間是明文顯示的,存在泄漏的風(fēng)險。

探索

為什么要采用 AccessibilityService

PIN 密碼的輸入為什么非得采用復(fù)雜的AccessibilityService來實現(xiàn)呢?

由于PIN涉及到操作系統(tǒng)與SIM卡的通信,在官方設(shè)計中屬于極度危險的操作,在應(yīng)用層由于權(quán)限的問題,被各種攔截掉了。

即,純代碼層面的實現(xiàn),包括反射等路子都被禁掉了。

java.lang.SecurityException: Neither user 10141 nor current process has android.permission.MODIFY_PHONE_STATE.

這就是結(jié)果。此路不通。

故,要么讓你的應(yīng)用成為系統(tǒng)應(yīng)用獲取到相應(yīng)的權(quán)限,要么放棄吧。

確定采用 AccessibilityService,密碼如何防止泄露?

其實很簡單,只是認(rèn)知的問題。在密碼輸入時,那個瞬間的明文展示,其實是一個可設(shè)置的功能。即我們可以同設(shè)置項去關(guān)閉。

小米系統(tǒng)路徑:

設(shè)置 -> 系統(tǒng)安全 -> 顯示密碼 -> 選擇開關(guān)即可

當(dāng)選擇關(guān)閉之后,再輸入密碼時,就沒有那個瞬間明文顯示的問題了。

那么問題來了,如何代碼控制呢?

代碼控制是否顯示密碼

大多數(shù)系統(tǒng)設(shè)置項,都可以通過代碼來操作。

show you the code !??!

/**
 * 1:ON;0:OFF
 */
fun Context.setModeTextShowPassword(mode: Int) {
    try {
        Settings.System.putInt(contentResolver, Settings.System.TEXT_SHOW_PASSWORD, mode)
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

/**
 * 1:ON;0:OFF
 */
fun Context.getModeTextShowPassword(): Int {
    return Settings.System.getInt(contentResolver, Settings.System.TEXT_SHOW_PASSWORD, 0)
}

如上代碼,即可控制是否顯示密碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容