《计算机系统与网络安全》第七章 身份认证

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

第七章 身份认证

7.1 身份认证

接下来我们来学习身份认证。

首先我们来看身份认证的概述。先看身份证的定义,身份认证是证实主体的真实身份与其所声称的身份是否相符的过程。比如我们登录一个电商网站,输入用户名张三,这个时候电商网站它就会验证一下真实身份是否就是所声称的张三。如何来验证?通常通过认证码,通过口令来进行认证,

我们现在生活当中主要通过各种证件口令来验证身份,比如身份证,户口、学生证、暗号等等来验证,这个信息世界里边的身份证又如何来完成?接下来看这里我们通过一张图来看一看这个身份认证在用户使用信息系统的时候处于什么样一个位置。这个身份认证是用户获取系统服务所必须经过的一道关卡,它同时是这个访问控制和审计的一个前提。

看下图,用户要访问资源,它首先要通过身份证,然后通过了身份证之后,再经过访问控制,对他的行为进行一定的约束和限制,然后再来访问资源,同时还会根据用户的行为以及以及授权数据库对用户的呃活动进行这个记录审计,所以这个身份证是访问控制和审计的前提,只有确定了身份之后,才能够对用户的行为进行有效的区别的进行控制,然后也对用户的行为进行相应的记录和审计。

接下来我们来看一下针对身份认证的攻击,针对身份证的攻击主要有如下三类,一类是数据流的窃听,就是前面讲的嗅探,攻击者窃听用户的网络交互数据,然后辨析认证数据,从中提取用户名和口令,这些敏感的重要的信息。另外攻击者还可以拷贝和重传用户的认证信息,非法的截获信息,然后把这些信息传送给最终的验证者,或者说接收者,从而产生一个授权的效果。第三是修改或者伪造攻击者,截获用户认证登录的信息,然后替换或者修改信息后,再把它传送给验证者或接受者,或者非法的冒用合法的用户,然后来发送信息。

身份认证可以进行分类,按照地域来分的话,可以分成本地的认证和远程的认证,本地就是在本地范围之内发起的这个身份认证,远程就是通过网络,远程连接设备实体以及环境,进行这个实体的一个认证。根据方向可以分成单项认证和双向认证。单项认证就是通信双方当中只有一方需要向另外一方进行这个认证,双向认证就是双方都需要相互的进行这个认证。

接下来我们看一下身份证系统的组成,身份证系统通常需要有一个认证服务器,然后需要有这个认证的系统用户端软件,需要有认证的设备和相应的协议。这里有一个图是这个身份认证的模型,身份证通常涉及到了身份认证通常涉及到了四方,一个是示证者,也就是声称者,一方是验证者,还有就是需要有个可信的第三方,然后另外就是存在这个攻击者。

接下来我们来看一下身份认证的依据,要实现身份认证必须要有一定的依据,身份认证的依据大体可以分为如下的三类,

第一类是用户所知,比如说我们通常使用的密码,口令就是用户所知的,通过用户所知的一些知识或者信息作为认证的这个依据。用户所知这种方式通常是比较简单的,摊销比较小,但是也存在容易泄露不安全的这样一些缺点。

第二类就是用户所有用户持有的或者拥有的一些实体,比如说一些证件,身份证,护照,密码盘等等,这些东西它泄密的可能性较小,它的安全性高于第一类,但是系统相对要复杂一点,因为需要系统去验证用户所持有的所拥有的这些实体是否是,真实可靠的。

第三类就是用户的特征,通常是用户所拥有的一些生物特征,比如说用户的、指纹、用户的笔记、用户的声音,虹膜、DNA、掌纹等等,这些它的安全性最高,比如说要窃取用户的指纹或者DNA等等,它的难度是比较大的。但是使用这些用户特征来进行身份认证的话,就涉及到了更复杂的算法和这个实现技术。

这里让大家思考一个问题,就是我们前面介绍的公钥数字证书,它是否可以直接作为身份认证的依据,关于这个问题的答案它是否定的。就是公钥数字证书它不能直接作为身份证的依据,但是它可以间接作为身份证的依据。比如前面讲的https的认证过程,然后就就是基于公钥数字证书的,因为公钥数字证书它是公开的,类似于一张名片一样的,我们可以把它发布出去,任何人都可以掌握其他人的公钥,这个时候用公钥数据证书来直接身份认证就是不行的。就好比你拿一个名片去验证你的身份,这个是不可行的。但是公钥数字证书背后与它对应的是私钥用户的私钥,可以基于私钥来设计身份认证,也就是说凭借私钥可以完成身份认证。

