CRC/Hash/Des/Rsa/数字签名/Openssl的介绍和应用总结

一、概述

  说到数据安全,必然少不了加密与解密,本章介绍常用加密原理。

二、常用加密算法

1.加密算法的分类

  常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法。

1)对称加密算法

  指加密和解密使用相同密钥的加密算法。优点在于加/解密速度快和使用长密钥时的难破解性,缺点是只有一个密钥,容易泄漏。

  常见的对称加密算法有DES3DESBlowfishIDEARC4RC5RC6AES

2)非对称加密算法

  指加密和解密使用不同密钥的加密算法,也称为公私钥加密。优点在于加/解密使用不同密钥,只需要保存好私钥,公钥可以公开,缺点是解密解密速度慢。

  常见的非对称加密算法有:RSAECC(移动设备用)、Diffie-HellmanEl GamalDSA

3Hash算法

  Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

常见的Hash算法有MD2MD4MD5HAVALSHASHA256等。

  加密算法的效能通常可以按照算法本身的复杂程度、密钥长度(密钥越长越安全)、加解密速度等来衡量。上述的算法中,除了DES密钥长度不够、MD2速度较慢已逐渐被淘汰外,其他算法仍在目前的加密系统产品中使用。

  实际应用中,根据不同的使用场合选用不同的算法。

2.RSA加密算法

1)概念

  RSA(发明此算法的三个人的名字的首字母)是一种公钥密码体制,现在使用得很广泛。

  作为一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。 由公钥加密的内容可以并且只能由私钥进行解密,并且由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密。

2)算法基本原理

Ø公钥与私钥的产生

  假设A想要通过一个不可靠的媒体接收B的一条私人消息。他可以用以下的方式来产生一个公钥和一个私钥:

1)随意选择两个大的素数pqp不等于q,计算N=pq

2)根据欧拉函数,求得                         

3)选择一个小于r的整数e,使er互质。并求得e关于r的模逆元,命名为d  模逆元存在,当且仅当er互质)。

4)将pq的记录销毁。

(N,e)是公钥,(N,d)是私钥。A将他的公钥(N,e)传给B,而将B的私钥(N,d)藏起来。

Ø加密消息

  假设B想给A送一个消息m,他知道Ne。他使用起先与A约好的格式将m转换为一个小于N的非负整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c

    B算出c后就可以将它传递给A

Ø解密消息

  A得到B的消息c后就可以利用他的密钥d来解码。他可以用以下这个公式来将c转换为n

  得到n后,他可以将原来的信息m重新复原。解码的原理是:

3RSA算法安全性

  只要上面提到的N足够大,就很难找到一种简单的方法对这么大的一个数进行因试分解,从而无法破解,黑客无法破解。

  针对RSA最流行的攻击一般是基于大数因数分解:

  1999年,RSA-155 (512 bits)被成功分解,花了五个月时间和224 CPU hours在一台有3.2G中央内存的Cray C916计算机上完成。

  20091212日,编号为RSA-768768 bits, 232 digits)数也被成功分解。这一事件威胁了现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上。

4RSA算法应用

  RSA可以用来为一个消息署名。假如Alice想给Bob传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的私钥“加密”(如同前面“加密消息”的步骤)这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。Bob获得这个消息后可以用Alice的公钥“解密”(如同前面“解密消息”的步骤)这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么Bob就可以知道发信人持有Alice的私钥,以及这个消息在传播路径上没有被篡改过。

  上述的散列值一般是hash值,这个值的获取可以通过shamd5等算法获取,后面会详细介绍。

总结

1. 通过上面的介绍,我们常用的CRC,Hash(MD5,SHA)等算法常应用于数据的校验,它们都是不可逆的,即通过校验码或信息摘要无法得到明文,但是由明文可以得到校验码或信息摘要。

2. CRC常应用于数据量比较少的地方,比如数据通信过程中,发送方会先计算出校验码,然后把校验码和通信数据一起发给接收方,接收方根据原始数据算出校验码并与接收方发来的校验码进行比较,如果相等,代表通信过程中数据没有发生过翻转或其他改变,保证了通信质量。

3. Hash校验常应用于数据量比较大的场合,比如Linux发行方会把Linux系统镜像和MD5值(现在已经不算最安全的)挂到官网上,用户下载后进行MD5校验,这样保证Linux系统镜像为官方提供,没有被篡改,保证了数据的完整性。

     3.1 常见的用户名密码存储方式

           我们都知道,用户名密码是不能按照明文的方式存储在数据库中的,一般来说,用户在一个网站上注册了用户名和密码后,网站系统先把用户的登陆密码进行hash计算并得到一个hash值,让后把这个hash值存储到服务器数据库中,并不会存储用户密码。当用户登陆网页时,输入了密码后,系统也会根据用户输入的密码生成一个hash值,系统根据这个hash值,在服务器数据库中根据用户名搜索,如果此用户名对应的hash值与此时他输入的密码的hash值匹配,那面认证通过,可以登陆系统。

           通过这样的方式,用户的密码实际上只有用户自己知道,网站系统也并没有存储密码明文,而是只存储了用户密码的hash值,即使网站服务器里的数据库丢失,那面别人拿到数据库后,也不能通过这些hash值推断出用户密码,因为加hash算法是不可逆的。这里为了说明原理,派出了暴力破解的情况。

