obsidian-notes/加密/【安全算法】一文带你简要了解常见常用的.md
CSSC-WORK\murmur 3e6078442b init version
2024-04-15 11:19:57 +08:00

287 lines
38 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 0 前言
笔者有多年从事金融POS机系统开发的经验对数据的安全理解较深期间对各式各样的安全算法也是经常打交道现整理一些基本概念仅供大家学习和参考。
# 1 算法的大致分类
这里所说的算法指的是常见的数据处理算法(国际/国标通用的那种),大致可分为:对称加解密算法、非对称加解密算法、信息摘要算法。下文将对这几类算法做一个对比和总结。
## 2 对称加解密算法
对称加密算法顾名思义就是算法的执行过程是对称的用最简单的话说就是加密方和解密方使用的密钥是一致的只不过执行的过程是相反的一方A对明文P使用密钥K1进行加密得到密文C另一方B对密文C使用密钥K2进行解密拿到明文P; 要想两者的明文P和P相等必须保证密钥K1等于K2这就是对称加密算法的基本要求。
常见的对称算法有DES、TDES、AES、SM4、RC2/4等。
## 2.1 DES/TDES算法
DES全称为Data Encryption Standard即数据加密标准是一种使用密钥加密的块算法1977年被美国联邦政府的国家标准局确定为联邦资料处理标准FIPS并授权在非密级政府通信中使用随后该算法在国际上广泛流传开来。【摘自百度百科 https://baike.baidu.com/item/DES/210508】
DES算法有以下特点密钥长度适中、实现原理较为简单、加解密过程较为高效。通常我们见到的DES密钥长度为8字节即64比特位但是实际使用的密钥的有效位是56比特位即每个字节的最高位第8、16、24、32、40、48、56、64比特位实际都是不参与算法加解密运算的我们称之为校验位它们存在的目的是使得每个密钥都有奇数个1。由此可知有2组8字节不完全相同的密钥加解密结果是一致的这种情况是可能存在的。
算法对数据做加解密都是以一定长度的数据块作为输入的并且对称算法有个特点输入数据块的长度一般等于密钥的长度也就是说在进行DES运算加密或解密输入的数据长度都必须是8字节。同时在DES对称算法中输出的数据长度等于输入的数据长度即8字节输入8字节输出。至此有的童鞋会问如果我们要执行加密的数据远远不止8字节呢应该怎么办这个问题就已经涉及到加解密过程的数据分组问题了常见的分组方式有ECB方式和CBC方式后续会对这2种方式做更为详细的介绍。
TDES全称是Triple Data Encryption Standard即我们常说的3DES三重数据加密算法TDEATriple Data Encryption Algorithm。它是DES算法的加强版本。TDES的执行过程如下其中C表示密文、P表示明文、E表示加密运算、D表示解密运算、Kx表示不同组别的密钥。
TDES加密过程为C=Ek3(Dk2(Ek1(P)))
TDES解密过程为P=Dk1(EK2(Dk3(C)))
由上可知标准的TDES的密钥长度是24字节的即K1-K2-K3但在实际生产使用过程中也常使用16字节长度的密钥此时密钥的K3部分将由K1来充当即K1-K2-K1强制把16字节的密钥转换为24字节的密钥。另一方面从TDES加解密的过程我们也可以发现当K1=K2使用TDES的效果与单DES的效果是一致的。
注意的是前面说到对称算法加解密运算输入数据长度一般等于密钥的长度而TDES的密钥长度是24字节但这并不意味着执行TDES加解密时输入数据长度必须是24字节相反它的输入数据长度还是8字节与DES运算的输入完全一样。这也就是为什么说TDES是DES的加强版。同样的8字节输入数据经DES运算和TDES运算通常是不一样的除非TDES的密钥满足K1=K2的关系。
## 2.2 AES算法
高级加密标准全称是Advanced Encryption Standard缩写AES。在密码学中又称Rijndael加密法是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES已经被多方分析且广为全世界所使用。经过五年的甄选流程高级加密标准由美国国家标准与技术研究院NIST于2001年11月26日发布于FIPS PUB 197并在2002年5月26日成为有效的标准。2006年高级加密标准已然成为对称密钥加密中最流行的算法之一。【摘自 百度百科 https://baike.baidu.com/item/aes/5903?fr=aladdin】它是一种不同于DES的另一类对称算法加密的强度比DES高破解的难度也较大同时实现它的加解密运算难度也高一些。
由于它也是对称加密加密算法所以前面对加密算法描述的特点它都有不同的是它的是密钥长度有3种可能值16字节、24字节、32字节分别对应的密钥强度为128比特位、192比特位和256比特位。执行加解密运算时输入数据的长度为16字节128比特位且输出数据长度等于输入数据长度。
2.3 SM4算法
SM算法是国密算法国密即国家密码局认定的国产密码算法。主要有SM1、SM2、SM3、SM4其中SM1 为对称加密其加密强度与AES相当但该算法不公开调用该算法时需要通过特定的加密芯片的接口进行调用SM4为对称加密算法SM3为信息摘要算法SM2为非对称加密算法。后续的文章会对SM算法做更为详细的介绍。
SM4算法的特点是密钥长度和分组长度均为128位虽然密钥长度跟DES类似但加密强度却能与AES媲美并且在国家信息安全战略的大背景下国密算法的大力推广得到了越来越多的支持。像目前国内出厂很多涉及金融安全的终端产品如POS机、ATM机、密钥键盘、金融交易后台、商业银行系统等等都是强制要求必须支持国密相关算法并且发售的机器或上线的系统都必须通过国家密码局授权的国密认证拿到对应的国密认证证书才能最终商用这或许能成为SM算法大放异彩的一个契机若干年后指不定街边的小小机器都在跑国密算法呢。
2.4 RC2、RC4算法
RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法它可作为DES算法的建议替代算法。它的输入和输出都是64比特。密钥的长度是从1字节到128字节可变但目前的实现是8字节1998年
RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇是由于其核心部分的S-box长度可为任意但一般为256字节。该算法的速度可以达到DES加密的10倍左右且具有很高级别的非线性。
尤其RC算法的安全性比较低在常见的安全场景下一般都不会使用RC算法。
2.5 对称加密算法对比总结
中文名称 密钥长度可能值 加解密数据块长度 资源消耗 运算速度 安全性
简称数据加密标准/DES 8字节 8字节 中 较快 低
3重数据加密标准/TDES 16字节、24字节 8字节 8字节 高 慢 中
高级加密标准/AES 16字节、24字节、32字节 16字节 低 快 高
国密对称算法/SM4 16字节 16字节 高 快 高
RC算法RC2 目前使用是8字节 8字节 低 低 低
RC算法RC4 密钥长度可变 长度可变 低 快快DES10倍
3 非对称加解密算法
世界万物都是平衡的正如计算机的世界一样有0的地方就一定有1同样的在算法理论上既然有【对称加密算法】那肯定就会有【非对称加密算法】。
非对称算法顾名思义算法的执行过程是不对称的也就是说加解密双方的密钥是不对称的。在非对称算法的理论上密钥有公钥和私钥之分其中私钥是代表自己唯一身份的一组密钥标识不同的非对称加密算法采用不同的数学理论来标识这个“唯一性”比如RSA算法使用的是“很大的素数”这种方法来标识通常来说私钥是不对外公开的就好比藏在自己心里的秘密一样不能被外人知晓否则数据的加密就变得不可靠存在密钥泄露的风险。与私钥对应的密钥叫公钥公钥与私钥正好相反它是允许对外公开的也就是任何人都可以持有加密方的公钥信息。看到这里很多童鞋开始疑问既然密钥公钥都公开了那加密还有什么用谈何安全性可言有这样疑问的童鞋大概思路还停留在【对称加密算法】的基础上等我详细讲解完【非对称加密算法】的加密和解密你就一定明白到底是怎么一回事了。
非对称算法的加密和解密的特点是一段数据明文经私钥加密后则需要使用该私钥对应的公钥做解密反之一段数据明文经公钥加密后则需要使用该公钥对应的私钥做解密即【公钥加密对应私钥解密私钥加密对应公钥解密】。使用公式表达如下其他E表示加密D表示解密PriKey表示私钥PubKey表示公钥A、B分别表示通讯双方P表示数据明文C表示数据密文。
通讯方A 通讯方B
EP by PriKey[A] = C 对应 DC by PubKey[A] = P
EP by PubKey[B] = C 对应 DC by PriKey[B] = P
通过如上公式我们可以很清晰的看到通讯AB双方需要使用非对称算法加密通讯报文必须想方设法获取到对方的公钥这样整个加密的通道才能完全打通。而前面我们也说到了自己的公钥一般都是公开的允许任何人持有只要保证自己的私钥是保密的即可这就是SSL通讯的理论基础。在SSL通讯之前通常会有通讯握手动作这个握手动作就是为了取得对方可信任的公钥至于如何保证自己取得的公钥就是对方的真实公钥而不是非法监听报文的“中间人”的假公钥这就是SSL双向认证要解决的核心问题。该部分的内容后续会有更为详细的文章做更近一步的介绍。
3.1 对称加密算法与非对称加密算法的本质区别
通过上面对非对称算法的介绍,大家可以了解到非对称算法核心的部分就是:密钥分为公钥和私钥,私钥保密公钥公开,私钥加密的密文需要使用公钥解密,公钥加密的密文需要私钥解密。具体的非对称算法和对称算法的区别如下表所列:
算法 密钥类似 加解密的特点
对称加密算法 通讯双方有且只有一个共同的密钥K 加密方使用密钥K加密解密方使用密钥K解密
非对称加密算法 密钥有分私钥和公钥;通讯双方分别持有自己的私钥和对方的公钥; 加密方使用自己的私钥加密数据,解密方使用对方的公钥解密数据;加密方使用对方的公钥加密数据,解密方使用自己的私钥解密数据;
3.2 非对称加密算法的分类和对比
常见的非对称加密算法有RSA算法、SM2算法前者是国际通用的算法后者是国密算法的一种。
3.2.1 RSA算法
RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特Ron Rivest、阿迪·萨莫尔Adi Shamir和伦纳德·阿德曼Leonard Adleman一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。【摘自 百度百科 RSA算法 】
RSA加密算法的密钥长度不像我们所认知的对称加密算法 它的密钥长度是可变的一般用位来表示常见的有1024位和2048位甚至4096位。密钥的位数越长理论上来说解密的难度越大加密的强度就越大。综合加密级别和使用的便利性【RSA2048】是我们最常见的。当RSA的密钥位数确定了那它的【模长】也就确定了模长的值为密钥位数对应的字节数计算公式如下其实M为模长B为密钥的长度
M = B + 7 / 8 当M等于1024位时对应的模长为128字节当M等于2048位时对应的模长为256字节。
了解【模长】的概念之后我们需要知道RSA算法执行加密解密操作时基本的数据块长度。在RSA算法中执行加密和解密操作输入的数据块长度都必须等于模长否则算法内部无法处理即RSA密钥的长度不同对应输入数据块的长度也是不同的这一点与DES、AES等对称加密算法是完全不一样的。
假设我们有4个RSA接口
RSA_prikey_encrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
RSA_prikey_decrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
RSA_pubkey_encrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);
RSA_pubkey_decrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);
有趣的是当我们有一段固定的数据in分别输入RSA_pubkey_encrypt和RSA_pubkey_decrypt接口得出的out居然是一样的同样的在类似的私钥接口也有类似的现象。经过这个实验我么可以得出结论根本没有所谓的公钥加密和公钥解密之分公钥加密就是公钥解密私钥加密也就是私钥解密所以我们应该对公钥私钥、加密解密做个统一叫法应该就是私钥运算和公钥运算。所以以上的接口应改为
RSA_prikey_operation(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
RSA_pubkey_operation(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);
3.2.2 SM2算法
SM2算法是国产的非对称算法它的诞生就是为了取代RSA算法。SM2性能更优更安全密码复杂度高、处理速度快、机器性能消耗更小。SM2算法和RSA算法比较如下
SM2 RSA
算法结构 基于椭圆曲线ECC 基于特殊的可逆模幂运算
计算复杂度 完全指数级 亚指数级
存储空间 192-256bits 2048-4096bits
私钥生成速度 较RSA算法快100百以上 慢
加解密速度 较快 一般
SM2算法与RSA算法类型它也有公钥和私钥之分它的密钥特点是私钥固定长度32字节而公钥有x和y两个分量每个分量都是32字节总共是64字节。
在执行加密运算时,输入数据块的长度是变长的,而加密后的密文长度等于输入长度+96字节。
在执行签名运算时输入数据块的长度也是变长的但签名后的数据长度则固定为64字节。
限于篇幅原因后续再写专门的文章来介绍SM2算法。
3.2.3 ECC算法
椭圆曲线密码学英语Elliptic curve cryptography缩写为ECC一种建立公开密钥加密的演算法基于椭圆曲线数学。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。
ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射基于Weil对或是Tate对双线性映射已经在密码学中发现了大量的应用例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。
3.2.3.1 优点
安全性高:
有研究表示160位的椭圆密钥与1024位的RSA密钥安全性相同。
处理速度快:
在私钥的加密解密速度上ecc算法比RSA、DSA速度更快。
存储空间占用小:
带宽要求低。
3.2.3.2 公钥密码系统的加密算法ECC与RSA的对比
第六届国际密码学会议对应用于公钥密码系统的加密算法推荐了两种基于大整数因子分解问题IFP的RSA算法和基于椭圆曲线上离散对数计算问题ECDLP的ECC算法。RSA算法的特点之一是数学原理简单、在工程应用中比较易于实现但它的单位安全强度相对较低。用国际上公认的对于RSA算法最有效的攻击方法—一般数域筛(NFS)方法去破译和攻击RSA算法它的破译或求解难度是亚指数级的。ECC算法的数学理论非常深奥和复杂在工程应用中比较难于实现但它的单位安全强度相对较高。用国际上公认的对于ECC算法最有效的攻击方法—Pollard rho方法去破译和攻击ECC算法它的破译或求解难度基本上是指数级的。正是由于RSA算法和ECC算法这一明显不同使得ECC算法的单位安全强度高于RSA算法也就是说要达到同样的安全强度ECC算法所需的密钥长度远比RSA算法低。这就有效地解决了为了提高安全强度必须增加密钥长度所带来的工程实现难度的问题。
3.2.3.3 常见的几种ECC椭圆参数曲线
根据ECC算法的数学原理不同的椭圆参数曲线就可以认为对应着不同的加解密方式加解密双方需要使用相同的椭圆参数曲线。
常见的椭圆参数曲线有SECP256NIST P-256、BrainpoolP256、FRP256。
3.2.3.4 ECC算法的常用接口
生成公私要对ecc_generate_key_pair
这个应用场景主要用于设备初始化,生成私钥和公钥。
私钥运算ecc_signature
这个应用场景主要是用于数据签名。
公钥运算ecc_verify
这个应用场景主要是用于签名验证,即验签。
密钥交互ecc_ecdh
这个应用场景主要是用于密钥交换。
3.2.3.5 ECC算法运算长度
ECC算法的密钥越长安全度越高破解的难度越大当然运算的复杂度也较高。
一般来说常用的ECC密钥强度是64字节的私钥即所谓的256bits密钥
这个时候一般签名出来的数据长度就是64字节。
3.3 非对称加密算法的应用场景
值得注意的是,数据加解密的过程中,虽然公钥和私钥都可以用于加密,也都可以用于解密,并没有严格的限制;但是,在实际的应用中,通常有:
私钥加密,公钥解密:通常应用有签名、验签,即产生签名的一方使用自己的私钥对数据进行签名操作,而验签签名数据是否合法的一方使用签名方的公钥对签名数据进行验签;所以这里可以简单地认为,签名就是私钥加密,验签就是公钥解密。
公钥解密,私钥解密:通常应用在对数据的加密传输,即加密方使用解密方的公钥做加密动作,这样就意味着这段加密数据只有解密方一人能解开,因为解密方的私钥是不公开的,只有它自己知道,这样就可以很好地保证的加密数据的安全性。
4 信息摘要算法
4.1 什么是信息摘要算法?
信息摘要算法是一种对“信息”进行【摘要化】处理的算法。通俗地来说,就好比本文,假设它很长,那么读者在第一时间看到它的时候并不会完全阅读全文,而是往往会先去读一下文章的【摘要】,通过文章的摘要部分,简要了解下文章的主要内容。类似地,在信息密码学领域,同样有这种的操作,这就是信息摘要算法的产生背景。
假设有一段数据专业术语叫“消息”经过【信息摘要算法】处理后它将变成一段固定长度的【信息摘要】用公式表示如下其中M表示消息原文D表示输出的消息摘要P表示信息摘要算法。
PM with any length = Dwith fixed length
通过公式,我们可以很直观地看出,信息摘要算法的输入数据长度是可以为任意长度,但是在实际使用的过程中,倘若输入数据的长度过于长,我们会采用将输入数据块采用数据分组的方式一步步输入,最后得到信息摘要结果的输出。而输出的信息摘要,通常都是固定长度的,至于信息摘要结果的固定长度是多少,是与具体的摘要算法相关的,下文会详细介绍各种信息摘要算法的摘要输出情况。
还有一点公式中并没有体现“加密和解密的相互过程”也就是说【信息摘要算法是单向的不可逆的】。严格来说它并不是一种【加密】算法仅仅是【摘要】算法。由于它计算的不可逆性所以经信息摘要算法计算出来的信息摘要D一定程度上就代表了信息原文M。倘若有原文M1和原文M2经过相同的信息摘要算法P得到相同的信息摘要D这种情况在密码学上我们称之为【碰撞】。一般而言 好的摘要算法,没有人能从中找到【碰撞】或者说极度难找到。虽然【碰撞】是肯定存在的(碰撞即不同的内容产生相同的摘要),但因目前信息科学发达程度非常高,计算机的运算能力得到了前所未有的提升,仅通过计算机运算的暴力破解,某些较弱的信息摘要算法就能被【碰撞】成功。
4.2 常见的信息摘要算法
常见的信息摘要算法有MD2/4/5、SHA1/SHA224/SHA256/SHA384、SM3算法、MAC算法等。
4.2.1 MD(Message Digest):消息摘要
MD算法是诞生于比较早的消息摘要算法在网络应用上也比较常见比如在某个网站上下载一个文件通常它会标识该文件的MD5值当下载者完成下载文件到本地之后使用工具对下载的文件执行MD5计算求出一个MD5摘要值与网站上给出的参考MD5值进行对比如果两者相等则表示下载的文件是可靠的没有被篡改过的反之如果MD5值对不上则表明下载的文件是被篡改过的可能是网络攻击者投放的病毒携带文件或者是在下载的过程中文件出现了损坏等情况此时应该对文件进行删除操作。
4.2.2 SHA(Secure Hash Algorithm):安全散列
SHA系列的算法从版本上划分有SHA-1和SHA-2SHA-1和SHA-2是该算法的两个不同版本。它们两者之间在构造上散列结果是怎样被原始数据创建出来的和签名的位数上都有不同和签名的位长。你应该把SHA-2看作是SHA-1的继承者因为这是一个整体上的改进。
SHA-1就是我们常见到的SHA1SHA-2主要有SHA224、SHA256、SHA384、SHA512等等不同的数字代表信息摘要输出的位数。与MD系列算法类似数字值越高表示摘要算法的安全性越高计算的复杂性也越大但不同于MD算法的是SHA算法每个算法输出的信息摘要长度是不一样的。
SHA1产生的信息摘要为160bits即20字节
SHA224产生的信息摘要为224bits即28字节
SHA256产生的信息摘要为256bits即32字节
SHA384产生的信息摘要为384bits即48字节
SHA512产生的信息摘要为512bits即64字节
更为详细的SHA算法介绍可以参考 https://www.cnblogs.com/block2016/p/5632234.html
4.2.3 SMShangyong Mima国密算法即商用密码
经查证国密算法的英文字母缩写SM其实是【商用密码】的中文拼音首字母简写。国密即国家密码局认定的国产密码算法即商用密码。
在国密算法的列表中SM3算法就是实现了类似MD算法和SHA算法的信息摘要算法。它和其他2种摘要算法一样都是不同长度的信息输入产生固定长度的摘要输出。不同的是它输出的信息摘要长度固定为256bits即32字节。在实际使用过程中SM3算法比较少会单独使用而是配合SM2【非对称加密算法】配合使用实现数字验签和消息验签的应用。
4.3.4 MAC(Message Authentication Code):消息认证码
MAC算法不同于以上3种信息摘要算法MAC算法是带密钥的Hash函数消息的散列值由只有通信双方才知道的秘密密钥K来控制。此时Hash值称作MAC。表达公式如下所示其中M表示信息原文P表示MAC算法MAC表示输出的MAC值K表示MAC密钥
PM with any length by K = MACwith fixed length
通过公式我们可以发现计算MAC通常会有KEY的参与那么在信息安全通讯领域接收方要想验证收到的数据是否正确就需要利用以上公式输入MAC密钥重新计算一遍MAC值然后对比计算值和收到的MAC值若相等才认为数据是合法。这里涉及到一个MAC KEY发送方和接收方对相同的数据进行MAC运算能得到相同MAC值的前提除了两者需使用相同的MAC算法外还需要保证两者的MAC KEY是一致的通常计算MAC采用的是对称加密算法。至于在实际生产应用过程中如何保证两者的MAC KEY是一致的或者说MAC KEY是如果从一方传递到另一方的这又是另一个话题这种应用场景在POS机与银行后台信息交互的安全性就是利用MAC KEY的。
MAC算法是一个统称它很多种实现在POS行业常用的MAC算法有CUP模式、EMV2000模式、或者自定义形式的MAC算法。MAC算法的核心是如何将输入数据分组利用MAC KEY做一些XOR、移位、加密等操作使得输入数据散列化最后再利用MAC KEY执行加密操作通常为对称加密得到MAC值。
值得注意的是虽然MAC算法有MAC KEY的参与但是它计算过程依然是单向的不可逆的这也是为什么会把它归为【信息摘要算法】的主要原因。
4.3.4 常见信息摘要算法的对比
信息摘要算法 信息输入长度 摘要输出长度 密钥 安全性
MD5 * 128bits16字节 无 低,有被碰撞的可能性
SHA1 * 160bits20字节 无 低,有被碰撞的可能性
SHA224 * 224bits28字节 无 较高
SHA256 * 256bits32字节 无 高,推荐使用,最常使用
SHA384 * 384bits48字节 无 高,推荐使用,推荐使用
SHA512 * 512bits64字节 无 高,高安全性场景下推荐使用
SM3 * 256bits32字节 无 高,推荐使用
MAC算法 * 视不同的MAC算法而不同有的是8字节有的是16字节 有 高,除非密钥破解
表中表示输入长度为“任意值”此处的任意值通常也是有限制的比如SHA256应小于2的64次方而SHA512*应小于2的128次方。
4.3 信息摘要算法的应用场景
常见的信息摘要算法的应用场景有以下几种:
4.3.1 网络文件下载
前面也简单提到了在网络文件下载的时候通常会有附上对应下载文件的摘要值常用的是MD5或SHA1值这个主要目的是给下载者在下载完网络文件后做最后的文件正确性和完整性的确认。如果计算出来的摘要值与网站上的摘要不相等我们应认为下载的文件是不可信任的应当做删除处理。
4.3.2 数字签名和信息验签
在产生数学签名的过程中通常会有一步是对输入数据原文做摘要运算这样做的主要目的是将输入数据原文迷你化。由于经摘要算法处理后信息摘要的长度都是一定的所以在做签名运算的时候只需要对信息摘要做签名运算在一定程度上就是输入信息的原文做签名运算。输入数据签名后发送方会将签名数据附在输入信息的尾部一同发送给接收方。而在验签流程中接收方收到发送方的信息原文和签名值首先需要做的是根据双方协商的信息摘要算法做同样的摘要运算得到摘要值M然后使用密钥对签名数据进行解密运算得到发送方的摘要M如果M = M则表示验签通过接收的数据是可任性的。
关于数字签名的具体细节,后续会有更为详细的文章做更进一步的介绍,比如常见的签名算法是怎么工作的,等等。
4.3.3 安全报文传输
这种应用场景主要是MAC算法的应用最常见的就是POS与银行后台的报文传输。由于涉及到金融风险所以在POS机与银联后台通讯的过程中除了对个人账户的敏感信息如卡号、卡密码等做加密处理外还需要对整一个通讯报文做MAC计算在发送报文的时候MAC值附在原始的密文后面以供接收方对接收的密文做MAC校验。至于为何要这样做就是为了保证通讯报文的其他信息要素不能被篡改比如消费的金额。试想下如果你在超市消费了1.00元但是由于报文被截取了攻击者将报文中的消费金额篡改为100.00元这种情况下除非报文攻击者拿到了POS与银行后台通讯的MAC KEY否则它计算出来的MAC值必定与银行后台计算的MAC值对不上进而被银行后台当做非法报文做丢弃处理。但如果银行后台没有MAC值校验这一步操作那么对于消费者而言就是明明消费了1.00元却被扣款100.00元;这个后果将变得不堪设想。
5 非对称算法和信息摘要算法的核心应用:数字签名和消息验签
5.1 数字签名是什么?
签名一个在日常生活中很经常听到并使用的名字。在平时我们经常会签署各式各样的文件在我国的法律中亲笔签名在一定程度上是具有法律效力的表示当事人对签署的文件知悉并且认可一旦“签名”生成后它具备了法律意义。又比如我们在POS机消费后打印的消费单据上签署自己的姓名则表示持卡人认同这笔消费交易银行或收单机构拿到这张经消费者签名的单据就可以完全最终消费款项的清算。在我国POS机消费时大部分时候我们都要输入银行卡密码打印消费单据后还需要签署自己的姓名而在国外由于他们的征信系统较为发达往往在POS机消费时是不需要输入银行卡密码的而消费的唯一凭证确认就是消费单据上签署的签名。在此种情况下POS机的操作员有义务确认消费者签署的姓名与卡片背部的参照签名笔迹是否一致同时操作员也有权利当发现消费者签署的姓名笔迹与卡片后背签名笔迹差异较大时拒绝此卡片消费。通过以上的一些生活例子我们可以了解到【签名】是一个很重要的玩意一定程度就代表了本人的认可和无异议。
那么,在数字信息领域,究竟什么是【数字签名】呢?数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。(摘自: 百度百科 数字签名)。
从密码学的角度来说,【数字签名】主要解决了两个核心问题:发送的消息是完整的,未被篡改的;接收的消息一定就是对应发送者发送的,别人无法仿制。前者体现的是数据的完整性,后者体现的是数据的不可抵赖性。
5.2 为什么数字签名采用非对称算法和信息摘要算法?
从上一小结,我们可以知道【数字签名】的两个核心特点:不可抵赖性和完整性。通过对之前学习的非对称加密算法和信息摘要算法的基础知识一对比,我们可以发现:
非对称加密算法正好解决了不可抵赖性的问题,因为在非对称算法体系中,经私钥加密的数据只有私钥对应的公钥才能解开,别人的公钥是无法解密出原文的,这就是不可抵赖的体现,即任何人都无法冒充发送者。
信息摘要算法恰好解决了数据完整性的问题,因为在信息摘要算法中,不同的数据输入,产生的摘要是不一样的;当摘要数据一样时,我们就可以认为数据原文是一致的,也就认可了数据是完整的,没有被篡改的。
两者一结合,恰好就诞生了【数字签名】这个最佳实践,达到了数据传输中不可修改性的安全要求。
5.3 数字签名的操作过程
前面的讲解我们知道了【数字签名】的特性。在实际的应用过程中数字签名的应用公式如下所示其中M表示消息原文S表示数字签名P表示非对称算法的私钥运算D表示信息摘要算法的运算。
PDM [with any length] = S [with fixed length]
具体来说,发送方产生一个数据签名,需要经过以下几个步骤:
使用【信息摘要算法】,对任意长度的信息原文做摘要运算,得到一段固定长度的摘要数据;
如果该摘要数据的长度没有达到非对称加密算法做加解密运算的输入长度通常还需要使用填充标准对摘要数据进行必要的填充以达到非对称算法的运算条件常用的填充标准有PKCS1-padding
使用【非对称加密算法】的私钥对填充后的摘要数据做加密运算,得到一段固定长度的数字签名;
发送方将数字签名拼接在信息原文的尾部,一同发送给接收方,完成数据的单方向传输。
经过以上的步骤后,发送方就成功将信息原文和对应的数字签名,传递给了接收方;剩余的事,就是接收方对数据的验签操作。
5.4 消息验签的操作过程
接收方收到发送方发送的数据报文(信息原文+数字签名)后,需要经历以下步骤来完成对报文消息的验签操作:
首先,对数据报文进行分解,提取出信息原文部分和数字签名部分;
与产生数字签名流程一样使用相同的信息摘要算法对信息原文做摘要运算得出消息原文的摘要D1
与产生数字签名流程相反使用【非对称加密算法】中签名私钥对应的公钥对数字签名部分做解密运算解密后得到原始发送方发送的经填充后的摘要D2
与产生数字签名流程相反使用相同的数据填充标准对摘要D2做去填充操作得到原始消息的附带的摘要D3
比较D3和D1如果两者相等则表示对数字签名的验签是OK的消息原文的数据是可信任的反之若D3不等于D1则可以认为消息原文是不可信任的数字签名中的【完整性】和【不可抵赖性】可能遭到了破坏我们应该摒弃信息原文。
5.5 数字签名算法的分类
数字签名算法就是使用RSA、MD5、SM2、SHA、SM3等非对称算法和信息摘要算法进行混搭组合。数字签名算法的基本表示格式为xxxWithYYYEncryption其中xxx表示信息摘要算法yyy表示非对称加密算法。常见有的以下几种
md5WithRSAEncryption摘要运算采用MD5非对称算法使用RSA
sha1WithRSAEncryption摘要运算采用SHA1非对称算法使用RSA
sha256WithRSAEncryption摘要运算采用SHA256非对称算法使用RSA【常用】
sm3WithSM2Encryption摘要运算采用SM3非对称算法使用SM2。
5.6 数字签名的核心应用场景https网络通讯
经以上的各小结我们基本掌握了数字签名的主要内容这一小节我们介绍下数字签名的核心应用https网络通讯。
HTTPS全称Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure超文本传输安全协议是以安全为目标的HTTP通道简单讲是HTTP的安全版。即HTTP下加入SSL层HTTPS的安全基础是SSL因此加密的详细内容就需要SSL。
由它的定义可知要想实现https除了应用层需要有http的支持还需要在传输层支持SSL。SSL正是为了解决网络通讯的安全性问题而诞生的简单的说通过SSL的加入在浏览器和网页服务器之间的数据都是加密的而不像之前http那样数据完全在网络上裸奔。目前网络安全问题越来越突出越来越多的网络信息泄露的案例爆发出来正是由于这些安全性问题的暴露SSL的应用得到了越来越多的支持。
限于篇幅原因本小结不对SSL的具体细节做阐述仅仅是简要描述数字签名在SSL中的应用方法后续笔者会写一篇专门的文章来进一步解释SSL通讯的前前后后敬请关注。
说到数字签名在SSL的应用它主要是帮助发送方和接收方协商必要的数据比如网络通讯的加密密钥。我们知道网络数据是庞大的而非对称算法的加密速度是远远比对称加密算法慢的所以在网络通讯的报文不太适合直接使用非对称算法做加密比较合适的做法的通讯报文还是采用对称加密算法加密但是对称加密算法使用的对称密钥是发送方和接收方在正式通讯前进行在线协商的密钥协商的过程使用数字签名的技术保证协商的密钥是完整的保证是没被篡改的并且是不可抵赖的保证是发送方的。在密钥协商时通讯双方分别利用自己的私钥和公钥结合数字签名技术完成协商动作。
上面讲消息验签的时候我们提到消息验签必须要使用签名方的公钥做解密运算这个公钥一定程度上代表了签名方的身份但是我们如何知道我们拿到的公钥就是我们认为的那个签名方的公钥而不是网络攻击“中间人”的公钥呢这就需要CA Certificate Authority帮助我们确认这个公钥的合法性。具体的做法是我们拿到签名方的公钥时它并不仅仅是一个公钥而公钥+经CA签名的数字签名这叫做公钥证书。我们对公钥证书先用CA的公钥对公钥证书的数字签名进行验签如果验签成功则表示我们拿到的公钥是可信任的。那么CA的公钥我们又通过谁来保证它是可信任的呢
这似乎是一个无穷无尽的问题究竟是怎么回事呢笔者在这里先卖个关子有兴趣的读者可以关注笔者后续有关SSL通讯的详细介绍。
😄😄😄😄😄😄
————————————————
版权声明本文为RT-Thread论坛用户「recan」的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。
原文链接https://club.rt-thread.org/ask/article/464c4e4bd66d0d6b.html