接下来我们来看一下身份认证的机制,身份证的机制有两大类,一类是非密码的,包括口令的,包括基于口令的认证,基于地址的认证和基于生物特征的认证。另外一类就是基于密码算法的认证,包括对称密码体制,公钥密码体制,密钥以及密码校验函数等等。

7.2.1 口令的安全问题

接下来我们来介绍非密码的认证机制,非密码的认证机制主要包括基于口令的认证机制,基于地质的认证机制和基于生物特征以及个人令牌的认证机制。首先来看基于口令的认证机制,这是一种大家非常熟悉的认证方式,这个认证方式它的关键就在于口令,首先我们来关注一下口令的安全问题。

我们来看一下针对口令的攻击,针对口令的攻击有如下几种类型,第一种字典攻击,这个字典攻击就是用户往往为了方便记忆,设置的口令会与周遭的事物相关,比如说身份证号码,生日车牌、电话等等这样一些信息,这个时候也为攻击者提供了线索,攻击者可以通过收集上述的这些信息,然后设计或者罗列一个所有用户可能作为口令的字符串出来,然后这样形成一个字典,用这样一个口令字典去挨个尝试这些攻击者设计出来的口令,看一下是否会命中用户的口令。

如果攻击者不知道用户设计口令的一些特征,也没有掌握用户相关的一些信息,这个时候只有进行穷举攻击,穷举攻击它就是使用全部的口令字符串作为字典,穷举攻击穷举攻击实际上就是暴力破解,就是把所有可能的口令都尝试一遍,比如说假设口令是4位10进数的话,那这个时候就需要从4个0~4个9全部的尝试一遍,进行暴力的破解。相就相比字典攻击,穷举攻击,它的破解的空间需要的这个时间开销就大大的增加了。

窥探攻击,就是攻击者接近被攻击系统,安装监视器或者亲自窥探用户输入口令,这个大家相信都会有有所这个大家相信都会有所体会,比如说在使用银行的ATM机的时候,银行的ATM机往往会进行语音的提示,让大家注意小心遮挡键盘,就是防止攻击者,然后在ATM机或者周围安装一些监控的设备,然后来监视用户输入的口令。

还有我们前面介绍过的社交工程,攻击者冒充领导或者合法的用户给相关的人员管理员等等,发送邮件或者打电话,然后通过取得信任骗取用户的口令。

另外是垃圾搜索,就是攻击者搜索被攻击者的废弃物,然后得到用户写在这个纸上有随意丢弃的这个口令。垃圾搜索不仅仅可以搜索这个口令,在其他一些场景当中更具有效果。比如说在一些发明设计的单位,通过垃圾搜索可以搜索一些这个发明或者设计以及方案的草稿,获取这些更有价值的信息。

接下来我们来看一下安全口令的要求,怎么样可以设计一个安全的口令,通常安全的口令需要采用较长的长度,这个口令破解的难度是。口令破解的难度是随着口令的长度指数增加的,比如口令只有一位10进制数,这个时候口令的空间就是090,如果是两位的话,那这个时候就是099空零空,口令的空间就变成了10的平方,如果口令长度是6位十进制数的话,这个时候就是6个0~6个9,口令的空间就是10的6次方,所以通常要求口令至少是8个字符或者更长。

第二个要求是采用多种字符的组合,如果口令只采用自如果口令只采用数字的话,这个时候一位口令它的空间就是10,如果口令只采用字符的话,通常一位口令空间就是26,如果数字和字母进行组合的话,这个时候一位的口令空间就是数字的10加上字母的26,如果还要区分大小写的话,一位口令就是10加上52,如果还要结合其他的符号的话,一位、口令空间就更大了。

第三条是要避免使用单词术语以及与用户相关的信息,这样的话就可以避免攻击者收集这些信息,形成这个口令字典。

