身份认证是信息安全学科最基础的课题,却也是软考命题人在选择题里反复设伏的地方。信息安全工程师、电子商务设计师、系统规划与管理师、网络工程师等科目几乎年年都会在身份认证上出一道看似简单、实则暗藏辨析的题目。很多考生背下了"你知道什么、你拥有什么、你是谁"这三句话,却说不清为什么银行卡加密码是双因素而不是多因素,也讲不明白动态口令凭什么能抵抗重放攻击。本文把身份认证的定义、底层原理、分类边界、命题陷阱和真题考法一次性拆解清楚,读完就能把这一类的分数稳稳拿到手。
身份认证的英文是 Authentication,在国家标准与国际标准的语境下,它的精确定义是"验证实体所声称的身份与其已登记身份之间的一致性的过程"。这句话包含两个关键词,一个是"声称",一个是"已登记"。所谓声称,指的是主体主动向系统声明"我是谁",最常见的做法是输入用户名、工号、账号或者刷卡。所谓已登记,指的是系统在注册阶段就已经保存了该主体的身份信息与凭证模板。认证的本质,就是把"这一次声称"与"当初登记"做一次匹配校验,匹配成功则放行,匹配失败则拒绝。
这里必须把身份认证和它的两个近亲概念区分清楚,这是软考选择题最爱考的一组概念辨析。第一个是身份标识,英文叫 Identification,它回答的是"你是谁"这个问题,主体声明自己的身份,例如输入账号名,这一步只是声明,并不做任何证明。第二个才是身份认证,它回答的是"你如何证明你是你",主体必须提交凭证,例如输入密码、插入令牌、按指纹,系统验证凭证与身份是否匹配。第三个是授权,英文叫 Authorization,它在认证成功之后才发生,回答的是"你能做什么",例如登录系统之后能读哪些文件、能执行哪些操作。第四个是审计,英文叫 Auditing 或 Accounting,它回答的是"你做了什么",记录主体的操作轨迹以便事后追责。这四个概念构成一个完整的链:先标识、再认证、后授权、终审计,缺一不可,顺序也不能颠倒。
值得强调的是,很多初学者会把标识和认证混为一谈,以为输入了账号名就算是完成了认证,这是根本性的误解。输入账号名只是声明了一个身份,系统此时根本不知道你是不是冒充的,只有等到你提交了正确的凭证并通过校验之后,认证才算完成。软考命题人正是抓住这个认知盲区,常常设计"输入用户名属于认证"这样的错误选项来干扰考生。
身份认证的依据,或者说认证所依赖的要素,可以归纳为三大类,这正是教材里反复出现的"三大要素"。第一类是你所知道的东西,英文记为 something you know,典型代表是静态口令、个人识别码 PIN、安全问题答案。这类要素的优点是实现简单、成本极低,缺点是一旦泄露就失去意义,而且容易被猜测、被字典攻击、被肩窥。第二类是你所拥有的东西,英文记为 something you have,典型代表是智能卡、USB Key、动态令牌、手机设备、门禁卡。这类要素的优点是物理实体难以被远程复制,缺点是可能遗失、被盗、被克隆。第三类是你本身固有的东西,英文记为 something you are,典型代表是指纹、虹膜、人脸、声纹、掌纹、静脉等生物特征,有时也把行为特征如签名笔迹、击键节奏归入这一类,记为 something you do。这三类要素各自独立,认证的强度就来源于它们之间的组合,而软考的考查重点恰恰落在"如何区分单因素、双因素、多因素"这一组合规则上。
静态口令是最古老也最常见的认证方式,它的底层机制远比大多数人想象的要严谨。用户注册时设置一个口令,系统并不会把口令明文直接存入数据库,而是先经过一个单向散列函数处理,把口令变换成一串定长的散列值,再把散列值存起来。之所以不用明文存储,是因为数据库一旦泄露,明文口令会直接暴露,攻击者可以拿这串口令去撞其他的网站;而散列值即使泄露,攻击者也难以从散列值反推出原始口令。这里的关键词是"单向",散列函数可以从口令正向算出散列值,却无法从散列值逆向还原出原始口令。用户下次登录时,系统把这次输入的口令再用同一个散列函数算一遍,与数据库中存储的散列值比对,一致则通过。为了对抗彩虹表这种预先计算好的散列反查表,工程上还会在散列之前给口令拼接一段随机数,这段随机数叫盐值,每个用户各不相同,这样即使两个用户设置了完全相同的口令,散列结果也完全不同。更进一步的工程实践是使用慢散列函数,比如 bcrypt、scrypt、PBKDF2,它们故意把散列运算做得慢,让暴力穷举的口令尝试在单位时间内能完成的次数大幅下降。
理解了这套机制,就理解了静态口令的软肋所在。因为口令本身是"你知道的东西",它不依赖任何硬件,所以它的安全性完全建立在"只有你知道"这一前提之上。一旦这个前提被破坏,比如口令被偷看、被社会工程学套取、被键盘记录器截获、被撞库攻击批量比对,认证就形同虚设。重放攻击更是静态口令的致命伤:攻击者只需要在网络链路上截获一次登录报文,之后原封不动地把这串报文重新发出去,系统就会误以为合法用户再次登录。动态口令正是为了解决重放和猜测这两个核心弱点而诞生的。
动态口令的英文全称是 One-Time Password,简称 OTP,意思是一次一密。它的核心思想是:每一次认证使用的口令都不同,用过一次即作废,因此即使攻击者截获了这一次的口令,也无法用它进行下一次认证,重放攻击自然失效。动态口令的生成有三种主流的同步机制。
第一种是基于时间同步的动态口令,典型标准是 TOTP。用户和服务器共享一个种子密钥,认证时双方以当前的时间戳作为输入,通过哈希消息认证码算法把种子密钥和时间值一起运算,得到一个定长的输出,再从这个输出里按规则截取若干位,得到六位或八位数字口令。因为双方都拥有种子密钥,又都参考同一个时间源,所以算出来的口令一致,就能通过验证。时间同步方案要求客户端与服务器的时钟尽量一致,通常会允许一个时间窗的偏差,比如前后各一个步长,以容忍网络延迟。
第二种是基于事件同步的动态口令,典型标准是 HOTP。它不用时间,而是用一个计数器。每成功认证一次,计数器的值就加一,双方始终根据当前计数器的值计算口令。这种方案的优点是不依赖时钟,缺点是如果用户按了很多次令牌却没完成认证,计数器的值就会错位,需要重新同步。
第三种是挑战应答方式的动态口令。服务器先发送一个随机数作为挑战,客户端把这个挑战和共享密钥一起运算,得到一个应答值返回服务器,服务器用同样的算法验证。因为每次挑战都是随机的,所以应答值每次也不同,天然具有防重放能力。
这三种机制共同的技术底座都是共享密钥加上单向运算,攻击者即使窃听到完整的一次交互,也无法推导出种子密钥,更无法预测下一次的口令。
除了这三种同步机制,动态口令在工程实现上还有一个重要的细节值得注意,那就是口令的有效期与使用次数限制。时间同步的动态口令通常只在几十秒内有效,超时即作废;事件同步的动态口令则是一次使用即作废。这样的设计意味着攻击者即使侥幸截获了一个动态口令,也必须在这个极短的时间窗口内完成重放,而现实中的攻击者几乎不可能在口令失效前完成伪造登录,这正是动态口令相对于静态口令在防重放能力上质的飞跃。软考对动态口令的考查,往往集中在"它靠什么防重放""它和静态口令的本质区别是什么"这两个点上,理解了时间同步、事件同步、挑战应答三者的区别,这类题就迎刃而解。
生物特征认证依赖的是"你是谁",它的底层流程是:在注册阶段采集用户的生物特征样本,从样本中提取出稳定的特征点,编码成模板存入数据库;在认证阶段重新采集样本、提取特征,与存储的模板做相似度比对,当相似度超过预设阈值时判定为同一人,否则拒绝。指纹认证提取的是纹路的端点、分叉点,虹膜认证提取的是虹膜的纹理模式,人脸认证提取的是面部关键点之间的距离与角度关系。
生物特征认证有两个必须掌握的核心指标。一个是误识率,英文叫 FAR 或 FMR,它指的是把不该通过的人错误放行了的概率,即"假匹配率"。另一个是误拒率,英文叫 FRR 或 FNMR,它指的是把本该通过的人错误拒绝了的概率,即"假不匹配率"。这两个指标是一对矛盾体,共同受相似度阈值控制:阈值调得松,误识率升高而误拒率下降;阈值调得紧,误拒率升高而误识率下降。安全要求高的场景会优先压低误识率,用户体验要求高的场景会优先压低误拒率,工程上通过调节阈值在两者之间取平衡。软考选择题经常拿这两个指标做文章,让考生判断"误识率是错误接受还是错误拒绝",这是高频易错点。
生物特征认证还有一个不可忽视的本质缺陷:特征一旦泄露就无法撤销。口令泄露了可以改,令牌丢了可以挂失换新,但指纹、虹膜是不可更换的,一旦模板数据库被攻破,用户的生物特征就永久暴露。因此正规系统通常只存储特征模板的摘要而非原始图像,并且生物特征往往与口令、令牌组合使用,很少单
本篇完!