深入理解-信息加密/信息摘要/数字签名

一、数据加密

  • 加密

    数据加密就是将明文的数据按照某种算法进行处理,使其成为不可读的数据,通常称为“密文”。用于保护数据不被其他人非法窃取、阅读。

  • 解密

    加密的逆过程为解密,即将该编码信息转化为其明文数据的过程。

  • 常见的加密算法可以分为:对称加密算法、非对称加密算法。

 

1、对称加密算法

  数据的加密和解密使用相同的密钥,在密码学中被称为对称加密算法。对称加密算法实现简单,密钥较短,且破译困难,是最初的加密算法。

特点:

  • 优点:算法公开、计算量小、加密速度快、加密效率高。
  • 缺点:在数据传输前,发送方和接收方必须约定并管理保存好秘钥,如果一方的秘钥被泄露,那么加密信息就存在安全泄露。
  • 使用场景:本地数据加密、https通信、网络传输等。
  • 常见算法:AES、DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6。

 

2、非对称加密算法

  非对称加密算法思想为“加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系",该类算法使用一对公钥/私钥完成数据的加密解密过程。

通常:

  • 使用公钥对数据进行加密,使用对应的私钥进行解密。
  • 使用私钥对数据进行加密,使用对应的公钥进行解密。

特点:

  • 优点:非对称加密相比对称加密其安全性更好。
  • 缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
  • 使用场景:https会话前期、CA数字证书、信息加密、登录认证等。
  • 常见算法:RSA、DSA(数字签名用)、ECC(移动设备用)、Diffie-Hellman、ElGamal。

 

3、加密算法的选择

  • 对称加密算法不能实现数字签名,因此签名只能非对称算法。
  • 验证文件或字符一致性用信息摘要算法。
  • 数据量大用对称加密算法、小则可以用非对称加密。
  • 还可以非对称与对称集成使用,参考https请求原理。
  • RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

 

二、数据摘要

  信息摘要:对数据进行处理,取得一段固定长度的文本。
  数据摘要算法也被称为哈希(Hash)算法、散列算法。哈希算法是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此,Hash算法常用在不可还原的密码存储、信息完整性校验等场景。

  一般在进行数字签名时,需要先对文本使用HASH算法计算其信息摘要,然后对该摘要值进行数字签名。

  • 优点:
    • 输出长度固定。即输出长度和输入长度无关。
    • 不可逆。即由输出数据理论上不能推导出输入数据。(通常加盐值保证不可逆)
    • 对输入数据敏感。当输入数据变化极小时,输出数据也会发生明显的变化。
    • 防碰撞。即不同的数据数据得到相同输出数据的可能性极低。
    • 摘要运算得到的数据大小通常相比于原文较小,有数据压缩的作用。

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

  • 缺点:可能存在散列冲突。
  • 使用场景:文件或字符串一致性校验、数字签名、鉴权协议。
  • 常见算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1。

 常见算法分类:

  • MD<n>系列

  这是应用非常广泛的一个算法家族,尤其是 MD5(Message-Digest Algorithm 5,消息摘要算法版本5),它由MD2、MD3、MD4发展而来,由Ron Rivest(RSA公司)在1992年提出,被广泛应用于数据完整性校验、数据(消息)摘要、数据加密等。MD2、MD4、MD5 都产生16字节(128位)的校验值,一般用32位十六进制数表示。MD2的算法较慢但相对安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。在互联网上进行大文件传输时,都要得用MD5算法产生一个与文件匹配的、存储MD5值的文本文件(后缀名为 .md5或.md5sum),这样接收者在接收到文件后,就可以利用与 SFV 类似的方法来检查文件完整性,绝大多数大型软件公司或开源组织都是以这种方式来校验数据完整性,而且部分操作系统也使用此算法来对用户密码进行加密,另外,它也是目前计算机犯罪中数据取证的最常用算法。

  • SHA<n>系列

  安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。
SHA系列算法的摘要长度分别为:SHA1为20字节(160位)、SHA224为28字节(224位)、SHA256为32字节(256位)、 SHA384为48字节(384位)、SHA512为64字节(512位),由于它产生的数据摘要的长度更长,因此更难以发生碰撞,因此也更为安全,它是未来数据摘要算法的发展方向。由于SHA系列算法的数据摘要长度较长,因此其运算速度与MD5相比,也相对较慢。

  • CRC<n>系列
  • RIPEMD、PANAMA、TIGER、ADLER32 等。

 