口令安全需要一些增强的策略和机制,主要有下面的5类,有些大家相信有所体会,比如说第一条就是限制猜测的次数,就是在用户输入口令的时候,如果输错了,让它重新再输入,但是要限制这个输入的次数,往往达到一定次数之后,这个用户的账户就会被锁定,从而防止黑客进行无限的猜测。 第二要降低猜测口令的速度,就是用户他输入口令错误之后,可能会把这个系统锁定一段时间,过个几十秒或者几分钟再让用户进行这个尝试。第三是刚才讲的设置安全的口令,增长口令的长度,增加攻击者进行暴力破解的搜索空间,然后选择安全的口令就是多种字符的组合,然后另外就是口令使用一段时间之后可能就慢慢的不安全了。这个时候我们可以通过策略强制要求用户定期来更换口令。

7.2.2 基于口令的认证机制的演进

接下来我们来学习基于口令的认证机制的演进。

最早的口令认证机制是这样的,当用户到一个系统当中去注册的时候,用户选好他自己的身份标志,ID以及他的注册口令,然后系统就以明文的形式存放一个口令表,把所有系统当中的用户身份标志和他的注册口令存在一起。这个明文口令表可以以文件的形式,也可以以数据库的形式来存放。当用户登录系统的时候,用户输入他的ID和他的pass2的口令,这个时候系统就用用户输入的ID去查询系统当中存放的明文口令表当中,用户ID对应的口令password,然后将系统当中的口令与用户现在输入的口令两个来做一个比对,如果两个口令是相同的,说明用户是合法的用户,就通过他的身份认证,如果不相同,这个用户的口令有问题就拒绝。

这种以明文形式存放的口令容易遭到攻击。主要面临的安全威胁有如下三种,

一个是攻击者可以获得口令文件,由于这个口令文件它是明文形式存放的,所以一旦攻击者获取了口令文件,他就获得了这个系统当中所有用户的口令,它就可以随后假冒其他用户来使用系统。

此外,攻击者还可以驻守在这个网络的旁边,来监听用户登录系统的网络通信,进而解析这个口令。由于这个口令是明文形成存放的,所以当用户在输入他的用户名和口令的时候,那自然也是名文,这个时候攻击者就可以从这个通信当中直接监听到口令。

攻击者还可以实施重放攻击,用户在登录系统的时候,用户名是固定的,它的口令也是不变的,所以每一次用户登录它的用户名口令,整个登录认证的会话它是不变的,攻击者就可以把这个会话的数据截获下来,然后重新向服务器发放过去,就可以获得一个认证的通过。

针对刚才的采用明文形式存放的口令表,容易被攻击者获取这个明文的口令,这个时候就可以采用一些其他的方式对口令进行一定的处理。比如说采用哈希的方式,把用户的注册的口令通过哈希做一个变换,然后系统这个时候就不再存放明文的口令了,而是存放用户的口令哈希。采用这种方式,同样用户在登录的时候也是输入他的ID和他的口令,这个时候系统同样用用户的ID去查询系统当中哈希的口令表去获取当前用户的口令哈希,然后再把用户当前输入的口令用相同的哈希函数做一个相同的哈希运算,然后把前后两个哈希来做一个比对。同样相同的话,就通过用户认证不相同就拒绝,这种方式是使用哈希函数,哈希函数它具有单向性,所以系统当中存放是口令哈希,攻击者即便获得了这个口令哈希表,拿到了某一个用户的口令,哈希由于哈希是单向的,攻击者从这个哈希当中要把用户的口令恢复出来是非常困难的,

基于哈希的口令机制,仍然面临如下两种安全威胁,第一种重放攻击,跟使用明文的口令机制一样,采用了哈希之后,用户的口令哈希是不变的,这个时候每一次用户在认证登录的时候,它的认证报文也是不变的,也就是每一次都是用户的ID和它的口令哈希,这个时候攻击者通过网络截获,把用户的认证报文截获之后,存放到服务器认证端,这个时候仍然可以通过这个系统的认证,比如张三在登录系统的时候,输入他的ID和他的口令,这个时候网络传输就传输了张三的ID和他的口令的,哈希这两个东西都是不变的。攻击者把他的认证报文截获之后从上到系统,就可以获得系统的认证,从而假冒成张三,从而假冒成张三的身份与系统进行交互。

