信息安全学习之消息认证和公钥加密

Posted by liveipool on October 13, 2016

信息安全学习之消息认证和公钥加密

消息认证

消息认证方法

为了防止被动攻击(窃听)和主动攻击(伪造数据和交易),采用消息认证的方法。
消息认证是一种允许通信者验证所收消息是否可信的措施。认证包括两个重要方面:1.验证消息的内容有没有被篡改 2.验证信源是否可信。我们还希望验证消息的时效性(消息没有被人为得延迟或重放)以及两实体之间消息流的相对顺序。

利用常规加密的认证

一般来说,只有发送者和接收者共享一个密钥,因此此种情况下可以容易地使用密钥进行认证。

非加密地消息认证

以下,主要讨论几种不依赖于加密的消息认证方法:所有这些方法都会生成认证标签,并且附在每一条消息上用于传输。 消息本身并不会被加密,所以它在目的地可读而与目的地的认证功能无关。因为不加密消息,所以不提供消息的保密性,有典型的以下三种无需保密的消息认证情况:

  • 许多应用需要把相同的消息广播到多个目的地。
  • 在消息交换中,另一种可能的情况是通信某一端负载太大,没时间解密所有传入的消息。
  • 对明文形式的计算机程序进行认证是很有意义的工作。
消息认证码

该技术利用私钥产生一小块数据,并将其附到消息上:
A、B共享一个公共密钥K,A要发送消息时,先计算消息认证码,MAC = F(K, M),并将消息连同MAC一起发送给B。B在接受到后,也利用K计算出MAC,如果两个MAC相同,则:

  • B能确认收到的消息未被篡改。
  • 接收者能够确保消息来自合法的发送者。
  • 如果消息中包含序列号,也可以确认是未被篡改的。
    一般密文的最后16或32比特用作MAC。
单向散列函数

散列函数接收变长的消息M作为输入,生成定长的消息摘要H(M)作为输出。散列函数不需要密钥输入。消息摘要随消息一起以可信的形式传送。消息摘要一般有三种方式生成:1.使用传统加密–A和B共享密钥。 2.使用公钥方式加密–既提供数字签名又能提供消息认证,并且不需要在通信各方之间分法密钥。(这里公钥具体定义是啥??) 3.使用秘密值。

安全散列函数和HMAC

散列函数的要求

散列函数的目的是为文件、消息或其他数据块产生“指纹”。为满足在消息认证中的应用,散列函数H必须具有下列性质:

  1. H可适用于任意长度的数据块。
  2. H能生成固定长度的输出。
  3. 对于任意给定的x,计算H(x)相对容易,并且可以用软/硬件方式实现。
  4. 对于任意给定值h,找到满足H(x)=h的x在计算上不可行,这也叫单向性
  5. 对于任意给定的数据块x,找到满足H(y)= H(x)的 y不等于x 在计算上是不可行的,这叫做抗弱碰撞性,是为了防止攻击者能够找到具有相同散列值的可替换消息。
  6. 找到满足H(x)=H(y)的任意一对(x, y)在计算上是不可行的,这叫做抗强碰撞性,可以防止类似“生日攻击”这种类型的复杂攻击。

以下是一些具体的散列函数,但它们的原理还没怎么看懂,以后需要时再进行具体深入的研究:

  • 简单散列函数
  • 安全散列函数SHA-1
  • MD5消息摘要算法
  • Whirlpool
  • HMAC

公钥加密

公钥加密原理

公钥算法基于数学函数,而不像对称加密算法那样是基于比特模式的简单操作。公钥加密系统是非对称的,它使用两个单独的密钥,对于保密性 、密钥分发和认证都产生了意义深远的影响。
关于公钥加密和传统加密的比较:

  1. 没有任何原理能说明是传统加密还是公钥加密更加优越。
  2. 由于当前公钥加密方案的计算开销太大,传统加密淘汰的可能性还不大。
  3. 公钥密码除需要某种形式的协议以外,它还常常需要中心代理,所以与传统加密相比,公钥加密所需的操作并不简单或者高效。

公钥加密的基本步骤:

  1. 每个用户都生成一对密钥来对消息进行加密或解密。
  2. 每个用户把两个密钥中的一个放在公共寄存器或其他可访问的文件里,这个密钥便是公钥,另一个密钥自己保存。
  3. 如果B希望给A发送私人消息,则他用A的公钥加密消息。
  4. 当A收到这条消息,她用自己A的私钥进行解密。因为只有她自己知道自己的私钥,所以这是安全的。

公钥系统的特征就是使用具有两个密钥的加密算法,其中一个密钥为私人所有,另一个密钥是公共可用的。
传统加密算法中使用的密钥被特别地称为密钥。而用于公钥加密的两个密钥被称为公钥私钥。私钥总是保密的,但仍然被称作为私钥而不是密钥,这是为了避免与传统加密混淆。注意这几个术语!!

公钥加密算法

有一些比较典型的公钥加密算法,具体算法比较复杂,需要深入理解时再查询各种资料,下面列出一些:

  1. RSA公钥加密算法(非常重要!!!要理解!!!RSA+AES可以形成一个效率和安全性极高的系统)
  2. Diffie-Hellman密钥交换
  3. 数字签名标准(DSS)
  4. 椭圆曲线加密术(ECC)

数字签名

B发消息给A,A发现能用B的公钥进行解密,从而就可以证明这条消息确实是由B加密的。因为只有B有他自己的私钥,所以这一个加密的消息就成了一个数字签名,并且由于没有B的私钥就不能篡改消息,所以数字签名不仅认证了消息源,还保证了数据的完整性。
上面一种方法虽然可靠,但需要很大的存储量。另外一种方法是使用认证符(authenticator):只改变文档而不改变认证符是做不到的。如果用发送者的私钥加密认证符,它就可以验证源、内容和顺序的签名。(安全散列码就可以完成这种功能,如SHA-1)

公钥证书

任何参与者都可以给其他参与者发送他的公钥,或向群体广播自己的公钥,这种广播虽然方便,但容易被伪造。
因此防止这种伪造的方法就是公钥证书。实际上,公钥证书由公钥加上公钥所有者的用户ID以及可信的第三方签名的整个数据块工程。第三方通常是用户团体所信任的认证中心(CA),如政府机构和金融机构。
人们广泛接受的公钥证书格式是X.509标准,X.509证书应用于大多数的网络安全设施,包括IP安全、安全套接字层(SSL)等,这个证书的相关内容,在以后的学习中再总结。