簡單來講,咱們要作的就是一種經過用戶敲擊鍵盤的習慣進行身份鑑別的系統。國內外以前有一些相關研究,可是一般是數千條數據訓練,並且不能隨意改變敲擊的字符串,或者是有的要求採用帶有壓力傳感器的鍵盤,難以實用和推廣。咱們作一個比較簡單的根據匹配類似度的系統,採用普通鍵盤便可使用,其算法實現很簡單。git
關於該領域的介紹推薦看這篇綜述及其引用:https://www.hindawi.com/journals/tswj/2013/408280/github
首先說咱們的一個應用場景:咱們能夠在各類網站的登陸界面部署系統,當用戶輸入密碼時,不止驗證密碼是否正確,同時將此次密碼輸入同註冊時的密碼輸入習慣進行匹配,若是類似度較低,則增長驗證方式,如手機驗證碼。那麼針對這種場景,咱們想了一點方法。算法
咱們須要考慮從鍵盤輸入咱們能獲得什麼,最基本的能獲得多個三元數據,分別爲(鍵盤碼,時間點,按鍵類型)。經過鍵盤碼咱們能夠肯定按鍵的字符,按鍵類型指的是鍵盤被按下仍是擡起。網站
例如某次輸入一個字符串,咱們所獲得的基本數據:spa
key | time | type |
---|---|---|
65 | 0 | 0 |
65 | 101 | 1 |
80 | 151 | 0 |
80 | 241 | 1 |
83 | 260 | 0 |
83 | 350 | 1 |
76 | 421 | 0 |
76 | 601 | 1 |
75 | 670 | 0 |
75 | 740 | 1 |
81 | 770 | 0 |
87 | 871 | 0 |
81 | 961 | 1 |
87 | 994 | 1 |
key爲鍵盤碼,time單位爲ms,type=0爲按下,type=1爲擡起blog
採集數據後,咱們要考慮鍵盤按鍵事件之間的關係。採用前面提到的那篇綜述的一張圖
事件
在這裏,能夠看出能提出兩種特徵,一種是駐留時間特徵(dwell time),另外一種是飛躍時間特徵(flight time)。駐留時間特徵是說一個按鍵被按下後持續的事件,飛躍時間特徵有圖中的四種定義,咱們採用的是從某個按鍵被擡起到下一個按鍵被按下之間的時間差做爲飛躍時間特徵。(即圖中的\(F_{type1}\))ip
從前面那個例子提出的駐留時間特徵爲(101,90,90,60,80,70,90),爲何沒有標出是哪些按鍵的駐留時間,是由於在這個應用場景中,咱們的密碼不會變化,這樣的話咱們就無需考慮記錄對應位置。
相應地,提出的飛躍時間特徵以下:{「65-80」:50, 「80-83」:19, 「83-76」:71, 「76-76」:40, 「76-75」:69, 「75-81」:30,「81-87」:-90},與駐留時間特徵不一樣的是,駐留時間是一個向量,其每一項的含義特定,而飛躍時間特徵爲一個鍵值對的集合,假設出現多個鍵值對的鍵值相同時,咱們就將其取平均值。並且注意到,最後一個「81-87」這一項對應的值爲負數,並非bug,這種狀況是很是常見的現實狀況,讀者能夠想一想是什麼狀況出現了。字符串
從鑑別的角度來看,實驗中飛躍時間特徵對於區分用戶的做用很是明顯,應該說相比于飛躍時間特徵,駐留時間特徵對於系統貢獻微乎其微,若是有想實現這種系統的讀者,建議先用飛躍時間特徵。(純粹的經驗啦,可能不正確,也沒什麼論文支撐)部署
至此,咱們拿到了兩種特徵。我後面僅以飛躍時間特徵爲例(若想綜合駐留時間特徵的信息,能夠分別去按照下面的算法計算類似度,而後作加權平均)。
咱們假設由註冊時採集的用戶密碼輸入獲得的特徵爲\(F_A\),其是一個鍵值對集合,登陸時一樣可獲得相似的特徵\(F_B\)。咱們將其對應鍵的值排好,分別生成兩個序列
\(A = v_{A1},v_{A2},....,v_{A_n}\)
\(B = v_{B1},v_{B2},....,v_{B_n}\)
for(i = 1;i < n;i++){
B[i] = \(\lambda * B[i] * \frac {sum_B - sum_A} {n*sum_A}\)
}
這裏我加了一個係數\(\lambda\),實際上是一種懲罰係數,由於實驗發現若是密碼輸入過快或者密碼太短,一般的匹配方式都會出現太高的類似度,致使漏檢率較高。在咱們的實驗中,發現一般取2到3之間效果不錯。
\(m = \frac {\Sigma_{i=1}^n v_{Ai} * v_{Bi} } {\sqrt {\Sigma_{i=1}^n v_{Ai}^2} * \sqrt {\Sigma_{i=1}^n v_{Bi}^2}}\)
S = m if m > 0 else 0
將S輸出,即爲咱們給出的輸入習慣類似度。
咱們基於這個算法作的Demo系統,連接:
https://www.keystroke.cn/keytrace/toSignup.action
使用JavaScript做爲鍵盤事件採集,後臺用Java實現的算法。
一塊兒完成這個的小夥伴的github:
https://github.com/WindInWillows
https://github.com/hitcxy
https://github.com/s65b40
https://github.com/chuxiuhong //我