287 lines
38 KiB
Markdown
287 lines
38 KiB
Markdown
# 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;三重数据加密算法(TDEA,Triple 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
|
||
|
||
E(P) by PriKey[A] = C 对应 D(C) by PubKey[A] = P
|
||
E(P) by PubKey[B] = C 对应 D(C) 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算法的数学原理,不同的椭圆参数曲线,就可以认为对应着不同的加解密方式,加解密双方需要使用相同的椭圆参数曲线。
|
||
|
||
常见的椭圆参数曲线有:SECP256(NIST 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表示信息摘要算法。
|
||
|
||
P(M with any length) = D(with 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-2;SHA-1和SHA-2是该算法的两个不同版本。它们两者之间在构造上(散列结果是怎样被原始数据创建出来的)和签名的位数上都有不同和签名的位长。你应该把SHA-2看作是SHA-1的继承者,因为这是一个整体上的改进。
|
||
|
||
SHA-1就是我们常见到的SHA1;SHA-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 SM(Shangyong 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密钥:
|
||
|
||
P(M with any length) by K = MAC(with 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 * 128bits(16字节 无 低,有被碰撞的可能性
|
||
SHA1 * 160bits(20字节) 无 低,有被碰撞的可能性
|
||
SHA224 * 224bits(28字节) 无 较高
|
||
SHA256 * 256bits(32字节) 无 高,推荐使用,最常使用
|
||
SHA384 * 384bits(48字节) 无 高,推荐使用,推荐使用
|
||
SHA512 * 512bits(64字节) 无 高,高安全性场景下推荐使用
|
||
SM3 * 256bits(32字节) 无 高,推荐使用
|
||
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表示信息摘要算法的运算。
|
||
|
||
P(D(M [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 |