Android安全輸入設計與思考

 隨着移動支付的快速普及,如何保障用戶信息安全這個問題變得越來越重要。

 本文對市面上的Android安全鍵盤進行了總結,詳細分析了爲什麼採用安全鍵盤,怎麼樣實現安全鍵盤等問題。以及各個產品線使用的安全鍵盤有何優劣點。以方便開發者對自我開發安全項目鍵盤進行總結與學習。


爲什麼使用安全鍵盤?

在支付、金融、個人信息敏感的系統中,用戶的重要個人信息,如支付密碼、×××號等需要優先考慮進行安全保護。

用戶輸入信息的安全隱患來自四個方面:

  1. 通過盜號***:僞造一個鏈接,得到用戶輸入的用戶名和密碼

  2. 第三方輸入法:比如使用xx輸入法,則用戶的信息完全暴露在第三方面前(ps:烏雲網上曾經曝光過sougou輸入法漏洞)

  3. 屏幕錄像的方法錄製屏幕:該方法需要手機具有root權限

  4. 鍵盤記錄器:可以通過讀取系統驅動層dev/input/event1中的信息,獲取手機觸屏的位置座標等信息,獲取這些信息需要權限,現在好多手機已經具有了root權限,因此存在竊取鍵盤信息的可能性。

從這我們可以看出手機root之後,確實存在比較大的安全隱患。

針對第一種情形,需要我們平時格外注意陌生鏈接,不要隨便點擊陌生人發過來的鏈接地址。

針對第二個問題,輸入時放棄第三方輸入法,實現自定義的輸入鍵盤,就可以避開這個問題。

針對第三個問題,該問題比較頭疼,因爲要解決該問題,需要鍵盤按鍵沒有按下狀態以及輸入反饋,但是這樣處理會嚴重的影響用戶體驗。

針對第四個問題,有人於2011年在烏雲網站上反應了手機淘寶客戶端的安全漏洞,如下圖所示:

從圖中可以看出,“***”成功的獲取了用戶輸入的信息。另外,當手機連上電腦之後,觸摸手機屏幕,通過adb shell命令getevent可以看到用戶輸入的信息。

從上圖我們可以看出,此命令可以記錄下來,屏幕中任何一個點的點擊、滑動、按下,包括硬鍵盤。getevent會將這些信息以(x,y)座標點的形式輸出到屏幕中。

即,我們可以根據屏幕的寬、高度,按照比例尺,完全還原出來,用戶在手機上的輸出操作。

更加具體的如何監控,我之前也寫過相關鍵盤監控方向的文章: 
http://blog.csdn.net/yzzst/article/details/45747507 
感興趣的同學可以跳轉過去看看。

下面我們就具體說說,如何製作一個安全可靠的輸入鍵盤。


安全的輸入

既然,存在上面的4中情況能夠記錄到我們的鍵盤信息,那麼我們就通過其他方式避免的此安全隱患。

目前自定義安全鍵盤的做法大概有兩種:

  1. 一種是自定義軟鍵盤

  2. 另一種是自定義view佈局,通過按鈕模擬鍵盤輸入。

自定義軟鍵盤

由於這種做法是自定義的軟鍵盤,依然會在event1文件中寫入觸摸信息,因此爲了保證輸入更加安全,採用隨機鍵盤。隨機鍵盤是指鍵值是隨機分佈的,如下圖所示: 

經過這樣處理之後,即使“***”獲取到觸摸信息,但由於鍵值具有隨機分配的特性,提升了輸入的安全性。這種做法目前使用最多,可以在許多銀行的app中看到。

自定義view

通過button點擊事件,模擬輸入。但是這種做法在實現中有一個問題,就是自定義的view,當遮擋住輸入框時,處理比較複雜。分析支付寶安全鍵盤的做法可知,支付寶安全鍵盤使用的是該做法。但是如果只是自定義了view,沒有使得鍵值隨機分佈,依然沒有消除安全隱患。因爲Event1中保存的是觸摸屏幕的觸摸信息,如果鍵值沒有實現隨機分佈,依然可以從event1中推斷出用戶輸入信息。


各大公司的安全鍵盤設計

目前凡是設計到了金錢交易的客戶端,如微信、支付寶、招商銀行app客戶端均可以發現採用了安全鍵盤。如下圖所示爲微信端的安全鍵盤:

支付寶


微信


招商銀行


梆梆安全鍵盤

對於一直提供Android應用安全的安全服務商,梆梆安全來說。它們也提供了一套自己的安全鍵盤SDK。

最特別的是,它們在提供安全鍵盤的同時還提供了一個在鍵盤上預覽的輸入框(EditText)。如下圖所示:

這裏寫圖片描述

但是,這裏梆梆與上面幾家不同,它將數字鍵盤做了一個隨機排列。如下:

這裏寫圖片描述

我們逆向後看到,其的實現方式,就是使用了一個自定義的Dialog來作爲鍵盤的主界面。如下圖: 

其具有特色的加密EditText View。重寫了getString方法。並使用Cypter加密類,在ndk層完成了對輸入的敏感數據的加密。如下圖: 


總結:

從以上可以看出,不論是那種方案,這各大商家企業家都沒采用隨機鍵盤(梆梆除外)。應該是考慮到用戶操作習慣的問題。採用隨機鍵盤雖然能夠保證更加安全,但用戶體驗不好。

對於getevent與屏幕錄像問題,都需要Root權限,影響面沒有我們想象中的那麼大。所以各大商家都更偏向讓自己的產品用戶體驗變好,沒有采用隨機鍵盤。


開始自定義安全鍵盤

目前實現安全鍵盤的方式主要有兩種:

  1. 通過使用android系統提供的組件keyboardview,自定義按鍵,實現自定義鍵盤;

  2. 通過完全自定義的view,通過按鈕的點擊事件模擬鍵盤的輸入。

這兩種方案各有弊端。

對於前者,是系統提供的鍵盤設計接口,我們只需要簡單的設計一個鍵盤的xml文件,給keyboardview設置進去,即可實現一個比較簡單的鍵盤。優點就是,開發起來方便。但是,鍵盤界面與安全性,完全不可控,我們不做考慮。

安全鍵盤還需要注意的

密碼在內存中全程加密存儲

通過高強度的組合加密算法和機制,對安全鍵盤輸入的信息在全流程實施加密,不留下風險空擋。

防截屏***

對於輸入時的截屏***進行防禦,不回顯輸入信息。

防止從底層驅動分析輸入點獲取密碼

通過鍵盤位置每次隨機佈局,數字鍵盤每次輸入後變化,防止從底層驅動分析輸入點,從而分析並獲取密碼。

防止底層dump***內存讀取***

對於底層的內存dump做了有效防護,防止dump出內存密碼明文拷貝等風險。

轉自:

http://blog.csdn.net/yzzst/article/details/46741681

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章