另外基于哈希的口令认证机制,还容易受到攻击者采用的字典攻击。攻击者的字典攻击实际上就是进行口令猜测,攻击者针对用户生成一个口令字典,也就是把这个用户他所有可能采用的口令,把它一一的罗列出来,形成一个口令字典,然后再把这个口令字典当中的口令一一的输入到系统当中,然后进行一个用户的口令猜测。由于这个认证过程,当用户在输入他的ID的时候,系统会去获取当前用户在口令表当中的口令哈希,这个攻击者进行猜测的时候,它输入的口令同样也会被使用相同的哈希函数进行计算计算,出一个相应的哈希两个进行一个比对。这个时候如果攻击者他构造的口令字典足够的大,然后足够精确的话,就很容易命中系统当中用户口令的哈希。

针对这样一种攻击方式的话,前面讲的这个安全口令的一些策略,可以发挥良好的作用,一个就是限制口令猜测的次数,让这个攻击者仅仅能够猜测几次可能就不能猜测了,系统可能就被锁定了。另外还可以限制口令猜测的频率,每一次猜测之后,如果口令不正确,系统可能会延迟一段时间再次进行这个认证,从而加大这个猜测的时间,降低这个猜测的频率。如果系统采用了口令安全增强的机制,限制了口令、猜测的、次数和频率,这个时候攻击者可以采用基于字典的嗅探加插标法,这种方法攻击者不再在线的用口令字典去猜测用户的口令,而是截获用户登录的口令哈希,然后再离线的去匹配这个去匹配。比如攻击者截获了某个用户张三他的登录报文,从中提取了张三的口令哈希,

这个时候攻击者就可以针对这个用户生成一个口令字典,然后在计算口令字典当中,每一个口令的哈希形成一个彩虹表。如下图就是一个彩虹表,这个彩虹表由两列构成,一列是攻击者针对用户然后这个猜测的口令。第二列,就是攻击者针对这个猜测的口令计算的哈希值,有了这个彩虹表之后,攻击者就可以用截获的用户的口令来查这样一个表,命中的哈希对应的就是用户的口令,这个彩虹表通常是一个庞大的针对各种可能的字母组合,预先计算好的一个哈希值的一个集合,这个主流的彩虹表往往有100g以上,通常一个大的彩虹表由若干的攻击者他们协同来构造,

比如说这一个攻击者针对某一个用户,我生成一些口令字典在计算它的,哈希另外一个攻击者又针对其他的口令,然后再计算它的哈希,把这些各个攻击者他们生成的这个彩虹表的一个片段把它组合起来,就构成一个大的彩虹表,然后攻击者可以都来使用这样一个表可以共享。

我们刚才看到攻击者可以采用彩虹表加这个查表法,对这个哈希口令表进行这个攻击,它的这种攻击方式有效主要在于用户的口令还不够长,是有限的,我们能不能让用户的口令进一步的增长,让用户口令进一步的加长,会带来两个问题,一个是用户不便于记忆,第二就是加上口令之后会影响这个口令认证的效率.

所以后来又产生了加盐的哈希克林表。这个加盐的哈希克林表就是在用户注册的时候,系统为每个用户选一个随机的盐值,其实就是一个随机数,然后把这个随机数与用户选好的这个口令一起来做一个哈希运算,得到一个哈希值,把它存在口令表当中。加盐的哈希口令表是由三个部分组成,一个部分就是用户的身份标志,ID,一个就是用户的盐值、每一个,用户他的盐值都是不一样的。然后另外就是用户的口令与它的盐值的哈希值三个部分。

有了这个加盐的哈希口令表之后,当用户在进行登录的时候,用户输入他的使用家园的哈希口令表,用户在进行登录的时候,同样输入他的ID和他的口令password,这个时候系统同样会用用户输入的ID去查询这个加盐的口令表,去获取用户的盐和它的哈希兹,这个时候系统会把这个盐值再返回给用户,系统会把这个查询得到的盐值返回给用户端,用户端会把这个系统返回的盐值和用户当前输入的口令一起来做一个哈希运算,得到一个哈希值,然后再把这个从系统家园口令表当中查询得到的用户的口令和盐值的哈希值两个做一个比对,如果相同的话,就通过了用户的身份认证不相同,就拒绝。

这里是一个加盐的哈希口令表的一个示意图,有三项用户名,也就是用户ID,然后就是帕斯沃尔德加盐的这个哈希值。然后第三列就是加盐,采用加盐的哈希表,它实质上并没有加长这个口令长度,它只是伪加长的口令长度,就是通过把盐加到就是通过把盐跟口令把它组合起来,然后来计算哈希值,得到一个伪加长口令的这样一个效果。这种加盐的方式可以抵抗这个彩虹表查询攻击,为什么?通过刚才的用户登录的过程,我们可以看到每个用户在进行登录的时候,系统都会返回用户的盐值,这个返回的盐值实际上是可以被攻击者掌握的,供给侧掌握这个盐值之后,它构造这个彩虹表是不是也可以构造?

