提示:博文有点长,请保持耐心哦~
前一篇文章:
后一篇文章:
数字签名+密钥管理分发+用户认证
0.写在前面
最近因为学习的需要初步接触网络安全方向,阅读的书是William Stalling著的《密码编码学与网络安全(第六版)》。由于本科期间没有接触过网络方面的课程所以从密码学入门。做个学习笔记方便后期复习,同时也分享给大家。由于本人能力有限肯定会有总结和理解不到位的地方,甚至有的地方会有错误(当然目前我没发现…)我若日后发现也会即使更新修改,所以希望各位辩证的学习,不要尽信书。阅读的书封面如图所示。
1.涉及的抽代基础内容
-
互素:两个数a,b最大公因数为1。例:1与6互质,5与6互质
-
欧拉函数与欧拉定理
欧拉函数: φ (n)是指小于n且与n互素的正整数个数,例:φ (6)=2
欧拉定理: 任何互素的a,n,均有:aφ(n) mod n = 1 mod n
其中φ (n)是指小于n且与n互素的正整数个数,例:φ (6)=2
容易发现:当p为素数时,φ §=p-1
一般的,将φ(n)=m,得到欧拉定理更一般的表示:am mod n = 1 mod n
既,至少有一个整数m满足上式,满足上式的最小正幂m为:
- a(模n)的阶: 若a,n是互素的整数,a≠0,n>0,s使得ax=1(mod n)成立的最小正整数x,称为a模n的阶
- a所属的模n的指数
- a所产生的周期长
周期长:
例: a=11, n=19时:
111mod 19 = 11
112mod 19 = 6 * 19+ 7 = 7
113mod 19 = 70 * 19+ 1 = 1
114mod 19 = 770 * 19+ 11 = 11
115mod 19 = 8476 * 19+ 7 = 7
指数相差3模n后余数相同–>余数是周期性的,周期长是使得11m mod 19 = 1 mod 19 成立的最小正幂m, 若底为a,其mod n 的周期长为φ(n),则将a称为n的一个原根。
- 原根
如果一个数a模n的阶为φ(n),则称a为n的原根。
原根的一个重要性质: a,a2 a3,…,af(n) mod n ,余数各不相同。特别的,当n是素数时,若a是n的原根,那么a,a2 a3,…,an-1 mod n,的余数是1~n-1的一个排列
- 离散对数
由原根的性质可知,关于整数b,一定有一些数r使得 b与r 模n同余(b mod n = r mod n),其中有一些r满足[0,n-1]
同理可得,有唯一的指数i,使得b mod n = ai mod n,其中0 ≤ i ≤ n-1
将指数i称为以a为底,b的离散对数
给定g,x,p,求y最坏情况下经过X次乘法计算,且存在计算y的有效算法
反之,给定y,g,p求离散对数非常困难,与RSA中因子分解素数之积的难度具有相同数量级。
难度阶约为:
广义的离散对数问题目前已知的最佳算法: Pollard’s rho algorithm for logarithms
时间复杂度是O(p1/2),p为群的大小
在密码学范畴中O(2n/2)
直接穷举:O(2n)===> 10300 ===> 宇宙中原子总数:1078-1082
基于ECC的离散对数问题相较于基于指数模的离散对数问题难度更大。
安全性:
DH 1024bit ECC 192bit
DH 2048bit ECC 224bit
DH 3076bit ECC 256bit
2.数字签名
2.1 数字签名基本概念
消息认证码不能解决的问题:发送方否认、接收方否认
消息认证可以处理信息交换双方受第三方篡改,但是它不能处理通信双方自身发生的攻击
接收方否认 例:电子转账中转账金额篡改
发送方否认 例:股票交易中,交易否认
数字签名必须具有以下基本特征:
- 能验证签名者、签名的日期和时间
- 能认证被签的消息内容
- 消息能由第三方裁定,以解决争执
数字签名的攻击类型
- 唯密钥攻击:攻击者仅仅掌握目标系统的公钥
- 已知消息攻击:攻击者掌握一些消息以及对应的合法签名
- 一般选择消息攻击:无需知道目标系统公钥,攻击者选择一些消息,然后攻击者根据选择的消息从目标系统中获取合法签名
- 定向选择消息攻击:与一般选择消息攻击攻击类似,但是选消息的时间是在掌握系统公钥后,签名生成之前
- 适应性选择消息攻击:允许攻击者对目标系统轮询。目标系统可以被要求对特定的消息签名,这些签名与攻击者之前获得的<消息-签名>对相关。
成功的攻击签名方案:攻击者能有一定概率完成如下攻击:
- 完全破译:攻击者判断出目标系统的私钥
- 通用伪造:攻击者掌握一个有效的签名算法,使得任一消息都能够等价地构造出合法签名。
- 选择伪造:攻击者对于所选的特定消息能够伪造出合法签名。
- 存在性伪造:攻击者至少可以伪造出一个消息的合法签名,但攻击者不能控制该消息的选择,该攻击危害最低。
数字签名的需求(应该满足的条件):
-
签名是与消息相关的二进制位串
-
具有发送方独有的信息,防止发送方否认与伪造
-
产生数字签名容易
-
识别和验证签名容易
-
伪造数字签名在计算上不可行。无论是已知消息伪造签名还是已知签名伪造消息,双向在计算上均不可行
-
保存数字签名的副本可行
数字签名的一般模型:
数字签名的简单描述:
2.2 两个经典的数字签名方案
1. ElGamal数字签名方案
数学基础:有限域上离散对数问题的难解性
ElGamal数字签名方案:私钥加密,公钥解密
ElGamal数字签名方案的基本算术是素数q和a,a是q的原根
ElGamal算法下数字签名生成
- 用户A产生公钥/私钥对
用户A产生公钥/私钥对的步骤:
- 生成随机整数XA,使得1<XA<q-1
- 计算YA= aXA mod q
- A的私钥是XA;A的公钥是{q,a,YA}
-
计算消息M的Hash值。对消息M进行签名之前,首先需要计算消息M的Hash值m=H(M),m∈[0.q-1]。
-
A产生数字签名
用户A产生数字签名步骤:
- 选择与q-1互素的随机整数K。(1≤K≤q-1 and gcd(K,q-1)=1 )
- 计算S1 = aK mod q。
- 计算K-1 mod(q-1)(K mod q-1 的逆)
- 计算S2= K-1(m-XAS1)mod (q-1)
- 签名即为(S1,S2)
ElGamal算法下数字签名验证
- 计算V1 = am mod q。
- 计算V2 = (YA)S1(S1)S2 mod q。
当V1= V2时 签名合法。
安全性在于:
- 公钥无法推导出私钥
- 无法根据数字签名推导出随机整数K
私钥XA以及签名过程中随机整数K的求值均为求离散对数,较难破解,但是当掌握一定信息时,V1、V2均为幂函数求值,可以通过有效算法快速求出。
2. Schnorr数字签名方案
将生成签名所需的消息计算量最小化。生成签名的主要工作不依赖于消息,可以在处理器空闲时执行。
签名生成的过程与消息相关的部分需要2n位长度的整数与n位长度的整数相乘
基于素数模p,p-1包含大素数因子q
一般情况下取p是1024位整数,q为160位整数
Schnorr方案下数字签名的生成
生成公钥/私钥对,步骤如下:
- 确定素数p、q。q是p-1的素因子。
- 选整数a,构成全局公钥{a,p,q}。其中a满足aq= 1 mod p,用户组内的每个用户都可以取此值。
- 确定用户私钥s。随机整数s∈(0,q)。
- 确定用户公钥v。v=a-s mod p。
私钥为s、公钥为v的用户,产生数字签名过程:
- 选择随机整数r,r∈(0,q),并计算x= armod p。
- 将x附在消息后面一起计算Hash值e:e= H(M || x)
(签名之前可以生成x,这个x是关于随机数r的值,与消息M无关,可以在与消息绑定前进行提前处理)- 计算y=(r+se)mod q。数字签名为(e,y)对。
Schnorr方案下数字签名的验证
- 计算x’ = ayve mod p 。
- 验证是否有e=H(M || x’)
2.3 DSS中的三种数字签名方案
美国国家标准与技术研究所(NIST)发布的联邦信息处理标准FIPS 186,称为数字签名算法(DSA)
使用SHA
1. NIST DSA
DSA与RSA方法的比较
DAS方法与RSA方法比较:
数字签名算法DSA:
DSA的签名过程:
DSA签名的验证过程:
2.ECDSA
基于椭圆曲线密码的新数字签名方法
四个基本元素:
-
用于定义椭圆曲线以及基点的全局参数
-
生成公钥、私钥对。 签名者使用一个随机或者伪随机数作为私钥。用随机数和基点计算出另外一个解点作为公钥。
-
计算消息M的Hash值。使用私钥、Hash值、全局参数生成签名(r,s)
-
v=公钥+全局参数+s,若v=r则验证通过。
椭圆曲线:y2=x3+ax+b
ECDSA算法的签名验证:
3.RSA-PSS
- 这是一种基于RSA的数字签名方案
- RSA各类方案中最安全的一种
RSA-PSS数字签名算法的EM编码
使用一个或者多个消息拓展(填充),其目的是为了增大攻击者给定一个消息后找到另外一个消息,映射到相同的摘要;或者寻找两个消息映射到相同摘要的难度。
使用盐,是为了使得使用相同私钥对相同消息进行签名时,得到的结果不同。
将字节串EM作为无符号的非负二进制整数m,通过如下方式加密m获得签名s:
s=md mod n
然后将计算出的签名值转化为k字节的串S
RSA-PSS数字签名算法的EM验证
消息摘要m通过解密s得到:
m=se mod n
3. 密钥管理和分发
3.1 基于对称加密的对称密钥分发
密钥分发方案
密钥分发的几种方式:
-
A选定密钥后通过物理方式传递给B
-
C选定密钥后通过物理方式传递给A、B
-
A、B之间使用旧密钥加密新密钥传递
-
A、B到C有加密连接,通过C向A、B传递密钥
如果网络中的终端数量非常多,使用前两种方式进行密钥分发将非常困难N个终端需要分发(N*(N-1)/2)个密钥,若在应用层也需要加密传输,使用不同的密钥那么一个终端又要分发若干密钥,庞大的密钥分发和管理是个难题。
若选用第三种方式,如果一个密钥被破获,那么攻击者将获得接下来的所有密钥
第四种方案的变体:密钥分发中心(Key Distribution Center)
系统中每一个终端与KDC共用同一个密钥,将这个密钥称为主密钥
将端与端之间使用的由KDC分发的密钥称为会话密钥
密钥分发方案过程见下图:
层次密钥控制与密钥的生命周期
本地KDC — 全局KDC
会话密钥越频繁交换越安全,但是过于频繁的交换又会给网络增加负担。
-
面向连接的协议
在整个会话中使用同一个会话密钥,开启新的会话在创建新的会话密钥。若链接会话很长可以周期性的更换密钥 -
无连接的协议
例:面向事务的协议,没有明确的连接初始和终止,不知道多少时间更换一次密钥
-
每次都是使用新的会话密钥(耗费大)
-
特定时间间隔或者特定数量的事务分配不同的密钥
透明密钥控制方案与分布式密钥控制
对终端用户透明的方式,对网络或数据传输层提供端到端的加密
分布式密钥控制设置会话密钥流程:
分发中心必须可信而且防破坏,但分布式环境下无此要求
- A 向B发送会话密钥请求,其中包括临时交互号N1
- B用共享密钥加密信息并回给A(包含会话密钥,B的标识符、f(N1)临时交互号N2)
- A使用会话密钥加密信息f(N2)
3.2 基于非对称加密的对称密钥分发
- 简单密钥分配方案与存在的不足
简单密钥分配方案:PUa加密信息
不足:无法防御中间人攻击
-
保密与身份认证的密钥分发方案
-
混合方案
IBM大型机中使用的方案,KDC与每一个用户共享一个主密钥,主密钥加密用于分发会话密钥,公钥方案用于分发主密钥
- 公钥加密解密体系需要相对较高的计算负荷
- 可以用较小的代价覆盖已经存在的KDC模式
3.3 公钥分发
-
公钥的公开发布
最简单的:广播出去。缺点:不能防止C假冒,在被A发现之前,C可以假冒A,以为A的名义生成公、私钥对,获取原本要发给A的消息。 -
公开的可访问目录
将公钥通过安全的认证通信将公钥发布到受信任的目录上,任何人都可以查询访问。
不足:若攻击者获得管理员的私钥,攻击者可以冒充任何通信方,用以窃取本该发送给该通信方的消息。 -
公钥授权
进一步严格控制目录的公钥分配。
- A发送一条带时间戳请求给Admin,请求B的公钥
- Admin给A发送使用其私钥加密的消息,A使用管理员公钥进行解密,A可确定消息来自管理员。消息包括(B的公钥、原始请求、原时间戳)
- 使用B的公钥加密包含(A标识符+临时交互号N1)的消息给B。
- B使用相同方式获得A的公钥。
- B用A公钥加密(N1,N2)发给A,N1可使得A确信该消息来自B。
- A用B公钥加密N2,B可确信该消息来自A
用户需要周期性的请求公钥信息,以确保使用的是当前最新的公钥。
- 公钥证书
公钥授权已经很不错了,但是还是有一个明显的问题:十分依靠管理员,任何通信方需要向公钥管理员申请公钥。
公钥证书解决了上述问题,它的基本原理是用受信任的第三方认证机构给(公钥,公钥拥有者的标志)进行签名,形成公钥证书,用户就可以以证书的形式公开证书,任何需要公钥的用户可以通过证书后面附带的可信签名来验证证书的有效性。
证书应当具有以下几个要求:
- 任何人都可以读取证书并且确定证书拥有者姓名和公钥。
- 任何通信实体都可以验证证书出自证书管理员,而不是伪造的。
- 只有证书管理员可以制作和更新证书。
- 任何通信方可以验证证书的时效性。
3.4 X.509证书和PKI
- X.509是基于公钥密码体制和数字签名的服务。推介RSA,未指定Hash算法
- X.509证书包含该用户的公钥并由一个可信的签证机构用私钥签名,此外还定义了基于公钥证书的一个认证协议
- X.509是关于证书结构和认证协议的一个重要标准。X.509格式证书在S/MIME、IP安全性、SSL/TLS与SET中应用广泛。(十分重要)
X.509的格式:
X.509证书格式:
X.509的层次结构
获取不同CA颁发的证书:
PKI简介
PKI系统是由软硬件,人,策略和程序构成的一整套体系。这些程序用来创建管理存储,分发和撤销建立在非对称密码算法之上的数字证书。
创建PKI的主要目的就是用来安全、边界、高效地获得公钥。
Public Key Infrastructure X.509工作组在X.509的基础上建立了一个可以用来构建网络认证体系的基本模型:PKIX模型
公钥基础设施简介:
4.用户认证
4.1 远程用户认证原理
RFC 4949 定义用户认证:
-
鉴定阶段:给安全系统系统身份标志
-
核实阶段:提供或者产生可以证实实体和标志之间对应关系的认证信息
身份鉴定是指用户提供一个声明的身份给系统,用户认证是使得声明有效的一种方式。
认证一个用户身份大致有四个常用工具:
-
知道什么 :如口令、个人身份号(PIN)或者之前准备问题的答案
-
拥有什么 :如加密密钥、点至密钥卡、智能啦或者物理密钥。我们将此类认证信息称为令牌/
-
静态生物特征 :指纹、视网膜、面容
-
动态生物特征 :声音、手写特征等
4.1.1 双向认证
双向认证协议能过够使通信双方互相认证彼此身份并交换会话密钥。
关注两个问题: 保密性和时效性 保密性:阻止伪装以及会话密钥泄露;时效性:重放攻击的威胁使得保证时效性分非常重要。
防止重放攻击的方式:
-
序列号(不常用):要求每一方都跟踪与其交互的通信方最新的序列号,开销大,不适用于认证和密钥交换。
-
时间戳(不适用于面向连接的应用):基于时间戳的进程要求有足够大的时间窗口适应网络延迟,还要有足够小的时间来最小化攻击机会。
-
挑战/应答(不适用于无连接类型应用):无连接传输之前的握手开销 否定了无连接传输的优点
4.1.2 单向认证
邮件协议:要求协议能够认证邮件来自实际的发送者,同时协议无需对邮件明文部分进行解密。
4.2 基于对称加密的远程用户认证
4.2.1 双向认证
- Needham和Schroeder提出的基于KDC的密钥分配协议:
-
A->KDC:IDA || IDB || N1
-
KDC->A: E(KA,[ KS||IDB||N1||E(KB,[ KS||IDA ] )])
-
A->B:E(KB,[ KS||IDA ])
-
B->A:E(Ks,N2)
-
A->B:E(Ks,f(N2))
上述协议不能经受特定类型的重放攻击。
- Denning在以上基础上添加时间戳以保证协议免受特定形式的重放攻击:
-
A->KDC:IDA || IDB
-
KDC->A: E(KA,[ KS||IDB||N1||E(KB,[ KS||IDA||T] )])
-
A->B:E(KB,[ KS||IDA||T ])
-
B->A:E(Ks,N1)
-
A->B:E(Ks,f(N1))
时钟或者同步机制的破坏或则错误可能造成分布的时钟不同步,Denning协议可能会受到抑制重放攻击(Suppress Replay Attack)
4.2.2 Kerberos
工作站用户想通过网络对分布在网络中的各种服务提出请求;希望服务器能够对授权用户提供服务并鉴别请求服务的种类。
-
Kerberos提供一个集中的授权服务器来进行认证
-
Kerberos依赖于对称加密体制未使用公钥加密体制
-
版本4被广泛使用,版本5改进了版本4中的安全性,并成为Internet标准草案RFC 4120 RFC 4121
-
Kerberos协议的整体设计方案采用基于可信第三方的认证服务。客户与服务器信任Kerberos服务器来调和他们间相互认证。认证的安全性取决于Kerberos服务器的安全性
-
一个简单的会话认证
简单会话认证存在的问题:
-
若一个用户想同时访问若干应用服务器,每次访问用户需要重复输入口令,以获取新的票据。
-
包含对口令的明文传输,可能会被敌手窃取口令从而使用受害者的任何服务
- 一个更加安全的认证会话
改进:避免口令明文传输、票据授权服务区(TGS,Ticket Granting Server)
客户端申请一个服务器授权票据,将用户标志、服务标志、票据授权票据送往TGS。TGS对票据授权票据进行解密,通过标志验证票据正确性。若通过验证则向客户端发布相应服务授权票据。
客户端将包含用户标志和服务授权票据的消息送往服务器,通过票据内容认证用户的合法性。
上述的会话方式仍然存在问题:
-
票据授权票据的生命期或长或短都会有隐患------需求:证实票据使用者和票据所有者的一致性。
-
攻击者伪装成服务器从而窃取用户发往真正服务器的信息,并向服务器提供虚假服务-----需求:服务器向用户证实自己身份。
- Kerberos4认证
认证信息包含C的用户标志ID、网络地址和时间戳,此认证消息仅能使用一次且生命期极短
Kerberos概览:
Kerberos域
Kerberos version 5
version 4的不足:环境缺陷和技术不足
环境缺陷:
技术不足:
前一篇文章:
后一篇文章: