Protecting Poorly Chosen Secrets from Guessing Attacks
作者:Li Gong, T.Mark, A.Lomas, Roger M.Needham, Jerome H.Saltzer
发表:IEEE Journal on Selected Areas in Communications, June 1993
一、猜测攻击
(一)UNIX口令系统
UNIX使用的是一个口令文件 /etc/passwd。这个文件对于每一个用户的口令p进行hash,每个口令进行hash时都有一个盐值s,盐值s和hash值g(p, s)都被存在口令文件中。
攻击者可以猜测p的值然后进行hash,对于hash值进行验证来判断p的猜测是否正确。
一种解决办法是限制/etc/passwd文件的访问权限。
(二)SunOS安全NFS
去掉了/etc/passwd,转而使用公钥系统去加强安全性。SunOS-4.0引入了文件/etc/publickey,其中包括用户网络名称、用户的公钥和对应的私钥(私钥是用DES加密过的,其中DES的密钥是由用户的口令派生出的)。用户登录时即可通过口令解密私钥,然后服务器验证私钥与公钥是否匹配即可验证口令的正确性。
因为/etc/publickey是公开的,攻击者依旧可以猜测口令p,然后解密私钥。再随意选取一段文本,利用已知的公钥和猜测出的私钥进行加密解密,观察结果是否一致即可验证p猜测的正确性。
一种解决方法是限制/etc/publickey的访问权限。
(三)Kerberos认证系统
服务器最开始给用户返回的响应中包括一些可识别的信息比如说时间戳t和服务器S,而且这个响应是由用户的口令加密得到的。
所以攻击者可以对于截获的消息 { t , S , . . . } p \{t, S,...\}_p {t,S,...}p进行猜测攻击,解密后的数据可以通过对比,很明显地发现t是否是一个合理的时间或者S是否为合理的服务器名字符串,即可判断解密是否正确。
二、已知明文和验证文本
通过上面猜测攻击章节的阅读,大家可能已经总结出其中的特点。攻击者在发动猜测攻击时,往往需要一些验证性的信息来判断其猜测是否正确。
已知明文攻击对于对称密码系统来说,可以通过猜测密钥对已知的密文进行解密,然后判断其对应的明文是否一致,从而进行攻击;对于非对称密码系统来说,猜测私钥是不现实的,所以可以猜测明文文本信息,然后利用公钥进行加密,来比对对应的密文是否一致,从而验证猜测是否正确。
由上可知,已知明文攻击主要就是利用了具有验证性的文本来对其猜测攻击进行验证。
验证文本具有以下特点:
- 攻击者可以识别,能够利用其验证
- 攻击者能够进行某种运算,比如说hash运算。来进行得到与验证文本进行比对的文本。
三、基本的保护技术
(一)基本二路握手
A用密钥k加密随机数n发送给B
A → B : { n } k A\to B:\ \{n\}_k A→B: {n}k
f()用来确保不是简单地将原消息返回
B → A : { f ( n ) } k B\to A:\ \{f(n)\}_k B→A: {f(n)}k
注:n是随机数,所以 { n } k \{n\}_k {n}k和 { f ( n ) } k \{f(n)\}_k {f(n)}k是各自安全的,但是如果被放在一起,则可以用f()验证,反而不安全了。
(二)双密钥二路握手
用两个密钥可以避免上述问题,公私钥也可以。
A → B : { n } k 1 A\to B:\ \{n\}_{k_1} A→B: {n}k1
B → A : { f ( n ) } k 2 B\to A:\ \{f(n)\}_{k_2} B→A: {f(n)}k2
注:必须k1和k2都猜对才能攻击成功,可能需要多次验证,大大增加难度。但是如果k1加密的 { n } k 1 \{n\}_{k1} {n}k1已知了(比如说k1是公钥),那么k2可能被比对出来结果。用k2解密得到n’,用 { n ′ } k 1 \{n'\}_{k1} {n′}k1与 { n } k 1 \{n\}_{k1} {n}k1比对。这种比对主要是依赖于f()的作用,如果只是 f ( n ) = n + 1 f(n)=n+1 f(n)=n+1这种可逆的简单运算,那么攻击便可成功。
(三)随机数干扰因子
引入大随机数作为公钥加密的干扰因子,从而避免公钥加密密文成为验证文本。
A → B : { c , n } k 1 A\to B:\ \{c, n\}_{k_1} A→B: {c,n}k1
B → A : { f ( n ) } k 2 B\to A:\ \{f(n)\}_{k_2} B→A: {f(n)}k2
注:随机数c的加入可以形成一次一密,但是n或f(n)可能仍然有时间戳等含有某些含义的数据,会被用来验证。
(四)掩码
引入掩码从而掩盖住具有含义的信息,从而解决验证文本的问题。
A → B : { c 1 , c 2 , n } k 1 A\to B:\ \{c_1, c_2, n\}_{k_1} A→B: {c1,c2,n}k1
B → A : { c 2 ⊕ f ( n ) } k 2 B\to A:\ \{c_2\oplus f(n)\}_{k_2} B→A: {c2⊕f(n)}k2
四、认证协议
(一)相互认证协议
- A → S : { A , B , n a 1 , n a 2 , c a , { t a } K a } K s A\to S: \{A,B,na1,na2,ca,\{ta\}_{Ka}\}_{Ks} A→S:{A,B,na1,na2,ca,{ta}Ka}Ks
- S → B : A , B S\to B:A,B S→B:A,B
- B → S : { B , A , n b 1 , n b 2 , c b , { t b } K a } K s B\to S:\{B,A,nb1,nb2,cb,\{tb\}_{Ka}\}_{Ks} B→S:{B,A,nb1,nb2,cb,{tb}Ka}Ks
- S → A : { n a 1 , k ⊕ n a 2 } K a S\to A:\{na1,k\oplus na2\}_{Ka} S→A:{na1,k⊕na2}Ka
- S → B : { n b 1 , k ⊕ n b 2 } K b S\to B:\{nb1, k\oplus nb2\}_{Kb} S→B:{nb1,k⊕nb2}Kb
- A → B : { r a } k A\to B:\{ra\}_{k} A→B:{ra}k
- B → A : { f 1 ( r a ) , r b } k B\to A:\{f1(ra),rb\}_{k} B→A:{f1(ra),rb}k
- A → B : { f 2 ( r b ) } k A\to B:\{f2(rb)\}_k A→B:{f2(rb)}k
其中Ka和Kb是A,B与S的共享密钥,k是AB之间的会话密钥,Ks是server的公钥,S代表server,ta和tb代表两个时间戳。
- 第一条和第三条消息:包括三个随机数na1,na2,ca;一个只能由A产生的新鲜性消息 { t a } K a \{ta\}_{Ka} {ta}Ka;声明A要与B进行通信A,B
- 第四条和第五条消息:na1代表对于第一条消息的正确破解,na1和na2在多次通信中不能重用;na2用于隐藏k,防止外来攻击或者B本身图谋不轨(没有了na2,第四条消息后面的k可以被用来验证对于Ka的猜测)。
- ca:随机数干扰因子,用于防止B的恶意。如果没有ca的话,那么B一旦截获了第四条消息,B可以去猜测Ka,然后B可以得到na1、na2、k(本身B就有)、A、B、Ks,所以B只要去对第一条消息验证是否相同,即可确定Ka
- 第六、七、八条消息:挑战应答机制
(二)减少消息数目
- A → B : { A , B , n a 1 , n a 2 , c a , { t a } K a } K s , r a A\to B:\{A,B,na1,na2,ca,\{ta\}_{Ka}\}_{Ks},ra A→B:{A,B,na1,na2,ca,{ta}Ka}Ks,ra
- B → S : { A , B , n a 1 , n a 2 , c a , { t a } K a } K s , { B , A , n b 1 , n b 2 , c b , { t b } K b } K s B\to S:\{A,B,na1,na2,ca,\{ta\}_{Ka}\}_{Ks},\{B,A,nb1,nb2,cb,\{tb\}_{Kb}\}_{Ks} B→S:{A,B,na1,na2,ca,{ta}Ka}Ks,{B,A,nb1,nb2,cb,{tb}Kb}Ks
- S → B : { n a 1 , k ⊕ n a 2 } K a , { n b 1 , k ⊕ n b 2 } K b S\to B:\{na1,k\oplus na2\}_{Ka},\{nb1, k\oplus nb2\}_{Kb} S→B:{na1,k⊕na2}Ka,{nb1,k⊕nb2}Kb
- B → A : { n a 1 , k ⊕ n a 2 } K a , { f 1 ( r a ) , r b } k B\to A:\{na1,k\oplus na2\}_{Ka},\{f1(ra),rb\}_k B→A:{na1,k⊕na2}Ka,{f1(ra),rb}k
- A → B : { f 2 ( r b ) } k A\to B:\{f2(rb)\}_k A→B:{f2(rb)}k
压缩了协议的条目,内容不变
(三)增强的Kerberos协议
- A → S : { A , B , n a 1 , n a 2 , c a , { t a } K a } K s A\to S:\{A,B,na1,na2,ca,\{ta\}_{Ka}\}_{Ks} A→S:{A,B,na1,na2,ca,{ta}Ka}Ks
- S → A : { n a 1 , k ⊕ n a 2 } K a , { A , k , t s } K b S\to A:\{na1, k\oplus na2\}_{Ka},\{A,k,ts\}_{Kb} S→A:{na1,k⊕na2}Ka,{A,k,ts}Kb
- A → B : { A , k , t s } K b A\to B:\{A,k,ts\}_{Kb} A→B:{A,k,ts}Kb
(四)使用随机数挑战
不用时间戳,改用随机数挑战。
- A → S : A , B A\to S:A,B A→S:A,B
- S → A : A , B , n s S\to A:A,B,ns S→A:A,B,ns
- A → B : { A , B , n a 1 , n a 2 , c a , { n s } K a } K s , n s , r a A\to B:\{A,B,na1,na2,ca,\{ns\}_{Ka}\}_{Ks}, ns,ra A→B:{A,B,na1,na2,ca,{ns}Ka}Ks,ns,ra
- B → S : { A , B , n a 1 , n a 2 , c a , { n s } K a } K s , { B , A , n b 1 , n b 2 , c b , { n s } K b } K s B\to S:\{A,B,na1,na2,ca,\{ns\}_{Ka}\}_{Ks},\{B,A,nb1,nb2,cb,\{ns\}_{Kb}\}_{Ks} B→S:{A,B,na1,na2,ca,{ns}Ka}Ks,{B,A,nb1,nb2,cb,{ns}Kb}Ks
- S → B : { n a 1 , k ⊕ n a 2 } K a , { n b 1 , k ⊕ n b 2 } K b S\to B:\{na1,k\oplus na2\}_{Ka},\{nb1, k\oplus nb2\}_{Kb} S→B:{na1,k⊕na2}Ka,{nb1,k⊕nb2}Kb
- B → A : { n a 1 , k ⊕ n a 2 } K a , { f 1 ( r a ) , r b } k B\to A:\{na1, k\oplus na2\}_{Ka}, \{f1(ra),rb\}_k B→A:{na1,k⊕na2}Ka,{f1(ra),rb}k
- A → B : { f 2 ( r b ) } k A\to B:\{f2(rb)\}_k A→B:{f2(rb)}k
(五)身份协议
像ATM卡、信用卡、通行卡、电子通行、电话卡等。这种情况下通信不需要会话密钥,也不需要双向认证,只需要简单的身份认证即可。
- A → S : A A\to S:A A→S:A
- S → A : n s S\to A:ns S→A:ns
- A → S : { A , c a , { n s } K a } K s A\to S:\{A,ca,\{ns\}_{Ka}\}_{Ks} A→S:{A,ca,{ns}Ka}Ks
(六)秘密公钥协议
无需记录公钥,由server发送。
- A → S : A , B A\to S:A,B A→S:A,B
- S → A : A , B , n s , { K s a } K a , { K s b } K b S\to A:A,B,ns,\{Ksa\}_{Ka},\{Ksb\}_{Kb} S→A:A,B,ns,{Ksa}Ka,{Ksb}Kb
- A → B : { A , B , n a 1 , n a 2 , c a , { n s } K a } K s a , n s , r a , { K s b } K b A\to B:\{A,B,na1,na2,ca,\{ns\}_{Ka}\}_{Ksa},ns,ra,\{Ksb\}_{Kb} A→B:{A,B,na1,na2,ca,{ns}Ka}Ksa,ns,ra,{Ksb}Kb
- B → S : { A , B , n a 1 , n a 2 , c a , { n s } K a } K s a , { B , A , n b 1 , n b 2 , c b , { n s } K b } K s b B\to S:\{A,B,na1,na2,ca,\{ns\}_{Ka}\}_{Ksa},\{B,A,nb1,nb2,cb,\{ns\}_{Kb}\}_{Ksb} B→S:{A,B,na1,na2,ca,{ns}Ka}Ksa,{B,A,nb1,nb2,cb,{ns}Kb}Ksb
- S → B : { n a 1 , k ⊕ n a 2 } K a , { n b 1 , k ⊕ n b 2 } K b S\to B:\{na1,k\oplus na2\}_{Ka},\{nb1,k\oplus nb2\}_{Kb} S→B:{na1,k⊕na2}Ka,{nb1,k⊕nb2}Kb
- B → A : { n a 1 , k ⊕ n a 2 } K a , { f 1 ( r a ) , r b } k B\to A:\{na1,k\oplus na2\}_{Ka},\{f1(ra),rb\}_k B→A:{na1,k⊕na2}Ka,{f1(ra),rb}k
- A → B : { f 2 ( r b ) } k A\to B:\{f2(rb)\}_k A→B:{f2(rb)}k
注:公钥也要保密好,不然随意泄露出去会成为验证文本
(七)直接认证
已经共享密钥Kab,直接进行身份的认证即可。Kab1是公钥。
- A → B : r a , { K a b 1 } K a b A\to B:ra,\{Kab1\}_{Kab} A→B:ra,{Kab1}Kab
- B → A : { B , A , n b 1 , n b 2 , c b , { r a } K a } K a b 1 B\to A:\{B,A,nb1,nb2,cb,\{ra\}_{Ka}\}_{Kab1} B→A:{B,A,nb1,nb2,cb,{ra}Ka}Kab1
- A → B : { n b 1 , k ⊕ n b 2 } K a b A\to B:\{nb1,k\oplus nb2\}_{Kab} A→B:{nb1,k⊕nb2}Kab
- B → A : { f 1 ( r a ) , r b } k B\to A:\{f1(ra),rb\}_k B→A:{f1(ra),rb}k
- A → B : { f 2 ( r b ) } k A\to B:\{f2(rb)\}_k A→B:{f2(rb)}k