攻击者同样可以执行与系统相同的操作,在构造彩虹表的时候,把获取到的盐值跟用户的这个口令一起组合起来,然后来计算它的哈希值,然后构造,这个哈然后构造这个哈希表,生成这个彩虹表。但是这里我们要看到这个加盐的哈希口令机制,它的每一个、用户他的盐都是不一样的,这就意味着攻击者截获了某个用户的盐值和它的相应的认证哈希值之后,它构造的彩虹表只能针对当前这个用户使用,如果要攻击其他的用户的话,它又需要获取其他用户的哈希值和相应的盐值,然后重新购在彩虹表,这个时候攻击者们就不能协同的来产生这个哈希值,这个时候攻击者们就不能协同的来构造一个可以共享的彩虹表,这样就大大的增加了攻击者,产生彩虹表进行查表攻击的难度,增大了开销。

我们刚才看到加盐的哈希口令机制,通过尾加长口令的长度,使攻击者采用彩虹表加查询的方法,它的攻击开销会大大的增加,从而造成这种攻击方式失效。但是这种口令机制仍然面临重放攻击的威胁。我们看到虽然每个用户他的盐值是不一样的,但是同一个用户他的盐值是不变的,每个用户的盐不变,每个用户的口令也是不变的,这个时候就造成了用户他的认证登录信息仍然是相同的。同样是用户的ID,用户的口令加盐的哈希值,用户登录认证的信息,同样是用户的ID和用户的口令加盐的哈希值。这个时候攻击者同样简单的把用户登录的认证报文截获,然后再重放到认证服务器,就可以通过认证服务器的认证,从而假冒成合法的用户。

7.2.3 一次性口令的认证机制

刚才我们看到针对口令的认证机制的几种变化,都没有能避免重犯攻击的安全威胁。接下来我们来看一下一次性口令的认证机制。

一次性口令认证机制主要就是用来对抗重犯攻击,它是在登录过程当中加入不确定的因素,使每一次登录过程当中传送的信息,也就是认证报文都不相同。在登录过程当中,加入不确定因素的方法主要有如下三类,口令序列,挑战应答和时间戳。

首先我们来看口令序列S/KEY,认证双方分别是客户端和服务器端,这个时候要选一个函数f然后再选一个初始的值r,我们把这个r放到函数当中做一个计算,得到一个x1=f2,然后再进一步把这个得到的x一又作为函数的输入,再计算一个x2=fx1,并且不断的重复,直到xn等于f xn-1。然后再来计算xn+1=fxn这个时候我们就得到了一个从x1x2、xn到xn加一的这么一个序列,总共有n加一项。然后我们将得到的这个序列的前n项,也就是x1到x2,xn交给客户端,然后最后一项xn加一交给服务端,这个时候双方就可以使用这个序列来进行认证了。在认证的时候,客户端逆序使用这个序列当中的,首先客户端使用这个 Xn然后把这个数提交给服务端,服务端收到这个数之后,然后使用相同的函数f来做一个计算,怎么计算?就是把这个从客户端得到的xn作为输入来计算一个xn加一一撇,然后再把这个计算后的结果与这个服务端它自己存放的这个 Xn加一做一个比对。如果相同,就通过认证不相同就拒绝。这一次认证完了之后,如果成功了,服务端就用刚才得到的这个 xn,然后去替换它手里的xn+1,然后等待客户下一次来进行认证。客户下一次认证,他就在选用他手里序列的下一项xn减一来进行认证,重复刚才的过程,这个就是口令序列。

