2016-07-21 09:43作者:quers
网络安全密匙是我们对某个事物进行认证的key,该密匙通常用于网络访问。也有一些网络平台使用key加密的方式进行保护,我们对这些访问加载的过程,就是解密和认证的过程。使用私有密匙与服务器沟通的过程便是确定用户身份的一种方式,阅读下文了解安全密钥加密消息的例子。
一、简介:
用公钥加密的数据只有私钥才能解密,相反的,用私钥加密的数据只有公钥才能解密,正是这种不对称性才使得公用密钥密码系统那么有用。
使用公用密钥密码系统进行认证
认证是一个验证身份的过程,目的是使一个实体能够确信对方是他所声称的实体。
下面用简单的例子来描述如何使用公用密钥密码系统来轻易的验证身份。
注:以下的 key 表示something 已经用密钥 key 加密或解密。
二、加密解密雏形
假设A要认证B,B有一个密钥对,即一个公钥和一个私钥,B透露给A他的公钥(至于他是怎么做的将在以后讨论)。然后A产生一段随机的消息,然后把它发给B。
A--> B random--message
B用自己的私钥来加密这段消息,然后把加密后的消息返回给A。
B--> A B‘s--private--key
A接到了这段消息,然后用B以前发过来的公钥来解密。她把解密后的消息和原始的消息做比较,如果匹配的话,她就知道自己正在和B通信。一个入侵者应该不知道B的私钥,因此就不能正确的加密那段A要检查的随机消息。
三、数字签名
除非你确切的知道你在加密什么,否则用你的私钥加密一些东西,然后发给别人永远不是一件好事。这是因为加密后的数据可能会背叛你(记住,只有你能加密,因为只有你才有密钥)。
所以,我们不加密A 发送的原始消息,取而代之的是,由B构造一个消息摘要,然后加密它。消息摘要是从随机消息中以某种方式提取出来的,并且具有以下特点:
- 摘要很难逆转,任何假冒B的人不能从摘要得到原始消息
- 假冒者无法找到具有相同摘要的不同消息
通过使用摘要,B能够保护自己。他首先计算出A发给他的随机消息的摘要并加密,然后把加密后的摘要返回给A,A可以计算出相同的摘要,通过解密B的消息然后对比一下就可以认证B的身份。
这个过程就是传说中的数字签名。
A--> B hello,are you B?
B--> A A,This Is B{digest[A,This Is B]}B’s-private-key
当B使用这个协议的时候,他知道自己发给A的是什么消息,并且不介意签名。他首先发送没有加密的消息“A,This Is B” 然后发送加密的摘要。A能够轻易的判断B是B,并且B没有签任何他不愿意签的东西。
四、分发公钥与证书
B如何以一种可信赖的方式分发他的公钥呢?我们假设认证协议是这个样子的:
A--> B hello
B--> A Hi, I‘m B, B’s-public-key
A--> B prove it
B--> A A, This Is B{ digest [A, This Is B] } B‘s-private-key
如果使用这个协议的话,任何人都可以是B。你需要的只是一个公钥和私钥,你跟A慌称你是B,接着你用自己的公钥代替B的公钥,然后你通过用你的私钥加密的东西来证明,这样A就不能分辨出你不是B。
为了解决这个问题,标准化组织发明了一个叫做证书的东西,一个证书包括下面的一些内容:
- 证书发行者的名字
- 证书发送给的团体
- 主题的公钥
- 一些时间戳
证书是由证书发行者的私钥签名的,每个人都知道证书发行者的公钥(即证书发行者有一个证书,等等)。证书是一种把公钥绑定到名字的标准方式。
通过使用证书这种技术,每个人都可以通过检查B的证书来判断B是不是伪造的。假设B严格的控制着他的私钥,并且的确是b得到了他的证书,那么一切都好。下面是补偿协议:
A--> B hello
B--> A Hi, I’m B, B‘S-certificate
A--> B prove it
B--> A A, This Is B{ digest [A, This Is B] } B’s-private-key
当A收到B的第一条消息,她可以检查证书,核实签名(如上,使用摘要和公钥加密),然后,核实主题(B的名字)来判断那是不是真的B。这样她就相信公钥是B的公钥,然后要求B证明他的身份。B则重新进行一次上面的相同过程,计算消息的摘要,签名之后发给A,A可以用从证书得到的公钥检查B的消息摘要,从而判断B的身份。
五、防止数据篡改与消息认证码
假设有个坏家伙H,虽然不能发现A和B交换的秘密,但是他可以干预并且破坏他们的对话。
举例来说,如果H位于A和B之间,他可以选择让大多数的消息返回以及向前继续传输没有改变,但是破坏了特定位的消息。
A--> H hello
H--> B hello
B--> H Hi, I‘m B, B’s-certificate
H--> A Hi, I‘m B, B’s-certificate
A--> H prove it
H--> B prove it
B--> H A, This Is B{ digest[A, This Is B] } B‘s-private-key
H--> A A, This Is B{ digest[A, This Is B] } B’s-private-key
A--> H ok B, here is a secret B‘s-public-key
H--> B ok B, here is a secret B’s-public-key
B--> H {some message}secret-key
H--> A Garble[ {some message}secret-key ]
H一直让数据没有改变的通过,直到A和B分享一个秘密。然后H通过改变B发送给A的消息来进入这个方式中。这时候A是相信B的,因此她就可能相信这个改变的消息,然后按照它来做。注意H并不知道这个秘密-他能做的所有事就是破坏用这个秘密的密钥加密的数据。他可能不能利用这个协议制造出一条有效的消息,但是下一次,他可能会幸运一点。
为了防止这种破坏,A和B在他们的协议中引入了一种消息认证码(MAC)。MAC是根据秘密的密钥和传输的数据计算出来的,上面描述的摘要算法的属性正好可以用于构造抵抗H的MAC功能。
MAC := Digest[ some message, secret ]
因为H不知道这个秘密的密钥,所以他无法计算出这个摘要的正确数值。即使H随机的改变消息,如果摘要数据很大的话,他成功的可能性也很小。举例来说,通过使用MD5,A和B能和他们的消息一起发送128位的MAC值。H猜中这个正确的MAC值的几率是 18,446,744,073,709,551,616 分之1。
下面是样本协议,又订正了一次:
A--> B hello
B--> A Hi, I‘m B, B’s-certificate
A--> B prove it
B--> A {digest[A, This Is B] } B‘s-private-key
ok B, here is a secret B’s-public-key
{some message,MAC}secret-key
H现在有麻烦了,H可以改变任何的消息,但是MAC的计算将揭露他的欺诈行为。A和B能发现伪造的MAC值并停止会话,H就不能伪造B的消息了。
但是这样同样不能防范H鹦鹉学舌。如果H记录了会话的过程,他虽然可能不知道会话的内容,但是他可以重放这些会话。实际上,H能在A和B之间做一些真正龌龊的事。
标签:安全密钥