身份认证(Authentication)的定义:
宣称者向验证方出示证据,证明其身份的交互过程 至少涉及两个参与者,是一种协议 分为双向认证和单向认证
身份认证并不是一种静态的加密,而是一个协议过程
区分两个概念
身份认证和报文鉴别
区别:
①报文鉴别是静态附加在报文之上;身份认证是动态的协议交互的过程;报文鉴别可以作为基本方法,用于设计身份认证协议
②身份认证一般和时间相关,具有实时性;
-Message authentication has no timeliness
-Entity authentication happens in real time
重大区别就是: 要保证用于身份认证的报文的鲜活性
最早是由毛文波提出的,鲜活性在身份认证里指用于身份认证的凭证每次都不一样;
对身份认证最大的威胁是重放攻击(Replay Attack)
理解身份认证讨论的问题本质
报文鉴别是要对报文加密;
我们在讨论身份认证协议时总是假设底层的密码算法是安全的,研究身份认证协议时是在挑协议的漏洞,也就是说在协议交互过程中替换一个报文,或者删除一个报文,或者增加一条报文,然后看看是否造成协议出错,针对身份认证最大攻击就是重放攻击。
身份认证基本方法(基于一个凭证)
宣称者所知道的(秘密)-passwords、PINs、keys…
宣称者拥有的(设备或信物)-cards、handhelds…
宣称者继承的生物特征(每个人独有的)-biometrics
PINs与Keys的关系
用短的PIN码锁住长的密钥Key,提供两级安全保护
基于口令的身份认证
基于口令身份认证的一般模式
基于口令认证的一般过程 分为两个阶段:
初始化阶段
①用户选择口令
②口令经哈希后把哈希值存储在口令文件里
身份认证阶段
①用户登录系统,输入口令
②系统同样方向计算哈希值,和之前存放在口令文件里的哈希值比较
基于口令的身份认证-弱的认证方法
口令在相当长一段时间内固定
明文存放或哈希之后存放
通过设置规则(如要求字母、数字、长度等),
避免设置弱口令
Salt(盐值)提高字典攻击的穷举空间
有大量的应用实例
- Unix口令
- 动态口令
对基于口令认证的攻击
重放攻击(因口令一般一段时间内固定)
穷举攻击 8个字符相当于40-50bits的穷举空间
字典攻击-数量化讨论
什么是口令字典?
典型的口令词典:
容易被采用作为口令的词条
– 人们的名字、宠物名字、生日或生日的组合、普通单词
穷举攻击和字典攻击哪个效率更高
在线字典攻击(本质就是挨个口令试)
在线字典攻击:攻击者从字典文件里的词条拿出来一个一个去匹配口令
怎么防御在线字典攻击?
①随机口令设置
②或者通过一些规则避免设置弱的口令,增加穷举者攻击空间的目的
离线字典攻击原理
建立离线字典文件 字典文件包含两列:
①口令
②口令对应的哈希值
口令列表,与攻击目标系统采用同样哈希算法,
计算生成口令的哈希值
获取password文件 password文件里的哈希值与字典文件里的哈希值进行比对
离线字典攻击原理小结(本质就是比较hash)
所谓离线字典攻击就是攻击者前提能拿到口令文件,倒算哈希值变成查表,查表这个运算对计算机来说处理速度非常快,这个攻击如果成功的话危害非常大,这意味着一旦口令文件丢失,所有用户的口令都发生了泄露; 如果没有离线字典文件的话,攻击者窃取了口令文件,它想从哈希值倒算口令它是做不到的,但有了离线字典文件后,针对口令文件攻击者直接查表,一旦哈希值匹配成功了,那么可以得到口令明文,甚至口令值不一定一样,但是哈希值相同,这个时候也等价于找到口令了,这就是离线字典攻击的原理
防范离线字典攻击的方法
防范离线字典攻击典型方法: 撒点盐的方法,通过撒点盐的方法来提高离线字典攻击的穷举空间
以UNIX口令系统为例—撒盐方法
UNIX标准口令Hash函数(使用改造的DES算法) 将DES改造成Hash函数,改造方法:
①明文全部变成常量,64bit0;
②Salt值从系统的时钟提取,取值范围[a-z,A-Z,0-9,./],对时钟做一个简单变换变成ASCII字符,这个时钟有效比特数量是12bit
③用对称密钥key对其进行加密,key包括两个部分:口令明文+Salt(12bit)
④迭代25次;修改DES扩展函数;
⑤加密完成之后,获得一个11个ASCII字符的密文输出作为哈希值,把哈希值存放到口令文件里password字段的后面一部分,前面两位放置Salt的两个字符[from Red Hat Linux 6.2]
基于口令的认证方式总结
一种弱的认证方法 窃取A的password,将在很长一段时间拥有A的权限,直到A发现
特别的,网络环境下远程认证 远程登录,password传递形式?加密还是明文
早期的互联网协议,telnet、http、ftp都是明文传递 网络环境下口令认证又会带来新的问题
可以通过设置一些规则避免简单的口令 一种普遍的身份认证方式 因为容易部署、易使用 如何管理passwords
基于口令的身份认证:动态口令
动态口令又叫One-time passwords(OTP)
解决的问题:基于口令的身份认证易受重放攻击,如何避免口令固定被重放?
需要事先共享口令序列,每次认证后更新,当前期待的口令与前一个的口令不一样 如何共享?
要解决这个问题最早的方案是Lamport动态口令方案
小结
总结lamport方案:就是利用哈希函数的单向性,首先用哈希算法生成一系列的口令共享串,然后把最后一个口令哈希值告诉B,攻击者即便得到之前的口令,想知道下一次口令不可行,因为哈希函数的单向性不可行 这个方案比较简单后面有些系统基于Lamport方案的,但是没有大规模使用
动态口令的安全性分析
安全性: 不能防御预先播放攻击(pre-play attack)
在口令更新的时间窗口(常见1分钟、30秒)还是可以遭受重放攻击
缺点 使用500-1000次需要reinitialization 开销不小 不支持双向认证,无法确认口令提交给了合法的Bob Server
身份认证协议的分类
弱的身份认证 基于口令、PIN码等
动态口令(one time passwords)半强的
强的(基于密码技术的)身份认证 质询与应答技术
基于可信第三方的身份认证(不但实现身份认证、还解决密钥分发问题)
Needham-Schroeder协议
Kerberos协议
身份认证协议的第二类
强的(基于密码技术的)身份认证
质询与应答认证技术
对称密钥实现质询与应答
公开密钥实现质询与应答
质询与应答(Challenge-Response)的基本逻辑
设B要完成对A的身份认证
身份认证基于A所知道的某个秘密(例如密钥) 首先B发给A一个随机数(Challenge) A收到这个随机数后,对它做某种变换,得到Response报文,并发送回去 Response同时依赖于随机数和A所知道的这个秘密 B收到Response,可以验证A是知道这个秘密的
在有的协议中,这个Challenge也称为Nonce(Number used ONCE)
质询与应答** 可能明文传输也可能密文传输** A生成Response报文的典型变换有: A用密钥加密,说明A知道这个密钥 有时会对Challenge简单运算,比如增一,再做加密处理
质询与应答的意义在哪里? 是构造更复杂的交互式认证协议的基本组件
质询与应答的实现方式
使用对称密钥秘密体制
①对称密钥加密
②报文鉴别码
使用公开密钥密码体制
①数字签名
Needham-Schroeder协议