等保2.0下,密码技术大起底(一)
作者丨北京威努特技术有限公司出品丨等级保护测评
密码技术是信息安全的基础和核心,密码技术发展到今天已经形成了一个庞大的技术体系,每一个算法都非常复杂精妙。本文虽然命名为“大起底”,其实只是走马观花,不研究密码算法的细节,主要对等保2.0涉及的密码技术做大概介绍,重点是理解常用密码算法的特点和适用场景,以及业界成熟的密码技术应用方案。本文分为多个系列,今天是第一篇文章,首先介绍等保2.0对密码技术的相关要求、密码技术的历史和基本概念,重点介绍哈希算法及相关应用。后续的系列将陆续讲解对称加密算法、非对称加密算法、硬件加密、国密算法等内容,欢迎持续关注。等保2.0关于密码技术的规定等保2.0标准已经在2019年12月正式开始实施。等保2.0标准中对密码技术做了明确的要求,密码技术主要出现在三级安全要求和四级安全要求中,主要的领域是通信网络和计算环境,下面表格中列出了等保2.0四级安全要求中对密码技术的相关要求,黑色字体表示是四级针对三级安全级别增强的要求,其他都是三级和四级公共的安全要求。防护大类防护小类密码技术相关要求安全通信网络通信传输本项要求包括:a) 应采用密码技术保证通信过程中数据的完整性;b) 应采用密码技术保证通信过程中数据的保密性;c) 应在通信前基于密码技术对通信的双方进行验证或认证;d) 应基于硬件密码模块对重要通信过程进行密码运算和密钥管理。安全计算环境身份鉴别本项要求中密码技术相关要求包括:c) 当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听;d) 应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。数据完整性本项要求包括:a) 应采用密码技术保证重要数据在传输过程中的完整性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等;b) 应采用密码技术保证重要数据在存储过程中的完整性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等;c) 在可能涉及法律责任认定的应用中,应采用密码技术提供数据原发证据和数据接收证据,实现数据原发行为的抗抵赖和数据接收行为的抗抵赖。数据保密性本项要求包括:a) 应采用密码技术保证重要数据在传输过程中的保密性,包括但不限于鉴别数据、重要业务数据和重要个人信息等;b) 应采用密码技术保证重要数据在存储过程中的保密性,包括但不限于鉴别数据、重要业务数据和重要个人信息等。安全管理中心集中管控本项要求中密码技术相关要求包括:b) 应能够建立一条安全的信息传输路径,对网络中的安全设备或安全组件进行管理。分析等保2.0对密码技术的要求,可以看到密码技术主要用于4个场景:身份认证、数据保密、数据完整性校验、防抵赖,其中身份认证也是访问控制的前提条件。另外,在等保2.0基本要求的附录B(关于等级保护对象整体安全保护能力的要求)中,提到:“本标准针对较高级别的等级保护对象,提到了使用密码技术、可信技术等,多数安全功能(如身份鉴别、访问控制、数据完整性、数据保密性等)为了获得更高的强度,均要基于密码技术或可信技术,为了保证等级保护对象的整体安全防护能力,应建立基于密码技术的统一支撑平台,支持高强度身份鉴别、访问控制、数据完整性、数据保密性等安全功能的实现。”充分说明了密码技术在较高级别保护对象的防护中,起着至关重要、必不可少的作用。2019年10月26日,《中华人民共和国密码法》颁布,并将于2020年1月1日起正式施行。密码法的颁布实施是密码历史上具有里程碑意义的大事,必将对密码事业发展产生重大而深远的影响。密码法中明确强调了对关键信息基础设施中密码技术的要求。密码技术是目前世界上公认的保障信息安全最有效、最可靠、最经济的核心技术。密码法的颁布对于等保2.0的实施具有进一步的指导意义,等保2.0中定级为三级和四级的保护对象及系统,大部分也是关系国计民生的关键基础设施,这些关键基础设施中对密码技术的应用必须严格遵守密码法的规定。制定和实施密码法,就是要把密码应用和管理的基本制度及时上升为法律规范,推动构建以密码技术为核心、多种技术交叉融合的网络空间安全体制。密码技术简介密码技术,简单来讲,就是隐密地传递信息的技术,常被认为是数学和计算机科学的分支,和信息论也密切相关。密码技术历史非常悠久,早期主要用于军事目的,不对外公开,也没有准确的文献记载。公元前17世纪,古巴比伦的Phaistos圆盘正反两面充斥着42种不同符号所表示的242个印记,至今还没有完全破译。
中国古代兵书《六韬》中记录了阴符和阴书两种加密通信方式。国君和在外主将之间用阴符秘密联络,八种不同尺寸长度的阴符,隐藏着不同的军情秘密。如需传递军机大事则用阴书:把书信拆成三部分,分派三人发出,每人拿一部分,只有三部分合在一起才能读懂信的内容。公元前700年左右,古希腊军队用一种圆木棍进行保密通信。这种加密方法中,加密方把纸条缠绕在特定的木棒上,写上原信息,木棒撤掉之后,纸条上的字母变成了乱码。解密方收到这个纸条后,用相同的木棒就可以恢复原信息。第一次世界大战和第二次世界大战中,密码技术对最后的战争结果起到举足轻重的作用。截至第二次世界大战结束,计算机技术尚未普及,这些加密技术都称为古典密码技术。古典密码技术的主要特点是基于字符的替换和换位,密文的安全性主要依赖算法的保密。也就是说,如果知道了算法,就可以从密文反向推导出明文。1949年,Shannon在《贝尔实验室技术杂志》上发表了《保密系统的通信理论(Communication Theory of Secrecy Systems)》,为现代密码学建立了理论基础,随着计算机的发展,密码技术使用的算法越来越复杂,密文的安全性主要依赖密钥,而不是算法。1976年,Whitefield Diffie和Martin Hellman发表论文公布了Diffie-Hellman算法,开启了公钥密码时代,即非对称加密技术。1977年,RSA算法发布,人类正式进入了公钥密码技术时代。近代密码学改变了古典密码学单一的加密手法,融入了大量的数论、几何、代数等丰富知识,使密码学得到更蓬勃的发展。密码技术是信息安全的基础,信息安全的基本属性中,可靠性(身份认证)、保密性、完整性、不可否认性都需要依赖密码技术才能实现。这4个基本属性和等保2.0中的4个主要应用场景是一致的。现代密码技术体系由5个基本概念组成:明文、密文、密钥、加密算法、解密算法。密码技术体系结构模型如下:
如果加密算法的加密秘钥和解密秘钥相同,我们称为对称加密算法,典型算法是DES、AES算法等。如果加密算法的加密秘钥和解密秘钥不同,我们称为非对称加密算法,典型算法是RSA算法等。密码技术中,有一类算法是单向的,不可逆向恢复为明文,这类算法一般称为哈希(Hash)算法或杂凑算法、散列算法,典型算法是MD5,SHA等。哈希算法的本质其实不是加密,而是针对输入的明文数据计算出唯一的摘要,主要用于验证数据的完整性,也可以结合预设密钥用来做数据来源证明,保证信息的不可否认性。今天这篇文章,主要讲解哈希算法及其典型应用。哈希算法介绍基本概念在现代密码学中,哈希算法占据着基础而又重要的地位,理解哈希是理解数字签名和加密通信等技术的必要前提,哈希算法经常和其他加密算法一起形成更高级的加密方案。哈希算法,是一种给数据创造“数字指纹”的方法。与指纹一样,哈希算法就是一种以很短的信息来实现数据的唯一性标志,这种标志与数据的每一个字节都相关。当原有数据发生改变时,其哈希值也会发生改变,而且即使很小的变化,也会引起哈希值很大的变化。哈希算法最重要的特点是很难以找到逆向规律,即完全无法根据哈希值逆向推测原始的数据,所以从本质上讲不属于加密算法,因为加密必然对应着解密。但是哈希算法是密码技术中非常常用的算法,所以一些不严谨的场合,也称为单向加密算法。好的哈希算法通常具有下列特性:特 性说 明快速性给定明文,能快速计算出哈希值,资源消耗少,速度极快。单向性无法逆向解密,给定哈希值,在有限时间内很难(基本不可能)逆推出明文。敏感性对输入数据很敏感,原始输入数据块即使只修改少量信息,比如一个比特,产生的哈希值看起来差异很大。确定性同一个输入数据,计算得出的哈希值是确定;不同的哈希值,其对应的原始输入一定不同。强抗碰撞性对于任意两个不同的数据块,其哈希值相同的可能性或概率极小。或者说,对于一个给定的数据块,找到另一个数据块和它哈希值相同是极为困难的事。典型算法目前常见的典型哈希算法包括CRC、MD5、SHA1和SHA2等,这些算法其实背后都有一个家族,同一家族中算法的基本结构是一致的,差别是哈希值的长度、循环运行的次数等略有差异,下表列出来这些家族中的典型算法:
CRC:Cyclic Redundancy Check,冗余循环校验算法,主要用于网络数据流的差错校验,检查传输数据的完整性。MD:Message-Digest Algorithm,消息摘要算法,其中MD5是最常使用的哈希算法。SHA:Secure Hash Algorithm,安全哈希算法,NIST用于替换MD5的更安全的哈希算法。国密:目前只有SM3哈希算法,哈希值长度256,和SHA256安全性相当。在这些公开的哈希算法中,一般哈希值长度越长,算法就越安全。注意这个结论仅针对公开的被大家认可的哈希算法,如果某个程序员自己设计一种哈希算法,则不能依靠这个结论判别其安全性,因为这个算法没有经过大范围的检验。比如:CRC-32算法输出的哈希值是32位,MD5算法输出的哈希值是128位,SHA-1算法输出的哈希值是160位,SHA-256算法输出的哈希值是256位,那么可以得知SHA-256是最安全的哈希算法。注意,在关键基础设施的安全技术方案中,如果不涉及和第三方系统对接等场景,优先推荐使用国密算法。山东大学的王小云教授分别在2004年和2005年破解了MD5和SHA1算法。注意对哈希算法的破解,并不是根据哈希值逆向推算出原始的明文,前面已经提到,哈希算法是无法逆向反推的。对哈希算法的破解,本质是根据已有数据构造出互相“碰撞”的数据,也就是两块数据不同,但是生成的哈希值相同。根据对哈希算法的要求,要保证每一个字节都会对最终结果产生影响。所以哈希算法都需要循环处理每一个字节的数据,一般是把数据分块处理,在MD5和SHA1及SHA2算法中,数据块的大小都是512位,即64字节,然后循环处理每一块数据。为了保证所有循环处理的数据块长度都是512位,就需要对原始输入数据进行预处理,即在数据末尾进行填充,确保数据的总长度是512位的整数倍。哈希算法的基本流程如下图:
数据填充的过程和要求如下:◇ 先补第一个比特为1,然后都补0,直到长度满足对512取模后余数是448。注意:信息必须进行填充,也就是说,即使长度已经满足对512取模后余数是448,补位也必须要进行,这时要填充512个比特。因此,填充是至少补一位,最多补512位。◇ 因为在第一步的预处理后,第二步会再附加上一个64位的数据,用来表示原始报文的长度信息。448+64=512,就形成了最后的512位数据,正好拼成了一个完整的结构。SHA256用一个64位的数据来表示原始消息的长度。因此,通过SHA256计算的消息长度必须要小于2^64,当然,这已经是一个足够大的天文数字了。数据填充后,就可以计算哈希值。计算过程如下:◇ 首先使用初始值哈希值(64字节的固定数据)和第一块数据计算得出哈希值。◇ 把计算出的这个哈希值作为初始值,循环计算下一块数据,并把计算出的哈希值替换初始值。◇ 循环处理完每一块数据,就得到最终的哈希值。计算的过程中,每一位数据都会参与,主要的计算就是各种位运算的组合,包括与、补、异或、移位等,经过多轮计算后得到哈希值。不同的哈希算法在进行位运算时算法都不尽相同,在此不详细讨论。应用场景◇ 完整性校验因为哈希算法具有快速性和敏感性的特点,通过哈希值对比能很快的检测出来数据是否发生变化。哈希算法的主流应用场景之一就是数据完整性校验,包括网络传输数据的完整性校验、硬盘数据文件的完整性校验等。等保2.0中,要求重要数据在传输和存储时保证完整性,避免数据被非法篡改,绝大部分场景就需要使用哈希算法。大部分开源软件在发布时都会发布软件或代码的哈希值作为校验码,一般是MD5、SHA1或者SHA256,用户下载这些文件后,在本地使用同样的算法计算哈希值,和官方网站发布的哈希值进行比对,如果哈希值一致,就可以说明下载的文件无误,可以正常使用。比如,在Apache的下载界面,使用SHA256作为完整性校验码:
类似的用法,可以用来校验系统中的关键文件和数据的完整性。比如一套安全解决方案中的安全防护策略可能被保存为一个或多个XML文件,为了保证该文件的完整性,在每次加载之前,可以先校验哈希值,确保没有被篡改。CRC算法经常被用于对网络中动态传输的数据流进行差错校验,及时发现数据传输中的错误。注意:CRC在对数据流的错误检测中非常有用,但是并不能可靠地校验数据完整性,所以用途比较单一,和其他密码技术交集不多,所以本文后续不再关注CRC算法。◇ 数字认证/签名因为哈希算法具有确定性和唯一性的特点,也经常被用于认证和签名。哈希算法在数字认证/签名场景主要有2种用法:1、在原始数据基础上附加用户的特有信息(比如共享密钥)进行哈希计算。HMAC(Hash-based Message Authentication Code),即基于哈希的消息认证码,就是这种典型用法,利用预共享密钥进行哈希计算和验证,实现对消息的完整性验证和认证。比如,在微信的支付签名规范中,支持MD5和HMAC-SHA256,但实际MD5仅用于试验沙盒环境,商用生产环境要求使用HMAC-SHA256来进行签名验证。官方开发文档截图如下:
2、对原始数据进行哈希计算后,对哈希值进行私钥签名。数字证书能标识身份,具有法律效力,在更严谨的场合要使用数字证书进行数字签名。数字证书签名一般使用RSA算法,RSA算法的性能较差,不适合对大批量数据加密,所以数字证书签名方案里,一般对原始数据的哈希值进行签名,即等同于对原始数据签名。◇ 身份鉴权因为哈希算法具有单向性和唯一性的特点,所以身份鉴权的方案中,普遍要用到哈希算法。身份鉴权最常用的方式是用户名+密码(或称为口令),为了保证安全性,密码严禁明文存储在数据库。如果使用对称加密算法加密存储,则意味着应用程序可以逆向解密得到密码,这也是身份鉴权方案的大忌。一般不推荐使用对称加密算法把密码加密存储,正确的做法是通过哈希算法对原始密码进行单向加密处理。随着计算能力的提升和一些数学家的努力,越来越多的哈希算法被破解,纯粹使用哈希算法已经无法保证口令的安全性。哈希算法的快速性,在密码破解时反而成为了帮凶,有助于快速进行碰撞测试。现在普遍使用加盐(Salt)和多次哈希的方案来增强哈希算法的安全性,下一节将详细讲解这种方案。哈希算法应用方案口令加密方案在密码技术里面,从人类可读的口令加密生成一段不容易被逆向的密码的功能,称为密钥导出功能/函数(Key Derivation Function,简称KDF)。口令加密方案就是KDF方案的一种应用。由于哈希破解算法的进步,传统的单向哈希算法在口令加密场景已经不能保证安全性,现在KDF方案中,相对成熟的口令加密方案主要包括:PBKDF2、BCrypt和Scrypt。◇ PBKDF2采用了加盐和多次哈希的算法,它根据迭代因子,执行多次HMAC运算,日常密码存储的最低安全要求是迭代因子≥1000,推荐标准是10000。微软的产品大量使用这个算法,华为的产品也推荐使用这个算法对密码进行加密存储。◇ BCrypt在计算哈希值的过程中使用了一系列不同的Blowfish加密算法(注意Blowfish本身是对称加密算法),并引入了一个工作因子(Work Factor)的概念,工作因子可以决定算法的快慢。通过设置工作因子让算法慢下来,可以有效减慢碰撞测试的速度。比如设置工作因子为12,BCrypt和MD5的性能差异达到百万倍。开源操作系统OpenBSD,以及流行的开源框架Springboot,使用这个算法对密码进行加密存储。◇ SCrypt是基于BCrypt的改进算法,也有一个工作因子可以决定算法的快慢。它将CPU计算与内存使用的开销提升了一个层次,不仅CPU运算需要指数时间开销,还需要指数内存IO开销,更能确保计算速度慢下来。因为SCrypt推出的时间较晚,应用比较少,目前在一些数字货币系统中存在应用案例。可以看出,口令加密方案相对标准哈希算法的改进主要是3个方面:加盐、多次、变慢。这些改进都能有效增加哈希算法的破解难度,保证密码口令的安全,同时又不影响正常的登录认证。盐(Salt)是指在进行哈希计算的过程中,故意加入的一些随机数据,用来避免从已计算的哈希值表(被称作“彩虹表”)中对比输出数据从而获取明文密码的风险。“盐”能有效提高哈希函数被破解的难度。因为哈希算法的敏感性,加盐以后生成的哈希值将和原来完全不同。这样即使碰撞测试得到了哈希值对应的明文,也不是真正的密码。多次哈希是指采用一定的算法多次迭代进行哈希,也可以加大破解难度,一般推荐迭代次数为10000次左右,可以根据实际的应用场景调整该参数。变慢是指故意增加算法的CPU和内存开销,减慢速度,从而加大破解的难度。本文主要讲解一下PBKDF2算法。PBKDF2的全称是(Password-Based Key Derivation Function 2),它是美国国家标准与技术研究院NIST推荐的离线密码存储方式,PBKDF2算法标准定义在RFC 2898文档中,计算公式如下:DK = PBKDF2(PRF, Password, Salt, c, dkLen)· PRF:标识使用的哈希算法。· Password:表示明文口令。· Salt:表示盐值,一般是一个随机数。· C:表示迭代次数。· dkLen:表示最后输出的密钥长度。PBKDF2的基本原理是通过一个哈希算法,把明文和盐作为输入参数,然后重复进行运算,并最终把中间结果进行异或XOR操作,合并为一个最终的密钥。如果重复的次数足够大,运算速度就会很慢,破解的成本就会变得很高,而盐的添加也会增加“彩虹表”攻击的难度。使用SHA-256的PBKDF2算法的计算过程如下图:
注意,在使用盐的时候,盐应该和密码数据分开存放,以保证系统的安全性。消息认证码方案消息认证码(Message Authentication Code,MAC)是一种确认消息完整性并进行认证的技术,其中消息认证指的是对消息来源进行认证,确保来自正确的发送者;确认完整性指的是检查消息是否被篡改,确保收到的消息和发出时是一致的。HMAC(Hash-based Message Authentication Code)即基于哈希算法的消息认证码,该算法在1997年作为RFC2104被公布,在IP Sec、SSL等网络协议中得以广泛应用,现在已经成为事实上的Internet安全标准。哈希算法可以是MD5、SHA1或SHA256等,相应的HMAC算法称为HMAC-MD5、HMAC-SHA1或HMAC-SHA256等。要计算HMAC必须持有共享密钥,没有共享密钥的人就无法计算MAC值,消息认证码正是利用这一性质来完成认证的。消息认证码可以说是一种与密钥相关联的哈希技术。在实际使用中,HMAC中的共享密钥一般使用随机数,并经常更新,以确保算法的安全性。也有一些场景可以双方约定一个共享密钥,这种密钥相对来讲更能起到认证的作用。因为共享密钥是只有通信双方知道的内容,所以HMAC也起到了认证的作用。但是,因为共享密钥不能用来标识对方的真实身份,所以HMAC不是标准的签名技术。我们以HMAC-SHA256为例,HMAC的计算公式如下:HMAC = H (Key XOR Opad, H (Key XOR Ipad, Message))· Key:共享密钥。· Opad:0x5C 重复64次(SHA256算法使用的数据块是64字节)。· Ipad:0x36 重复64次。· Message:待加密的消息。HMAC方案的实际应用案例包括:1、质询握手认证协议(Challenge Handshake Authentication Protocol,CHAP),这属于“挑战/响应”(Challenge/Response)认证方案,定义在RFC1994中,早期很多身份认证协议使用这种方案,比如802.1x接入认证系统。在认证过程中,首先服务器发送一个随机值作为共享密钥,然后客户端和服务器都使用这个随机值和密码作为参数计算HMAC值,真正的密码从不在网络传输,只有随机值和HMAC结果在网络传输。对于截获了这两个值的黑客而言,这两个值毫无意义,所以大大增强了安全性和实用性。这种认证方案能保证密码不在网络传输,但是需要存储明文密码,或者使用可逆的方式加密存储密码,在计算时解密验证,所以不能防止来自背后的威胁,也不符合前面说的口令加密方案中的安全要求,所以现在新的系统较少使用了。CHAP认证方案示意图:
2、数据完整性校验和身份认证,比如IP SEC和SSL中的数据完整性校验。这个过程中,既发送原始消息数据,也发送消息认证码,接收方验证这两个数据可以确认消息的完整性和来源的正确性。现在,这种使用模式是消息认证码的主流应用。消息认证码主要功能是验证数据完整性和身份认证,不能保证数据的保密性,没有对数据进行加密处理。数据完整性校验和身份认证方案示意图:
数字签名方案上一节的HMAC算法,通过预共享密钥认证对方,虽然可以保证通信双方的正确性,但是不能识别对方的身份,毕竟共享密钥只是一个随机值,和身份信息毫不相干。在更严格的场景中,为了验证对方的真实身份,就需要使用数字签名方案。