三、数字签名

  数据签名又称为数据加签。

  签名,即自己写自己的名字,尤其为表示同意、认可、承担责任或义务。在实际生活中,一些方式(如字迹,指纹等)一直被用作签名者身份的证明。签名是可信的具有如下特点:不可伪造的;不可重用的;不可抵赖的。签名即代表着同意,并产生法律效力,在法律上赋予了文件以真实性。
  数字签名,简单来说就是通过提供可鉴别的数字信息验证自身身份的一种方式。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。分别由发送者持有能够代表自己身份的私钥 ,由接受者持有与私钥对应的公钥 ,能够在接受到来自发送者信息时用于验证其身份。

1、特点:

  • 防冒充

  其他人不能伪造对消息的签名,因为私有密钥只有签名者自己知道,所以其他人不能伪造出正确的签名结果。要求私钥的持有人保存好自己的私钥。

  • 防篡改

  对于数字签名,签名和原有文件己经形成一个混合的整体数据,不能篡改,从而保证了数据的完整性。

  • 防重放

  在数字签名中,如果采用了对签名报文添加流水号、时戳等技术,可以防止重放攻击.

  • 防抵赖

  数字签名可以鉴别身份,不可能冒充伪造。签名者无法对自己作过的签名抵赖。要防止接收者的抵赖,在数字签名体制中,要求接收者返回一个自己签名的表示收到的报文,给对方或者是第三方,或者引入第三方仲裁机制。这样,双方均不可抵赖。

  • 机密性

  有了机密性的保证,截取攻击就不会成功了。对要签名的消息进行适合的加密操作来保证机密性,这些涉及到加密或签密理论。

 

2、数字签名原理

  • 可以理解:用户认证,用来验证用户身份,用来确保信息发布人的身份和信息的完整性。
  • 数字签名过程:
    • 将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证,只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。
    • 将该报文摘要值用发送者的私人密钥加密即称数字签名,然后连同原报文和数字证书(包含公钥)一起发送给接收者。
    • 接收方收到数字签名后,用同样的HASH算法对报文计算摘要值,然后将数字签名用发送者的公钥进行解签,并与报文摘要值相比较,如相等则说明报文确实来自所称的发送者。

上述过程可以借用下图完美诠释:

 

 为了防止公钥在传输过程中被调包,需要证书中心(简称CA)为公钥做认证。证书中心用自己的私钥,对公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate),客户端用CA的公钥解开数字证书,从而确定公钥的真实性。

 

3、数字签名算法

  • RSA

  RSA是目前计算机密码学中最经典算法,也是目前为止使用最广泛的数字签名算法,RSA数字签名算法的密钥实现与RSA的加密算法是一样的,算法的名称都叫RSA。密钥的产生和转换都是一样的,包括在售的所有SSL数字证书、代码签名证书、文档签名以及邮件签名大多都采用RSA算法进行加密。

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准

RSA算法支持公钥加密、私钥解密以及私钥加密、公钥解密。

但是RSA数字签名算法存在签名易被伪造和计算时间长的弱点,因此实际对文件签名前,需要对消息经单向散列函数计算其消息摘要。

比如 MD5withRSA 是将正文通过MD5消息摘要后,将其再次通过RSA密钥加密,生成数字签名。

具体消息摘要算法结合RSA算法的选择如下表格所示:

 

  •  DSA

DSA全称Digital Signature Algorithm,DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,所以它比RSA要快很多,其安全性与RSA相比差不多。

那么签名算法与公钥加密算法的区别是什么呢?

签名算法,用来确保信息发布人的身份和信息的完整性,不能用来做加密传输,为了实现这个功能,信息的原文(或者消息摘要)必须随着签名一起传输和公布才能被验证。而 RSA 是公钥加密体系,它可以用来加密传输(即信息原文在传输中加密,到达对方后解密),它也可以实现签名验证。

具体消息摘要算法结合DSA算法的选择如下表格所示:

 

  •  ECDSA 

  椭圆曲线数字签名算法 ECDSA 是使用椭圆曲线密码 ECC 对数字签名算法 DSA 的模拟。ECDSA 于1999年成为 ANSI 标准,并于2000年成为 IEEE 和 NIST 标准。它在1998年既已为ISO所接受,并且包含它的其他一些标准亦在ISO的考虑之中。

比特币所使用的数字签名算法就是椭圆曲线数字签名算法。

