基于用户击键特征的身份鉴别系统

简单来说,我们要做的就是一种通过用户敲击键盘的习惯进行身份鉴别的系统。国内外之前有一些相关研究,但是通常是数千条数据训练,而且不能随意改变敲击的字符串,或者是有的要求采用带有压力传感器的键盘,难以实用和推广。我们做一个比较简单的根据匹配相似度的系统,采用普通键盘即可使用,其算法实现很简单。

关于该领域的介绍推荐看这篇综述及其引用:https://www.hindawi.com/journals/tswj/2013/408280/

首先说我们的一个应用场景:我们可以在各种网站的登录界面部署系统,当用户输入密码时,不止验证密码是否正确,同时将这次密码输入同注册时的密码输入习惯进行匹配,如果相似度较低,则增加验证方式,如手机验证码。那么针对这种场景,我们想了一点方法。

数据采集处理

我们需要考虑从键盘输入我们能得到什么,最基本的能得到多个三元数据,分别为(键盘码,时间点,按键类型)。通过键盘码我们可以确定按键的字符,按键类型指的是键盘被按下还是抬起。

例如某次输入一个字符串,我们所得到的基本数据:

keytimetype
6500
651011
801510
802411
832600
833501
764210
766011
756700
757401
817700
878710
819611
879941

key为键盘码,time单位为ms,type=0为按下,type=1为抬起

采集数据后,我们要考虑键盘按键事件之间的关系。采用前面提到的那篇综述的一张图
image1

