⑴ 对称加密、非对称加密、摘要、数字签名、数字证书
作为一个开发人员,或多或少都听说过对称加密、非对称加密、摘要、数字签名、数字证书这几个概念,它们是用来保证在互联网通信过程中数据传输安全的。有人可能会有疑惑,我给传输数据加个密不就安全了,为什么还要搞这么多花样出来?本文主要通过一个案例来讲解这几个概念的实际作用。
在此之前,我先简单介绍一下这几个概念。
对称加密是指用来加密和解密的是同一个秘钥。其特点是加密速度快,但是秘钥容易被黑客截获,所以安全性不高。常见的有AES、DES算法。
非对称加密是指用来加密和解密的是不同的秘钥,它们是成对出现的,称为公钥和私钥,知道其中一个秘钥是无法推导出另外一个秘钥的。用公钥加密的内容需要用私钥才能解密,用私钥加密的内容需要用公钥才能解密。非对称加密的特点是安全性高,缺点是加密速度慢。常见的有RSA算法。
所谓的摘要就是一段信息或者一个文件通过某个哈希算法(也叫摘要算法)而得到的一串字符。摘要算法的特点就是不同的文件计算出的摘要是不同的(也有可能相同,但是可能性非常非常低),比如一个1G的视频文件,哪怕只是改动其中一个字节,最后计算得到的摘要也是完全不同的,所以摘要算法通常是用来判断文件是否被篡改过。其还有一个特点就是通过摘要是无法推导出源文件的信息的。常用的摘要算法有MD5、SHA等。
数字签名就是一个文件的摘要加密后的信息。数字签名是和源文件一起发送给接收方的,接收方收到后对文件用摘要算法算出一个摘要,然后和数字签名中的摘要进行比对,两者不一致的话说明文件被篡改了。
数字证书是一个经证书授权中心生成的文件,数字证书里一般会包含公钥、公钥拥有者名称、CA的数字签名、有效期、授权中心名称、证书序列号等信息。其中CA的数字签名是验证证书是否被篡改的关键,它其实就是对证书里面除了CA的数字签名以外的内容进行摘要算法得到一个摘要,然后CA机构用他自己的私钥对这个摘要进行加密就生成了CA的数字签名,CA机构会公开它的公钥,验证证书时就是用这个公钥解密CA的数字签名,然后用来验证证书是否被篡改。
场景:
张三要找人装修一个房子,原则是谁的出价便宜就给谁装修,所以对于报价文件就是属于机密文件。下面我们来看下不同的方式传输报价文件都会有什么风险。
现在李四想接这个装修的活,他做了一份报价文件(文件名: lisi.txt ,文件内容: 报价50万 )。然后李四用一个对称秘钥 123 对这个文件进行加密。最后李四将这个秘钥和加密的文件发给张三,张三收到后用这个秘钥解密,知道了李四的报价是50万。
同时王五也想接这个装修的活,他本来是想报价55万的,但是又担心报价太高而丢掉这个活。恰巧王五是个黑客高手,于是他截获了李四发给张三的秘钥和加密文件,知道了李四报价是50万。最后王五将自己的报价改成了49万发给张三,结果王五接下了这个装修活。
结论:
用对称加密的话,一旦秘钥被黑客截获,加密就形同虚设,所以安全性比较低。
首先张三会生成一对秘钥,私钥是 zhangsan1 ,公钥是 zhangsan2 ,私钥张三自己保存,将公钥公布出去。
李四将报价文件 list.txt 用张三公布的公钥 zhangsan2 进行加密后传给张三,然后张三用私钥 zhangsan1 进行解密得到李四的报价是50万。
这个时候即使王五截获到了李四发给张三的报价文件,由于王五没有张三的私钥,所以他是无法解密文件的,也就无法知道李四的报价。最后王五因为报价55万而丢掉了这个装修的机会。
所以用非对称加密是可以保证数据传输安全的。不过这里说一句题外话,既然非对称加密安全性高,那为什么不淘汰掉对称加密呢?其实关键就在于加密速度,非对称加密计算量很大,所以加密速度是很慢的,如果发送消息非常频繁,使用非对称加密的话就会对性能造成很大影响。所以在实际开发过程中通常是对称加密和非对称加密结合使用的。也就是对称加密的秘钥是用非对称加密后发送的,这样能保证对称加密的秘钥不被黑客截获,然后在发送业务数据时就用对称加密。这样既保证了安全性也保证了加密速度。
结论:
非对称加密可以防止黑客截获加密后的内容,安全性高。
前面都说了非对称加密是安全的,那为什么还要数字签名呢?
设想一下,王五截获了李四的报价文件,王五虽然无法知道李四的实际报价,但是他完全可以伪造一份李四的报价(文件名: lisi.txt ,文件内容: 报价60万 ),然后将这份伪造文件用张三公布的公钥 zhangsan2 进行加密后替换原来的报价文件。张三收到后解密发现报价是60万,于是张三就以为李四报的价是60万,最后决定将装修的活给报价55万的王五来做。
发生这个问题的关键就在于张三无法知道报价文件是否被篡改过。要解决这个问题就需要用到数字签名。
首先李四需要自己生成一对非对称加密的秘钥,私钥 lisi1 自己保存,公钥 lisi2 发给张三。然后李四对自己的报价文件通过摘要算法得到一个摘要(假设摘要是 aaa ),再用自己的私钥 lisi1 加密这个摘要就得到了报价文件的数字签名,最后将加密的报价文件和数字签名一起发给张三,张三收到后先用李四发过来的公钥 lisi2 解密数字签名得到摘要 aaa ,然后用自己的私钥 zhangsan1 解密加密的文件得到报价源文件,然后对报价源文件进行摘要算法,看计算得到的结果是不是 aaa ,如果不是 aaa 的话就说明报价文件被篡改了。
在这种情况下,如果王五截获了李四发给张三的文件。王五是无法解密报价文件的。如果王五伪造一份报价文件的话,等张三收到后就会发现报价文件和数字签名不匹配。那王五能不能伪造报价文件的同时也伪造签名呢?因为王五没有李四的私钥,所以没法对伪造的报价文件的摘要进行加密,所以也就没法伪造签名。
结论:
非对称加密虽然能确保加密文件内容不被窃取,但不能保证文件不被篡改。数字签名就是用来验证文件是否被篡改过。
既然非对称加密可以保证文件内容的安全性,数字签名又可以保证文件不被篡改,那还要数字证书有什么用呢?
我们再来设想一下,王五自己也生成了一对用于非对称加密的秘钥,私钥是 wangwu1 ,公钥是 wangwu2 。前面李四将自己的公钥 lisi2 发给张三的过程中被王五给截获了,王五用自己的公钥 wangwu2 替换了李四的公钥 lisi2 ,所以张三最后收到的公钥实际上是王五的,但张三对这并不知情。后面李四发的数字签名和加密的报价文件都被王五截获,并且王五伪造了一份报价文件,同时用自己的私钥加密报价文件的摘要生成伪造的签名并发给张三,张三收到后进行验证发现数字签名和报价文件是匹配的,就以为这份报价文件是真实的。
出现这个问题的关键就在于张三没法确认收到的公钥到底是不是李四发的,这个时候数字证书就起到作用了。李四到权威的数字证书机构申请数字证书,证书里面包含了公钥( lisi2 )和公钥的拥有者( 李四 )等相关信息,然后李四将证书发给张三,张三通过证书里面的信息就可以知道公钥到底是不是李四的了。
那证书在发送过程中有没有可能被王五截获并篡改呢?要知道证书里面还包含CA的数字签名,这个签名是证书机构用他们自己的私钥对证书的摘要进行加密的,而公钥是公开的。所以即便王五截获并篡改了证书内容,他也无法伪造证书机构的签名,张三在收到证书后通过验证签名也会发现证书被篡改了。所以到这一步才能保证数据传输的真正安全。
⑵ 数据在网络上传输为什么要加密现在常用的数据加密算法主要有哪些
数据传输加密技术的目的是对传输中的数据流加密,通常有线路加密与端—端加密两种。线路加密侧重在线路上而不考虑信源与信宿,是对保密信息通过各线路采用不同的加密密钥提供安全保护。
端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。
数据存储加密技术的目的是防止在存储环节上的数据失密,数据存储加密技术可分为密文存储和存取控制两种。前者一般是通过加密算法转换、附加密码、加密模块等方法实现;后者则是对用户资格、权限加以审查和限制,防止非法用户存取数据或合法用户越权存取数据。
常见加密算法
1、DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;
2、3DES(Triple DES):是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高;
3、RC2和RC4:对称算法,用变长密钥对大量数据进行加密,比 DES 快;
4、IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128 位密钥提供非常强的安全性;
5、RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,非对称算法; 算法如下:
首先, 找出三个数,p,q,r,其中 p,q 是两个不相同的质数,r 是与 (p-1)(q-1) 互为质数的数。
p,q,r这三个数便是 private key。接着,找出 m,使得 rm == 1 mod (p-1)(q-1).....这个 m 一定存在,因为 r 与 (p-1)(q-1) 互质,用辗转相除法就可以得到了。再来,计算 n = pq.......m,n 这两个数便是 public key。
6、DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法;
7、AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,在21世纪AES 标准的一个实现是 Rijndael 算法。
8、BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快;
9、MD5:严格来说不算加密算法,只能说是摘要算法;
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
(2)摘要加密目的扩展阅读
数据加密标准
传统加密方法有两种,替换和置换。上面的例子采用的就是替换的方法:使用密钥将明文中的每一个字符转换为密文中的一个字符。而置换仅将明文的字符按不同的顺序重新排列。单独使用这两种方法的任意一种都是不够安全的,但是将这两种方法结合起来就能提供相当高的安全程度。
数据加密标准(Data Encryption Standard,简称DES)就采用了这种结合算法,它由IBM制定,并在1977年成为美国官方加密标准。
DES的工作原理为:将明文分割成许多64位大小的块,每个块用64位密钥进行加密,实际上,密钥由56位数据位和8位奇偶校验位组成,因此只有56个可能的密码而不是64个。
每块先用初始置换方法进行加密,再连续进行16次复杂的替换,最后再对其施用初始置换的逆。第i步的替换并不是直接利用原始的密钥K,而是由K与i计算出的密钥Ki。
DES具有这样的特性,其解密算法与加密算法相同,除了密钥Ki的施加顺序相反以外。
参考资料来源:网络-加密算法
参考资料来源:网络-数据加密
⑶ 数据加密和数据签名的原理作用
加密可以帮助保护数据不被查看和修改,并且可以帮助在本不安全的信道上提供安全的通信方式。例如,可以使用加密算法对数据进行加密,在加密状态下传输数据,然后由预定的接收方对数据进行解密。如果第三方截获了加密的数据,解密数据是很困难的。
在一个使用加密的典型场合中,双方(小红和小明)在不安全的信道上通信。小红和小明想要确保任何可能正在侦听的人无法理解他们之间的通信。而且,由于小红和小明相距遥远,因此小红必须确保她从小明处收到的信息没有在传输期间被任何人修改。此外,她必须确定信息确实是发自小明而不是有人模仿小明发出的。
加密用于达到以下目的:
保密性:帮助保护用户的标识或数据不被读取。
数据完整性:帮助保护数据不更改。
身份验证:确保数据发自特定的一方。
为了达到这些目的,您可以使用算法和惯例的组合(称作加密基元)来创建加密方案。下表列出了加密基元及它们的用法。
加密基元 使用
私钥加密(对称加密) 对数据执行转换,使第三方无法读取该数据。此类型的加密使用单个共享的机密密钥来加密和解密数据。
公钥加密(不对称加密) 对数据执行转换,使第三方无法读取该数据。此类加密使用公钥/私钥对来加密和解密数据。
加密签名 通过创建对特定方唯一的数字签名来帮助验证数据是否发自特定方。此过程还使用哈希函数。
加密哈希 将数据从任意长度映射为定长字节序列。哈希在统计上是唯一的;不同的双字节序列不会哈希为同一个值。
私钥加密
私钥加密算法使用单个私钥来加密和解密数据。由于具有密钥的任意一方都可以使用该密钥解密数据,因此必须保护密钥不被未经授权的代理得到。私钥加密又称为对称加密,因为同一密钥既用于加密又用于解密。私钥加密算法非常快(与公钥算法相比),特别适用于对较大的数据流执行加密转换。
通常,私钥算法(称为块密码)用于一次加密一个数据块。块密码(如 RC2、DES、TrippleDES 和 Rijndael)通过加密将 n 字节的输入块转换为加密字节的输出块。如果要加密或解密字节序列,必须逐块进行。由于 n 很小(对于 RC2、DES 和 TripleDES,n = 8 字节;n = 16 [默认值];n = 24;对于 Rijndael,n = 32),因此必须对大于 n 的值一次加密一个块。
基类库中提供的块密码类使用称作密码块链 (CBC) 的链模式,它使用一个密钥和一个初始化向量 (IV) 对数据执行加密转换。对于给定的私钥 k,一个不使用初始化向量的简单块密码将把相同的明文输入块加密为同样的密文输出块。如果在明文流中有重复的块,那么在密文流中将存在重复的块。如果未经授权的用户知道有关明文块的结构的任何信息,就可以使用这些信息解密已知的密文块并有可能发现您的密钥。若要克服这个问题,可将上一个块中的信息混合到加密下一个块的过程中。这样,两个相同的明文块的输出就会不同。由于该技术使用上一个块加密下一个块,因此使用了一个 IV 来加密数据的第一个块。使用该系统,未经授权的用户有可能知道的公共消息标头将无法用于对密钥进行反向工程。
可以危及用此类型密码加密的数据的一个方法是,对每个可能的密钥执行穷举搜索。根据用于执行加密的密钥大小,即使使用最快的计算机执行这种搜索,也极其耗时,因此难以实施。使用较大的密钥大小将使解密更加困难。虽然从理论上说加密不会使对手无法检索加密的数据,但这确实极大增加了这样做的成本。如果执行彻底搜索来检索只在几天内有意义的数据需要花费三个月的时间,那么穷举搜索的方法是不实用的。
私钥加密的缺点是它假定双方已就密钥和 IV 达成协议,并且互相传达了密钥和 IV 的值。并且,密钥必须对未经授权的用户保密。由于存在这些问题,私钥加密通常与公钥加密一起使用,来秘密地传达密钥和 IV 的值。
假设小红和小明是要在不安全的信道上进行通信的双方,他们可能按以下方式使用私钥加密。小红和小明都同意使用一种具有特定密钥和 IV 的特定算法(如 Rijndael)。小红撰写一条消息并创建要在其上发送该消息的网络流。接下来,她使用该密钥和 IV 加密该文本,并通过 Internet 发送该文本。她没有将密钥和 IV 发送给小明。小明收到该加密文本并使用预先商定的密钥和 IV 对它进行解密。如果传输的内容被人截获,截获者将无法恢复原始消息,因为截获者并不知道密钥或 IV。在这个方案中,密钥必须保密,但 IV 不需要保密。在一个实际方案中,将由小红或小明生成私钥并使用公钥(不对称)加密将私钥(对称)传递给对方。有关更多信息,请参见本主题后面的有关公钥加密的部分。
.NET Framework 提供以下实现私钥加密算法的类:
DESCryptoServiceProvider
RC2CryptoServiceProvider
RijndaelManaged
公钥加密
公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥都在数学上相关联;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。公钥可以提供给任何人;公钥用于对要发送到私钥持有者的数据进行加密。两个密钥对于通信会话都是唯一的。公钥加密算法也称为不对称算法,原因是需要用一个密钥加密数据而需要用另一个密钥来解密数据。
公钥加密算法使用固定的缓冲区大小,而私钥加密算法使用长度可变的缓冲区。公钥算法无法像私钥算法那样将数据链接起来成为流,原因是它只可以加密少量数据。因此,不对称操作不使用与对称操作相同的流模型。
双方(小红和小明)可以按照下列方式使用公钥加密。首先,小红生成一个公钥/私钥对。如果小明想要给小红发送一条加密的消息,他将向她索要她的公钥。小红通过不安全的网络将她的公钥发送给小明,小明接着使用该密钥加密消息。(如果小明在不安全的信道如公共网络上收到小红的密钥,则小明必须同小红验证他具有她的公钥的正确副本。)小明将加密的消息发送给小红,而小红使用她的私钥解密该消息。
但是,在传输小红的公钥期间,未经授权的代理可能截获该密钥。而且,同一代理可能截获来自小明的加密消息。但是,该代理无法用公钥解密该消息。该消息只能用小红的私钥解密,而该私钥没有被传输。小红不使用她的私钥加密给小明的答复消息,原因是任何具有公钥的人都可以解密该消息。如果小红想要将消息发送回小明,她将向小明索要他的公钥并使用该公钥加密她的消息。然后,小明使用与他相关联的私钥来解密该消息。
在一个实际方案中,小红和小明使用公钥(不对称)加密来传输私(对称)钥,而对他们的会话的其余部分使用私钥加密。
公钥加密具有更大的密钥空间(或密钥的可能值范围),因此不大容易受到对每个可能密钥都进行尝试的穷举攻击。由于不必保护公钥,因此它易于分发。公钥算法可用于创建数字签名以验证数据发送方的身份。但是,公钥算法非常慢(与私钥算法相比),不适合用来加密大量数据。公钥算法仅对传输很少量的数据有用。公钥加密通常用于加密一个私钥算法将要使用的密钥和 IV。传输密钥和 IV 后,会话的其余部分将使用私钥加密。
.NET Framework 提供以下实现公钥加密算法的类:
DSACryptoServiceProvider
RSACryptoServiceProvider
数字签名
公钥算法还可用于构成数字签名。数字签名验证发送方的身份(如果您信任发送方的公钥)并帮助保护数据的完整性。使用由小红生成的公钥,小红的数据的接收者可以通过将数字签名与小红的数据和小红的公钥进行比较来验证是否是小红发送了该数据。
为了使用公钥加密对消息进行数字签名,小红首先将哈希算法应用于该消息以创建消息摘要。该消息摘要是数据的紧凑且唯一的表示形式。然后,小红用她的私钥加密该消息摘要以创建她的个人签名。在收到消息和签名时,小明使用小红的公钥解密签名以恢复消息摘要,并使用与小红所使用的相同的哈希算法来散列消息。如果小明计算的消息摘要与从小红那里收到的消息摘要完全一致,小明就可以确定该消息来自私钥的持有人,并且数据未被修改过。如果小明相信小红是私钥的持有人,则他知道该消息来自小红。
请注意,由于发送方的公钥为大家所周知,并且它通常包含在数字签名格式中,因此任何人都可以验证签名。此方法不保守消息的机密;若要使消息保密,还必须对消息进行加密。
.NET Framework 提供以下实现数字签名算法的类:
DSACryptoServiceProvider
RSACryptoServiceProvider
哈希值
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希计算都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。
消息身份验证代码 (MAC) 哈希函数通常与数字签名一起用于对数据进行签名,而消息检测代码 (MDC) 哈希函数则用于数据完整性。
双方(小红和小明)可按下面的方式使用哈希函数来确保数据的完整性。如果小红对小明编写一条消息并创建该消息的哈希,则小明可以在稍后散列该消息并将他的哈希与原始哈希进行比较。如果两个哈希值相同,则该消息没有被更改;如果值不相同,则该消息在小红编写它之后已被更改。为了使此系统发挥作用,小红必须对除小明外的所有人保密原始的哈希值。
.NET Framework 提供以下实现数字签名算法的类:
HMACSHA1
MACTripleDES
MD5CryptoServiceProvider
SHA1Managed
SHA256Managed
SHA384Managed
SHA512Managed
随机数生成
随机数生成是许多加密操作不可分割的组成部分。例如,加密密钥需要尽可能地随机,以便使生成的密钥很难再现。加密随机数生成器必须生成无法以计算方法推算出(低于 p < .05 的概率)的输出;即,任何推算下一个输出位的方法不得比随机猜测具有更高的成功概率。.NET Framework 中的类使用随机数生成器生成加密密钥。
RNGCryptoServiceProvider 类是随机数生成器算法的实现。
⑷ 摘要、数字签名和数字证书
摘要是指通过一定的摘要算法将一段内容转为一段固定长度的内容,该内容即是摘要。
摘要算法: 通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)
常见的摘要算法有:MD5、SHA1、SHA256、SHA512。
摘要作用: 检测内容是否发生修改。
存在问题: 消息发送过程中,可被中间人修改消息内容,并生成新的摘要,消息接收者不能确定消息是否被篡改。
数字签名,即是用消息发送者的 私钥 加密 摘要 后生成的内容。该内容只能用发送者的公钥进行解密,所以可以防止他人修改。
数字签名的目的是为了确保该消息是发送者发送的,中途没有被修改或替换。
存在问题: 数字签名可以解决消息被中间人修改的问题,但前提是消息接收者拿到的发送者的公钥是真实的。如果拿到的公钥不是发送者的,而是中间人的公钥,那么消息还是可以被篡改。
数字证书,是通过第三方(一般称为CA)颁发的,一般是用第三方的私钥来加密消息发送者的公钥和相关信息而生成的。这样,消息接收者用第三方的公钥来进行解密证书,得到消息发送者的公钥。
数字证书解决的问题是:防止消息发送者的公钥被中途替换,从而解决了单纯的 摘要 和 数字签名 的问题。