ECC 与 RSA 相比,有以下的优点:

(1)相同密钥长度下,安全性能更高,如160位ECC已经与1024位RSA、DSA有相同的安全强度。

(2)计算量小,处理速度快,在私钥的处理速度上(解密和签名),ECC远 比RSA、DSA快得多。

(3)存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。

(4)带宽要求低使得ECC具有广泛得应用前景。

具体消息摘要算法结合ECDSA算法的选择如下表格所示:

 

四、应用

1、报文传输

  前后端数据报文交互或者外部系统对接通常采用加密加签方式实现数据安全。公钥一般用来加密,私钥用来签名。

  • 关于作用

示例:A->B:

  • A对信息签名的作用是确认这个信息是A发出的,不是别人发出的;(用户认证)
  • A对信息加密主要是保证信息内容不会被其他人获取,只有B可以获取。

简而言之,加密加签保证端到端整个过程的唯一确定性,这个信息是A发出的(不是别人),且是发给B的,只有B才被获得具体内容(别人就算截获信息也不能获得具体内容)。

  • 关于密钥

整个端对端过程会涉及两组四个密钥:

A的公钥(PUB_A),A的私钥(PRI_A);

B的公钥(PUB_B),B的私钥(PRI_B)。

通常:公钥是公开给别人的,私钥只能自己私密持有(不可泄露),且公钥和私钥唯一对应使用。

示例:A->B,加签加密:

  • A先用自己的私钥(PRI_A)对信息(一般是信息的摘要)进行签名。(通常先信息摘要再加签)
  • A接着使用B的公钥(PUB_B)对信息内容和签名信息进行加密。

示例:B获取A信息内容,解密验签:

  • 用自己的私钥(PRI_B)解密A用B的公钥(PUB_B)加密的内容;
  • 得到解密后的明文后用A的公钥(PUB_A)验签A用A自己的私钥(PRI_A)的签名。

从而,整个过程就保证了端到端的唯一确认。A的签名只有A的公钥才能验签,这样B就能确认这个信息是A发来的;A的加密只有B的私钥才能解密,这样A就能确认这份信息只能被B读取。

  • 常见应用:SHA1WithRSA+AES

     SHA1WithRSA实现报文非业务参数列表加签/验签(报文非业务参数列表生成的混合字符串&),AES实现报文业务参数加密/解密(接口业务参数对象JSON字符串)。

SHA1WithRSA:

     SHA1WithRSA将报文接口参数混合字符串通过SHA1信息摘要之后,将其再次通过RSA私钥加密,生成数字签名,即:加签。(先压缩,再非对称加密,效率更高)

如果请求参数数据量较少,可以不用考虑数据压缩(数据摘要),采用:RSA加签/验签,AES加密/解密。

整个端对端过程需要:

  • RSA算法,用于加签验签。
  • SHA1WithRSA算法,用于先信息摘要后加签验签,依赖于RSA算法密钥对。
  • AES算法,加密解密。

 

2、密码传输

密码为敏感数据,对于密码数据的传递通常采用组合加密技术,即:采用对称算法加密数据,再采用非对称算法管理对称算法的秘钥。

  • 常见应用:AES+RSA

发送请求:

  • 生成RSA密钥对:公钥和私钥。服务请求方保留公钥,接收方保留私钥。
  • 请求方随机生成AES秘钥(KEY)。
  • 请求方用AES密钥对密码数据进行加密。
  • 请求方用RSA公钥对AES密钥进行加密。
  • 将加密后的密文和加密后的AES密钥发送给接收方。
  • 接收方用RSA私钥对加密后的AES密钥进行解密,获得真实的AES密钥。
  • 接收方用真实的AES密钥对密文进行解密,得到密码明文。

返回响应:

  通过发送请求过程,请求方和接收方都获得相同的AES密钥(KEY),在数据回传时,只需要将原文使用AES密钥加密,回传给请求方即可。

 

3、密码存储

  根据摘要算法的不可逆、获得摘要信息更小特征,因此通常采用摘要算法(哈希算法)SHA256对密码数据加密存储入库。

典例:用户编号userNo + 加盐值的密码混合字符串--->采用SHA256加密,再存储到数据库。

 加盐值:主要为了增加破解的难度,降低破解的可能性。

 

五、参考

 

 

posted @ 2020-09-06 16:50  马非白即黑  阅读(3660)  评论(0编辑  收藏  举报