在这里,可以看出能提出两种特征,一种是驻留时间特征(dwell time),另一种是飞跃时间特征(flight time)。驻留时间特征是说一个按键被按下后持续的事件,飞跃时间特征有图中的四种定义,我们采用的是从某个按键被抬起到下一个按键被按下之间的时间差作为飞跃时间特征。(即图中的\(F_{type1}\)

从前面那个例子提出的驻留时间特征为(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系统

我们基于这个算法做的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 //我

转载于:https://www.cnblogs.com/chuxiuhong/p/7668416.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1350B. Orac and Models

B. Orac and Models&#xff1a;题目 题意&#xff1a;找一个最长的串&#xff0c;后一个下标可以整除前一个&#xff0c;并且a[i]<a[i1]#include <bits/stdc.h> using namespace std; typedef long long ll; vector<int> a((int)6e5); vector<int> b((i…

linux 配置EPEL源

配置EPEL源[rootansible ~]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm [rootansible ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 [rootansible ~]# yum install ansible -y #安装ansible转载于:https://www.cnblogs.c…

B. Mashmokh and ACM

414B. Mashmokh and ACM&#xff1a;题目 1400分就进入经典dp了 题意&#xff1a;给你1-n的数&#xff0c;构造一个长度为k的串&#xff0c;后一个数能整除前一个数#include <bits/stdc.h> using namespace std; #define int long long vector<int> a((int)6e5); …

最长不下降子序列 (O(nlogn)算法)

分析&#xff1a; 定义状态dp[i]表示长度为i的最长不下降子序列最大的那个数。 每次进来一个数直接找到dp数组第一个大于于它的数dp[x]&#xff0c;并把dp[x - 1]修改成 那个数。就可以了 AC代码&#xff1a; # include <iostream> # include <cstdio> # include &…

1380C. Create The Teams

C. Create The Teams&#xff1a;题目 正常人都会用dp吗&#xff1f;不应该是道贪心题吗&#xff1f;#include <bits/stdc.h> using namespace std; #define int long long vector<int> a((int)6e5); vector<int> b((int)6e5), c((int)6e5); const int mod …

【DOS】dos命令大全

net use ipipc$ " " /user:" " 建立IPC空链接net use ipipc$ "密码" /user:"用户名" 建立IPC非空链接net use h: ipc$ "密码" /user:"用户名" 直接登陆后映射对方C&#xff1a;到本地为H:net use h: ipc$ 登陆后映…

JS基础_break和continue

1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"UTF-8">5 <title></title>6 <script type"text/javascript">7 8 /*9 * break关键字可以…

538B. Quasi Binary

B. Quasi Binary&#xff1a;题目 这题目建议挪到1000分&#xff0c;它不配1400#include <bits/stdc.h> using namespace std; #define int long long vector<int> a((int)6e5); vector<int> b((int)6e5), c((int)6e5); const int mod 1e9 7; signed main…

289B. Polo the Penguin and Matrix

B. Polo the Penguin and Matrix&#xff1a;题目 思路&#xff1a;纯暴力#include <bits/stdc.h> using namespace std; // #define int long long vector<int> a((int)6e5); vector<int> b((int)6e5), c((int)6e5); const int mod 1e9 7; int g[111][11…

HDU 1525 类Bash博弈

给两数a,b&#xff0c;大的数b b - a*k,a*k为不大于b的数,重复过程&#xff0c;直到一个数为0时&#xff0c;此时当前操作人胜。 可以发现如果每次bb%a&#xff0c;那么GCD的步数决定了先手后手谁胜&#xff0c;而每次GCD的一步过程视为一个子游戏&#xff0c;但是可以发现如果…

HDU 3094 树上删边 NIM变形

基本的树上删边游戏 写过很多遍了 /** Date : 2017-10-13 18:19:37* FileName: HDU 3094 树上删边 NIM变形.cpp* Platform: Windows* Author : Lweleth (SoungEarlfgmail.com)* Link : https://github.com/* Version : $Id$*/ #include <bits/stdc.h> #define LL …

1320A. Journey Planning

A. Journey Planning&#xff1a;题目 mp的应用&#xff0c;和下标同样的差一定会越来越大&#xff0c;知道这点就好写了。#include <bits/stdc.h> using namespace std; #define int long long vector<int> a((int)6e5); vector<int> b((int)6e5), c((int)…

1245C. Constanze‘s Machine

C. Constanze’s Machine&#xff1a;题目 众所周知&#xff0c;斐波那契数列属于dp#include <bits/stdc.h> using namespace std; #define int long long vector<int> a((int)6e5); vector<int> b((int)6e5), c((int)6e5); const int mod 1e9 7; map<…

常见三种字符编码的区别:ASCII、Unicode、UTF-8

什么是字符编码&#xff1f; 计算机只能处理数字&#xff0c;如果要处理文本&#xff0c;就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特&#xff08;bit&#xff09;作为一个字节&#xff08;byte&#xff09;&#xff0c;所以&#xff0c;一个字节能表…

1108D. Diverse Garland

D. Diverse Garland&#xff1a;题目 什么脑瘫题目&#xff01;&#xff01;&#xff01;可恶&#xff0c;和dp有什么关系&#xff1f;但是强迫症让我不得不写&#xff0c;空一个很难受&#xff01;&#xff01;#include <bits/stdc.h> using namespace std; #define in…

Oracle存储过程procedure in、out、in out 模式参数【不发布,纯转】

Oracle存储过程procedure in、out、in out 模式参数 Oracle存储过程基本语法介绍 注意存过不会自动提交,需要在存过本身添加commit; rollback;等语句转载于:https://www.cnblogs.com/whatlonelytear/p/7680383.html

1451C. String Equality

C. String Equality&#xff1a;题目 我也不知道这算不算dp....虽然它有一个dp的标签#include <bits/stdc.h> using namespace std; #define int long long vector<int> a((int)6e5); vector<int> b((int)6e5), c((int)6e5); const int mod 1e9 7; int mp…

导航,头部,CSS基础

制作自己的导航条。HTML头部元素&#xff1a;<base> 定义了页面链接标签的默认链接地址<style> 定义了HTML文档的样式文件<link> 定义了一个文档和外部资源之间的关系练习样式表&#xff1a;行内样式表内嵌样式表外部样式表分别练习定义三类选择器&#x…

1535C. Unstable String

C. Unstable String题目 每个&#xff1f;只能选择变一次&#xff0c;然后不能变了&#xff0c;这是关键。#include <bits/stdc.h> using namespace std; #define int long long vector<int> a((int)6e5); vector<int> b((int)6e5), c((int)6e5); const int…

十五、导航,头部,CSS基础

制作自己的导航条。HTML头部元素&#xff1a;<base> 定义了页面链接标签的默认链接地址<style> 定义了HTML文档的样式文件<link> 定义了一个文档和外部资源之间的关系 练习样式表&#xff1a;行内样式表内嵌样式表外部样式表分别练习定义三类选择器&#…