我们再来看第二种一次性口令的方法,叫做挑战应答,同样是认证了双方客户端和服务器端,首先用户通过客户端向认证服务器发送一个认证的请求,然后服务器生成一个随机数,返回给客户端,客户端拿到服务器返回的随机数r之后,把这个随机数与它的口令一起做一个运算,然后得到一个结果h然后再把这个h返回给认证服务器,认证服务器用相同的函数把用户的口令和这个刚才返回一个用户的这个随机数r来做一个相同的f函数运算,得到一个h一撇,把这个 h跟用户推送过来的h,把这个 h`跟用户返回的h做一个比对,如果相同就通过认证,如果不相同就拒绝。这种认证方式是今天常见的一种认证方式,在登录一些网站,如电商网站的时候,我们经常会输入口令的时候,还要输入一个认证码,而这个认证码每一次都是不一样的,都是一个随机的,

这个就是挑战应答方式,这种方式类似于刚才加盐的哈希口令认证,但是也是有,但是有所不同,加盐的口令方式,每个用户他的盐值是不变的,而这种认证方式每一次认证的时候,服务端产生的这个随机数都是不一样的,这就造成了每一次,用户在认证登录的时候,它的认证报文是不一样的,因为每一次这个随机数都是不一样的。

我们再来看第三种一次性口令机制加时间戳的方式,就是以用户登录的时间作为随机的因素,比如用户在登录的时候,声称它的登录口令的时候,把用户的名和口令以及时间一起来做一个哈希运算。系统在验证的时候,同样把用户名、用户的口令和当前的时间来做一个哈希运算,这个时候再把两个哈希来做一个比对,由于用户登录的时间是不断变化的,所以每一次登录产生的认证报文就是不一样的,这个就会造成攻击者他重返攻击就失效。

当然采用时间错误的方式来作为随机因素,也要求认证的双方具有较高的时间准确度,一般采取以分钟为时间单位的这样一种折中方法,也就是要保证每一次用户登录的时候,在用户端踩到的时间戳跟系统认证端,这也就是要保证用户登录的时候,用户端获取的时间和系统认证和系统在认证的时候,它踩到的时间是同步的。

7.2.4 非口令的认证机制

接下来我们来介绍非口令的认证机制。

首先来看基于地址的认证机制,基于地址的认证机制是以声称者他的地址作为认证的一个基础,验证者对每一个主体都会保持一份合法呼叫地址文件,这种认证机制自身往往不能作为单独的鉴别机制,可以作为其他机制的一个有效补充。比如我们使用这个 WiFi路由器,通常会设置密码口令来进行这个认证登录,同时还可以设置一个MAC地址绑定,这就是一个基于地址的认证,也就是在路由器当中,设置一个MAC地址的白名单,把可以访问这个路由器的合法的用户的MAC地址加到这个白名单中,加到这个 MAC地址白名单当中,只有在这个白名单当中的设备才能够访问路由器。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mq0I9zQt-1687881557432)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]

再比如我们学校的图书馆,除了进行用户的口令认证之外,还采用了基于地址的认证机制,以IP地址作为认证的基础。当用户在访问图书馆开放的一些资源的时候,只有校园网内部的IP地址才能够去访问公开的数据库,比如说这个 cnki–知网的文库。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2u1Gf8cy-1687881557437)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]

接下来我们再来看一下基于生物特征的认证机制,基于生物特征的认证机制,就需要专门的设备来采集生物特征。

比如说采集指纹,视网膜等等。基于生物特征的认证机制,分成两个阶段,一个阶段就是授权阶段,也就是对标到用户的注册过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YxNUEar0-1687881557438)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dmrYBog0-1687881557440)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)]

在用户注册的时候,我们就要对它的特征进行取样,然后把它存到合法用户的一个特征模板数据库当中,然后当用户在进行这个登录系统的时候就进行然后当用户在登录系统的时候就进入了识别阶段,这个时候再对用户的特征进行一个采样,把这个采样的结果拿到特征模板数据库当中进行查询,进行比对,如果匹配的话,就接受就通过了认证不匹配,就拒绝。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xL7Pxvrh-1687881557441)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)]

这种方式它的优点就是往往是没有办法进行假冒和模仿的,它的缺点就是比较的昂贵,不够稳定,有些这个生物特征它的匹配它的采集识别率还不是太高。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v5yIKOqz-1687881557442)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg)]

另外我们再来看基于个人令牌的认证机制,个人令牌往往是一个实体,通常它采用这个静态的口令加动态口令结合的方式,静态的口令就是开头介绍的,基于口令的认证机制不变的,就是静态的。同时认证的双方还要采用相同的算法以及相同的动态因子,生成一个动态的口令,把这个静态口令和动态口令结合起来进行这个认证,从而实现这个防止对抗攻击,从而实现对对抗攻击的防御。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cGObafng-1687881557445)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg)]

7.3. 基于密码的认证机制

7.3.1 基于对称密码的认证机制

下面我们来介绍基于密码的认证机制,首先来看基于对称密码的认证机制。

基于对称密码的认证机制,基于对称密码的加解密,构造这个认证协议,通信双方共享一个对称密码,这个对称密码就作为认证双方的依据。

假设有两个用户,A和B他们之间共享了一个密钥KAB这个时候假设一个用户声称它是用户A然后给用户B发来一个加密后的密文,这个时候如果用户B可以用与用户A共享的密钥,KAB把这个密文成功的解密的话,就说明这个消息确实是来自于用户A的,这个声称的用户A它就是真实的,这个基于对称密码体制的这个认证机制,就可以使用这个密钥在一个询问和应答协议当中去处理或者加密信息的交换。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UtrnLkrR-1687881557446)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg)]

基于对称密码的认证,有一些记说一下。首先我们来看一下基于对称密码认证的这个一些记号,期望进行身份认证的两个用户A和B然后他们各自产生随机数RA,RB然后他们产生的时间出TA,TB以及他们的会话密钥,KAB.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XkvFvGVS-1687881557448)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg)]

我们首先来看一下ISO/IEC 9798-2协议,这个是基于时间戳的一个认证协议,这个协议有单向的和双向的,这个时间戳以及后面要介绍的这个随机数,主要就是为了防止对认证进行的对抗攻击。

单向认证就是这个用户A要向用户B去进行认证,这个时候用户A就可以采集当前的时间戳tA然后把用户B也就是验证方的ID一起来做一个加密运算,发送给验证方B,B收到这样一个报文之后,他就对这个报文进行一个解密,用这个 KAB来进行解密。如果他能够成功的解密,提取出当前的一个时间戳和他自己的一个ID的话,说明这个消息确实是来自于A的,因为只有A才跟他拥有相同的会话密钥kAB。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w6YPWWY2-1687881557449)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg)]

我们再来看双向认证,双向认证就是在刚才单项认证的基础上面,也就是B完成了对用户A的身份认证之后,然后用户B还要向用户A来出示他的身份,让用户A验证用户B的身份。这个时候反过来,B也产生一个跟刚才消息类似的一个加密消息。把它当前的时间戳tB以及验证方A它的ID一起来做一个加密运算,然后用这个 KAB加密发送给用户 A用户A收到之后,同样用他手里的KAB来做一个解密算,去提取B的时间戳以及他自己的ID,如果能够成功的紧密的话,同样也可以验证用户B他的身份。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hHoDe81z-1687881557452)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg)]

我们再来看刚才的协议,刚才的认证协议是采用时间戳的方式来防止这个重放攻击。

我们再来看基于一次性随机数的这个协议,同样先看这个单项认证,同样是A要向B出示身份,由B来进行验证,这个时候首先就是由验证者B向A发送一个随机数,也就是时常说的验证码或者认证码。第二步A再向B发一个加密的报文,用它的会话密钥加密刚才B发送给它的随机数RB以及这个验证方B的ID。这个时候用户B验证方收到这样一个报文之后,就用他自己的密钥KAB把这个报文解密,如果能够成功的提取出密文当中的RB以及它的ID的话,就验证了用户A的身份。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HAEtD58i-1687881557454)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg)]

同样我们这个双向认证就是在单向认证完了之后,然后再做一个反向的一个认证,这个过程就是这样的,首先前两步就是用户B去验证A的身份,同样B首先发随机数RB给 AA在进行这个响应的时候,这个时候它也要产生一个随机数RA,然后把这个RA和这个从B接收的RB以及这个验证方B的ID一起来加密发送给B,B收到这个报文之后,验证这个报文,用他自己的KB来解密,提取B收到这个报文之后就进行验证,用他自己手里面的这个会话密钥KB来做,这个来对这个密文进行解密,提取RA, RB和它的ID。

通过这个 RB和它自己的ID,就可以判断A的身份是否是真实的,同时 B还要向A来验证他的这个身份,同时A还要验证B的身份,所以这个时候还需要B继续的给A返回一个消息,返回什么?返回A发送给它的随机数RA,,以及 A验证方它的IDA然后用这个 KAB把它加密发给AA收到这个报文之后做同样的验证,通过解密这个报文提取随机数和他自己的ID,可以验证B的身份。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LxJ8tw28-1687881557455)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg)]

7.3.2 基于公钥密码体制的认证机制

接下来我们介绍基于公钥密码体制的认证机制。

这种认证机制是采用公开密码算法来构造认证机制,主要是使用这个数字签名作为认证的依据,生成者用他的签名私钥来做一个签名,来证实他的身份,这个时候生成者用他的签名的私钥来签署某一个信息,同时还要考虑到这个对抗重放攻击,在签名的时候会包含一个非重复的值,也就是随机数或者是一个时间戳,而验证者就可以使用生成者他的公钥,比如公钥证书当中的公钥去验证他的身份,而验证者就用这个生成者他的公钥就是来自他公钥证书当中的公钥去验证他的签名。

同样这里有些记号,大家看一下,包括用这个公钥来进行加密,还有就是用这个私钥来签名产生的随机数和采集到的时间戳。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SdRJIIJr-1687881557457)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg)]

接下来我们就来具体看一下相应的认证协议,isoiec9798-3,首先是基于时间戳的,同样先看单向协议,单项协议就是A项B认证,就是 A是生成者,B就是验证者,A就产生一个认证报文,包括当前的时间戳:验证方B的ID,然后再把这两个数据做一个签名运算得到一个签名sigA然后把它发送给验证方B嗯 ,B收到这样一个报文之后就去获取生成者他的公钥证书,然后用他的公钥证书当中公钥去验证这个签名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4pN6Do2L-1687881557460)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg)]

双向认证就是刚才 B验证完A的身份之后,A也要验证B的身份。就在刚才的单项认证基础之上,B再向A发送一个认证报文,包含B采集的时间戳以及验证方A的ID,然后再把这两个数据做一个签名运算,得到一个sigB然后发送给 AA同样用B的公钥去验证这个签名它是否是真实有效的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jX2Bo9BQ-1687881557462)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg)]

这里有一个问题,我们拿单项认证来说明,这个单项认证的报文当中,A向验证方B发送的报文是时间戳以及验证方的IDB。这里能不能把这个验证方的ID换成生成者A的ID?也就是A发送的报文是A的时间戳tA和A的ID,然后再来做相应的签名算,这个问题留给同学们下去思考。

刚才我们看到的是基于时间戳的这个协议,我们再来看基于一次性随机数的这个协议,首先还是看单项认证,要采用一次性随机数的话,首先就是验证方要向生成者发送一个随机数,首先B发送给A一个随机数RB,然后接下来A再向B发送一个认证报文,返回给B它产生的随机数RB以及验证方B它的ID,然后再把这个随机数和这个验证方它的ID一起做一个签名算。同样收到这个报文之后,用户B同样收到这个认证报文之后,验证方B用这个声称着他的公钥证书当中的公钥去验证生成者他产生的签名是否是正确的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KTkS0bOX-1687881557463)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg)]

双向认证就在单向认证的基础上面再增加一个B向A出示身份的这样一个过程。这个时候在第二步当中,A向B发送的报文当中,就要携带一个A产生的随机数RA,然后同时A把这个 RARB以及验证方B的这个 ID一起来做一个签名预算。验证方B收到这个报文之后,除了验证A的签名之外,它还要向A返回一个消息以验证他的身份。返回的消息就是A发送的随机数,以及A作为验证方它的ID,然后 B占用他自己的私钥,对这两个数据做一个签名算,发送给验证方A同样用B的公钥去验证B产生的签名,从而验证这个 B的身份是否是真实的。

接下来我们再来简单的介绍一下零知识身份证明,只介绍一下零知识身份证明他的一个思想,具体的协议我们就不再详细介绍了。之前介绍的身份认证通常要求生成者出示他的口令或者身份信息,而零知识证明是信息的拥有者,不泄露任何的信息向验证者证明他拥有该信息。为了说明零知识身份证明的思想,来看下面这个洞穴的例子。如下图所示有一个洞穴,在洞穴的底部c和d之间有一道密门,这个密门需要特殊的咒语才能打开。如何向VictoR证明他知道这个咒语,P可以走到这个洞穴的里面,然后让VictoR守在洞穴的门口。VictoR让P从左边出,它就从左边出,让P从右边出,他就从右边出。多次的反复之后,就可以向VictoR证明他是知道咒语的,因为它从左边出从右边出,它可以打开这个密门,由于这个 vectoR它离这个密门是比较远的,所以P在使用咒语的时候, VictoR是没有办法听到的,从而实现了对咒语的保密。