4. 假如用户登陆了钓鱼网站,不怀好意的人把有病毒的Linux映像挂到网上,并且用这个映像生成了对应的MD5码,用户下载后,自己用映像生成的MD5码和钓鱼网上提供的MD5肯定是匹配的,用户就以为这个映像没问题,实际上是有问题的。如何避免这样的情况呢?就是再次应用上述的RSA算法对官方提供的MD5信息摘要进行数字签名,这样不但保证了数据的完整性,还保证了数据来源的正确性。因为只有官方提供的公私钥才能对数字签名进行解密得到官方的MD5信息摘要,别人没办法仿照。

三、Openssl应用

  前面介绍了一下密码学的一些基本知识,本小节介绍前面理论知识的实际应用。

1.Openssl基本概念

  OpenSSL是一个开源的安全工具包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。

  OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台性能,因此它支持Linux平台。

2.Openssl的信息摘要和数字签名

1)信息摘要,即对数据进行处理,得到一段固定长度的结果,有如下特性:

输出长度固定。即输出长度和输入长度无关。

不可逆。即由输出数据理论上不能推导出输入数据

对输入数据敏感。当输入数据变化极小时,输出数据也会发生明显的变化

防碰撞。即不同的数据得到相同输出数据的可能性极低。

  由于信息摘要有上述特点,一般保证数据的完整性,对一个大文件进行摘要运算,得到其摘要值。通过网络或者其他渠道传输后,通过验证其摘要值,确定大文件本身有没有发生变化。

  目前openssl提供的摘要算法有md4md5ripemd160shasha1sha224sha256sha512sha384wirlpool。也就是说可以通过上述算法获取上面提到的信息摘要。算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同),因此md5sha1已经被我国中科院院士王小云在05年就破解了,所以我们监控用的sha256算法计算信息摘要。

  这些算法可以通过Linux命令“openssl dgst”命令查看。

2)数字签名

  对原始文件进行数字签名主要分为两步,首先对原始文件进行摘要运算,得到摘要值,然后使用公开密钥算法中的私钥对摘要值进行加密。其签名和验证过程如下图(下图是网上找的):

 

3)数字签名流程

假定用户userA,要给用户userB,发送信息 SMS ;

userA 先生成自己的公钥(PubKey)和密钥(PriKey),常用的算法有 RSA,DSA;

userA 对信息 SMS 做信息摘要处理得到 SHA256_SMS , 常用的摘要算法详见前面openssl dgst命令查询结果;

userA 用自己的密钥 PriKey 加密信息摘要 SHA256_SMS 得到 ENC_SHA256_SMS,即数字签名;

userA ENC_SHA256_SMS 数字签名 、自己的公钥 PubKey 以及原数据 SMS 一起发送给 userB;

userB 用同样的摘要算法对 SMS 处理得到 userB_SHA256_SMS

userB userA的公钥 PubKey 解密数字签名ENC_SHA256_SMS 得到 userB_DEC_SHA256_SMS;

userB 去比较 userB_DEC_SHA256_SMS userB_SHA256_SMS 是不是相同的,如果相同那么确认数字签名是userA发的,并且数据安全没有被篡改。

  这样体现了数字签名的两个特性:一是不可冒充,别人假冒不了(因为没有私钥);二是可以保证数据的完整性(因为内容改变信息摘要也改变)

4)数字证书

  数字签名已经很完美,用公钥能够解密,说明确实是私钥方发送的,这样很放心……

  但如果,万一这把公钥本身,就被人做了手脚???

  为了保证“公钥”是可信的,数字证书应运而生。

  数字证书里有个重要概念,CA,发送方先把自己的公钥给CACA对其进行加密得到加密后的发送方公钥(用的是CA的私钥和CA加密算法),也就是CA的数字证书。

  注意这里有两个不同的非对称算法(对应2个公钥私钥对),一个算法是发送方加密摘要的,用于生成数字签名;另一个算法是CA加密发送方公钥的,用于生成数字证书。两个算法相互独立,没有必然联系。

  发送时不仅发送内容、数字签名,还包含发送方的数字证书。接收方拿到后,首先从数字证书中解密出发送方公钥(用的是CA的公钥和CA解密算法),这个公钥必然是可信的。然后就是和前面一样的流程,拿发送方公钥去解密数字证书,得到摘要;最后比对摘要是否一致。

一个问题:既然数字证书是为了保证发送方公钥不是别人伪造的,那怎么保证“CA”的公钥不是伪造的呢?

答:CA是第三方机构,CA公钥是公开的,接收方可以跟别人比对(比如在网上查询),因此不可能伪造。但是发送方公钥,接收方是通过通信得到的,收到后无法验证。

猜你喜欢

转载自blog.csdn.net/fengel_cs/article/details/102841543