消息鉴别/认证(message authentication)
消息认证是一种允许通信者验证所收消息是否可信的措施。当消息、文件、文档或其他数据集合是真实的,且来自合法信源,就称其为可信的。
包括两个方面:
- 验证消息内容是否被篡改
- 验证信源是否可信
* 还可能希望验证消息的时效性(时间戳)及实体间消息流的相对顺序(***)
上述都属于数据完整性范畴
-
消息鉴别机制: 一般情况下
- 对称加密的鉴别 ---------------> (有**,需解密)
- 消息鉴别码MAC ---------------> (有**,不解密)
- 散列函数 ---------------> (无**,不解密)
- 数字签名机制 ---------------> (有密/私钥,需验证)
- 无条件安全鉴别码
消息鉴别机制——对称加密的鉴别
在加密的基础上能实现简单的消息鉴别
- 一定程度上验证了消息源:发送和接收方共享一个**,只有真正的发送者才能够成功为对方加密
- 一定程度上验证完整性:解密后的消息里带有错误检测码和序列,可被接收者用于确认消息是否被篡改过,***是否正常(在ECB模式下分组重排仍是威胁)
消息鉴别机制——消息鉴别码MAC
- 消息的发送者所做的:
①对要发送的消息,使用一个收发双方共享的**和一定算法产生一个短小定长的数据分组,称认证码
MAC = F(KAB,M)
M是可变长的报文, KAB是共享**,MAC是定长的认证码
②将认证码与消息明文(不关注消息是否保密)一起发送出去。
- 消息的接收方所做的:
①对收到的明文消息用同样的**和算法计算得MAC’;
②验证MAC’与收到的MAC是否相同;
验证了完整性:明文被篡改为M’,攻击者要计算一个新认证码F(KAB,M’)才能通过认证,但显然,没有**KAB攻击者无法得出认证码。所以只有完整的消息才能被验证MAC是匹配的。
验证了消息源:正确的MAC是利用**生成的。所以如果MAC匹配,意味着发送方是具有**的合法发送者;
* 若消息中包含***,接收者还可以确认消息的正确顺序
Mac的生成方法:
- 许多算法可用于MAC生成,FIPS PUB 113就推荐使用DES,选择密文的最后几个比特用作MAC。
- 生成MAC的过程虽然类似加密,但算法是不需要可逆的,所以许多认证函数由于设计的数学特性,相比加密更不容易被攻破。
消息鉴别机制——单向散列函数
- 单向散列函数是消息认证码的一种变形
MAC = E(K,H(M))
- 散列函数也可将任意长度的明文消息作为输入,生成定长的唯一的消息摘要。与MAC不同是消息摘要的生成不需要**。
- 利用单向散列函数进行消息认证,消息摘要须以可信形式传送,所以实际上仍会用到加密,只是加密的对象不是整个消息而是消息摘要,计算量很少。
- 基于软硬件实现速度、成本、专利等方面的考虑,人们很希望有“利用散列函数但不使用加密”的消息认证技术——带**散列MAC。
MAC = H(K,M)
对单向散列函数的要求:
- 对任意长度的数据分组产生固定长度的输出。(压缩)
- 函数是可公开的,其安全性来源于它的计算单向性。给定M,计算h=H(M)简单,但给定h,H,无法恢复出原始输入的内容M。(单向)
- 安全散列函数应该是无碰撞的。
-
- 弱抗碰撞:给定消息M,找不到M’,使H(M)=H(M’)
- 强抗碰撞:构造任意的一对数据M,M’,使H(M)=H(M’) 的计算不可行
关于碰撞——生日攻击:
这个术语来自于所谓的生日问题,在一个教室中最少应有多少学生才使得至少有两个学生的生日在同一天的概率不小于1/2?
这个问题的答案为23。 于是有一个神奇的结论:如果一个房间里有23个人,那么其中两个人生日相同的概率超过50%,当人数上升到40人时,这一概率提高到了89%以上。注意生日相同指的是两个人的出生月份和日期相同,不考虑年份。事实上你可以通过概率知识验证这个结论。
生日攻击隐含着消息摘要的长度的一个下界。一个40比特长的消息摘要是很不安全的,因为仅仅用220(大约一百万)次随机Hash可至少以1/2的概率找到一个碰撞。为了抵抗生日攻击,通常建议消息摘要的长度至少应取为128比特,此时生日攻击需要约264次Hash。安全的Hash标准的输出长度选为160比特是出于这种考虑。
典型散列算法
- MD5
- SHA-1、SHA-2
消息鉴别机制——数字签名
数字签名是对文件传统签名的数字化,在保护通信双方免受第三方攻击基础上,进一步防止通信双方的相互攻击(信源方否认,信宿方伪造)。
实际上更是MAC、散列函数鉴别机制在公钥体制下的一种普遍应用。
数字签名基本要求:
①能与所签文件“绑定”(由消息生成摘要)
②签名者不能否认自己的签名(**或私钥代表了签名者)
③签名不能被伪造(**或私钥别人一般无法获得或破译)
④容易被验证
- 实际上就是典型的带加密的散列函数消息认证,为了防止抵赖,往往需要第三方参与
数字签名的实现方法:
- 直接的数字签名
-
- 存在的问题:发送方声称**或私钥丢失过而否认签名。
- 需要仲裁的数字签名
-
- 该种算法下,A向B签名信息时,要先发给仲裁者Y
- Y对消息及其签名进行一系列验证后,Y附上时间等信息,并Y签名发送信息给B
(1)对称密码体制下:使用对称加密和第三方实现数字签名
C是可信第三方,A、B相信其不会伪造签名;A、B有保管好自己**的义务并承担责任,不能以丢失过为借口抵赖。
B无法伪造消息M的签名;A不能抵赖它签署过M。
(2)公开**体制下:用公钥加密算法与单向散列函数的结合进行数字签名
- ◆ A用私钥签名的信息只能由其公钥解密,公钥可以由权威机构证实,A无法抵赖。
- ◆别人没有A的私钥,无法伪造。 同样的A有保管好私钥的义务,一旦丢失要及时去权威机构申请撤销该公钥并申请新的**对。
注意签名是为了认证,而不是为了保密信息内容,所以明文可以直接发送。
数字签名技术还有很多延伸,如用于多人同时签名和投票的多重签名、盲签名等。
身份认证:
在大多数计算机安全语境中,用户认证在安全防范体系中是最基本的组成部分,也是防范入侵的主要防线。是大多数访问控制策略及追究用户责任的基础。
是验证实体是所声称的身份的过程。
An authentication process consists of two steps:
-
- Identification step识别步骤:提供一个身份标识;
- Verification step验证步骤:提供或产生认证信息,证实实体与标识符间的绑定关系。
-
- 身份识别是用户向系统声称其身份的方法。
- 用户认证则是建立该声称有效性的方法。
用于用户身份认证的方法一般有四种:
- 用户所知道的信息:如常用的口令、**、用户标识码PIN等;
- 用户所拥有的物品:如身份证、存有**的智能卡,物理钥匙等,常被称为令牌;
- 用户的生理特征(静态生物特征):如指纹、DNA、虹膜、人脸等。
- 用户的行为特征(动态生物特征):如语言模式、笔迹特征、打字节奏等。
基于口令的身份识别技术
- 对登录到系统的用户ID进行认证,以决定用户是否被授权,以及被授予的访问权限等。
- 基于口令认证的系统都会维护一个以用户ID为索引的口令文件。口令文件安全广泛使用了散列函数和salt“盐值”(所有UNIX变体都使用了这种策略)。
UNIX口令的安全
- 用户选择一串可打印字符做口令,该口令被转换为一个n位的值(用7位ASCII编码),通过散列函数得口令散列值存入口令文件——不存放口令明文。
- 为了使算法具有更强的安全性,引入一个固定长度的随机数(salt value)实现。口令和盐值共同作为输入,最终生成一个定长的散列码。
-
salt的作用
-
- 两个不同用户即使用相同口令,由于salt不一样,其散列值不一样;
- 增加了攻击者利用口令文件副本离线字典攻击的难度;
- 很难发现一个用户在不同的系统是否使用了相同的口令;
-
口令文件的保存
-
- 安全起见,通常散列码是单独保存为影子口令文件shadow password file,并要防止非授权访问该文件。
- 字典攻击的蛮力**方法往往是结合了一些口令猜测的,往往用户设置的简单口令是最容易突破的缺口。所以要加强口令选择的安全性。
在网络通信应用中,往往需要通信各方互相认证各自的身份,然后交换会话**。双边认证协议很常用。
①典型的基于对称密码的双向鉴别协议
Needham-Schroeder协议利用可信第三方——**分发中心KDC,采用询问/应答的方式使通信双方A、B互相识别对方的身份:
本协议并不完善,只是A单方面认证KDC。 KA和回送的IDB、RA是A认证KDC及消息完整性的关键。
- Needham-Schroeder协议的主要漏洞
-
- 利用A和B以前使用过的旧会话**Ks和第3步消息的重放,可以实现冒充。
-
- C使得B相信正在与自己通信的是A。
- Denning结合时间戳的方法,对Needham-Schroeder协议进行了改进:
②采用公钥密码的身份识别的例子——Woo-Lam协议
KDC的私钥:EKRauth
B的公钥:EKUB
- 第(1)步,A发送自己和B的身份信息给KDC,向KDC请求B的公钥;
- 第(2)步,KDC向A发送用自己私钥对B的公钥签名,A用已知的KDC的公钥验证后可得B的公钥;
- 第(3)步,A向B发送用B的公钥加密的自己的身份信息和一个随机数;
- 第(4)步,B向KDC请求A的公钥,并发送用KDC的公钥加密的随机数;
- 第(5)步,B得到A的公钥,以及KDC对随机数、**、A和B身份信息的签名;
- 第(6)步,B将上一步得到的签名和随机数发给A, A在其中找到自己的随机数,确信该消息不是重放;
- 第(7)步,A用上一步从KDC的签名中得到的**加密随机数,并发送给B;B收到后,解密并验证随机数,确信消息不是重放。
- 网络应用环境下往往有大量的客户服务器模式的应用,如何使他们相互认证身份?
- 已有被广泛使用并成为标准的基于网络的认证服务:
-
- Kerberos 基于对称密码体制
- X.509 基于公钥密码体制
* 无条件安全鉴别码
- 前面介绍的消息鉴别在基于计算复杂性的假设下是安全的,即它的安全是建立在攻击者计算能力有限的假设基础之上。
- 无条件安全鉴别码:与计算无关,不基于任何假设,考虑概率意义下的安全性。即使攻击者拥有无限的计算能力,他也无法百分之百做到假冒和篡改。
- 在无条件安全鉴别码方案中,收发双方制定编码方案后,秘密约定一个编码规则。对于攻击者来说,即使他知道通信双方使用的编码方案,也无法做到百分之百攻击成功。这是由于原发方用于发送的信息序列在编码方案中是均匀分布的,所以在攻击者看来总是随机的,使得他无法确定用于攻击的信息序列。下面用一个简单的例子来说明。
实例:
- 设要发送消息1011。
- 编码方案如下表,有四个不同编码规则为R0、R1、R2、R3。
- 双方约定选择R0规则,消息发送时变成4个消息序列10 00 10 10依次发送。
- R0规则之外的消息序列不会出现,若接收方发现选定规则之外的消息序列,则可以认为消息被别人修改过。
|
|
00 |
01 |
10 |
11 |
|
R0 |
0 |
|
1 |
|
|
R1 |
0 |
|
|
1 |
|
R2 |
|
0 |
1 |
|
|
R3 |
|
0 |
|
1 |
- 考虑假冒攻击的情形
假如攻击者想假冒发方A,发送消息0给B。按照编码方案,他可以选择信息序列00或01来发送,00序列只在编码规则R0,R1下存在,01序列只在编码规则R2,R3下存在,由于他不知道双方约定的编码规则,无论他选择哪一个,假冒成功的概率只有50%。
- 考虑篡改攻击的情形
当双方约定的编码规则为R0时,A想发消息1给B,用于发送的消息序列为10;攻击者从10序列可以判断出A和B约定的编码规则为R0或R2,他对原始消息进行篡改,将消息1改为消息0时,同时需要对传输的信息序列修改,但是,将信息序列改为00或01中哪一个呢?他无法用计算来确定,只好随机的选一个,因此篡改成功的概率也只有50%。
所以,在无条件安全鉴别码方案下,无论攻击者拥有多强的计算能力,攻击成功的概率均达不到百分之百。