隨着移動支付的快速普及,如何保障用戶信息安全這個問題變得越來越重要。
本文對市面上的Android安全鍵盤進行了總結,詳細分析了爲什麼採用安全鍵盤,怎麼樣實現安全鍵盤等問題。以及各個產品線使用的安全鍵盤有何優劣點。以方便開發者對自我開發安全項目鍵盤進行總結與學習。
爲什麼使用安全鍵盤?
在支付、金融、個人信息敏感的系統中,用戶的重要個人信息,如支付密碼、×××號等需要優先考慮進行安全保護。
用戶輸入信息的安全隱患來自四個方面:
通過盜號***:僞造一個鏈接,得到用戶輸入的用戶名和密碼
第三方輸入法:比如使用xx輸入法,則用戶的信息完全暴露在第三方面前(ps:烏雲網上曾經曝光過sougou輸入法漏洞)
屏幕錄像的方法錄製屏幕:該方法需要手機具有root權限
鍵盤記錄器:可以通過讀取系統驅動層dev/input/event1中的信息,獲取手機觸屏的位置座標等信息,獲取這些信息需要權限,現在好多手機已經具有了root權限,因此存在竊取鍵盤信息的可能性。
從這我們可以看出手機root之後,確實存在比較大的安全隱患。
針對第一種情形,需要我們平時格外注意陌生鏈接,不要隨便點擊陌生人發過來的鏈接地址。
針對第二個問題,輸入時放棄第三方輸入法,實現自定義的輸入鍵盤,就可以避開這個問題。
針對第三個問題,該問題比較頭疼,因爲要解決該問題,需要鍵盤按鍵沒有按下狀態以及輸入反饋,但是這樣處理會嚴重的影響用戶體驗。
針對第四個問題,有人於2011年在烏雲網站上反應了手機淘寶客戶端的安全漏洞,如下圖所示:
從圖中可以看出,“***”成功的獲取了用戶輸入的信息。另外,當手機連上電腦之後,觸摸手機屏幕,通過adb shell命令getevent可以看到用戶輸入的信息。
從上圖我們可以看出,此命令可以記錄下來,屏幕中任何一個點的點擊、滑動、按下,包括硬鍵盤。getevent會將這些信息以(x,y)座標點的形式輸出到屏幕中。
即,我們可以根據屏幕的寬、高度,按照比例尺,完全還原出來,用戶在手機上的輸出操作。
更加具體的如何監控,我之前也寫過相關鍵盤監控方向的文章:
http://blog.csdn.net/yzzst/article/details/45747507
感興趣的同學可以跳轉過去看看。
下面我們就具體說說,如何製作一個安全可靠的輸入鍵盤。
安全的輸入
既然,存在上面的4中情況能夠記錄到我們的鍵盤信息,那麼我們就通過其他方式避免的此安全隱患。
目前自定義安全鍵盤的做法大概有兩種:
一種是自定義軟鍵盤
另一種是自定義view佈局,通過按鈕模擬鍵盤輸入。
自定義軟鍵盤
由於這種做法是自定義的軟鍵盤,依然會在event1文件中寫入觸摸信息,因此爲了保證輸入更加安全,採用隨機鍵盤。隨機鍵盤是指鍵值是隨機分佈的,如下圖所示:
經過這樣處理之後,即使“***”獲取到觸摸信息,但由於鍵值具有隨機分配的特性,提升了輸入的安全性。這種做法目前使用最多,可以在許多銀行的app中看到。
自定義view
通過button點擊事件,模擬輸入。但是這種做法在實現中有一個問題,就是自定義的view,當遮擋住輸入框時,處理比較複雜。分析支付寶安全鍵盤的做法可知,支付寶安全鍵盤使用的是該做法。但是如果只是自定義了view,沒有使得鍵值隨機分佈,依然沒有消除安全隱患。因爲Event1中保存的是觸摸屏幕的觸摸信息,如果鍵值沒有實現隨機分佈,依然可以從event1中推斷出用戶輸入信息。
各大公司的安全鍵盤設計
目前凡是設計到了金錢交易的客戶端,如微信、支付寶、招商銀行app客戶端均可以發現採用了安全鍵盤。如下圖所示爲微信端的安全鍵盤:
支付寶
微信
招商銀行
梆梆安全鍵盤
對於一直提供Android應用安全的安全服務商,梆梆安全來說。它們也提供了一套自己的安全鍵盤SDK。
最特別的是,它們在提供安全鍵盤的同時還提供了一個在鍵盤上預覽的輸入框(EditText)。如下圖所示:
但是,這裏梆梆與上面幾家不同,它將數字鍵盤做了一個隨機排列。如下:
我們逆向後看到,其的實現方式,就是使用了一個自定義的Dialog來作爲鍵盤的主界面。如下圖:
其具有特色的加密EditText View。重寫了getString方法。並使用Cypter加密類,在ndk層完成了對輸入的敏感數據的加密。如下圖:
總結:
從以上可以看出,不論是那種方案,這各大商家企業家都沒采用隨機鍵盤(梆梆除外)。應該是考慮到用戶操作習慣的問題。採用隨機鍵盤雖然能夠保證更加安全,但用戶體驗不好。
對於getevent與屏幕錄像問題,都需要Root權限,影響面沒有我們想象中的那麼大。所以各大商家都更偏向讓自己的產品用戶體驗變好,沒有采用隨機鍵盤。
開始自定義安全鍵盤
目前實現安全鍵盤的方式主要有兩種:
通過使用android系統提供的組件keyboardview,自定義按鍵,實現自定義鍵盤;
通過完全自定義的view,通過按鈕的點擊事件模擬鍵盤的輸入。
這兩種方案各有弊端。
對於前者,是系統提供的鍵盤設計接口,我們只需要簡單的設計一個鍵盤的xml文件,給keyboardview設置進去,即可實現一個比較簡單的鍵盤。優點就是,開發起來方便。但是,鍵盤界面與安全性,完全不可控,我們不做考慮。
安全鍵盤還需要注意的
密碼在內存中全程加密存儲
通過高強度的組合加密算法和機制,對安全鍵盤輸入的信息在全流程實施加密,不留下風險空擋。
防截屏***
對於輸入時的截屏***進行防禦,不回顯輸入信息。
防止從底層驅動分析輸入點獲取密碼
通過鍵盤位置每次隨機佈局,數字鍵盤每次輸入後變化,防止從底層驅動分析輸入點,從而分析並獲取密碼。
防止底層dump***內存讀取***
對於底層的內存dump做了有效防護,防止dump出內存密碼明文拷貝等風險。
轉自:
http://blog.csdn.net/yzzst/article/details/46741681