等保2.0标准已经在2019年12月正式开始实施。等保2.0标准中对密码技术做了明确的要求,密码技术主要出现在三级安全要求和四级安全要求中,主要的领域是通信网络和计算环境
分析等保2.0对密码技术的要求,可以看到密码技术主要用于4个场景:身份认证、数据保密、数据完整性校验、防抵赖,其中身份认证也是访问控制的前提条件。另外,在等保2.0基本要求的附录B(关于等级保护对象整体安全保护能力的要求)中,提到:“本标准针对较高级别的等级保护对象,提到了使用密码技术、可信技术等,多数安全功能(如身份鉴别、访问控制、数据完整性、数据保密性等)为了获得更高的强度,均要基于密码技术或可信技术,为了保证等级保护对象的整体安全防护能力,应建立基于密码技术的统一支撑平台,支持高强度身份鉴别、访问控制、数据完整性、数据保密性等安全功能的实现。”
2019年10月26日,《中华人民共和国密码法》颁布,并将于2020年1月1日起正式施行。
密码技术是目前世界上公认的保障信息安全最有效、最可靠、最经济的核心技术。密码法的颁布对于等保2.0的实施具有进一步的指导意义,等保2.0中定级为三级和四级的保护对象及系统,大部分也是关系国计民生的关键基础设施,这些关键基础设施中对密码技术的应用必须严格遵守密码法的规定。
密码技术,简单来讲,就是隐密地传递信息的技术,常被认为是数学和计算机科学的分支,和信息论也密切相关。
密码技术是信息安全的基础,信息安全的基本属性中,可靠性(身份认证)、保密性、完整性、不可否认性都需要依赖密码技术才能实现。这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安全性相当。
在这些公开的哈希算法中,一般哈希值长度越长,算法就越安全。注意这个结论仅针对公开的被大家认可的哈希算法,如果某个程序员自己设计一种哈希算法,则不能依靠这个结论判别其安全性,因为这个算法没有经过大范围的检验。
◇ 先补第一个比特为1,然后都补0,直到长度满足对512取模后余数是448。注意:信息必须进行填充,也就是说,即使长度已经满足对512取模后余数是448,补位也必须要进行,这时要填充512个比特。因此,填充是至少补一位,最多补512位。
扩展:取模运算是求两个数相除的余数。
◇ 因为在第一步的预处理后,第二步会再附加上一个64位的数据,用来表示原始报文的长度信息。448+64=512,就形成了最后的512位数据,正好拼成了一个完整的结构。SHA256用一个64位的数据来表示原始消息的长度。因此,通过SHA256计算的消息长度必须要小于2^64,当然,这已经是一个足够大的天文数字了。
数据填充后,就可以计算哈希值。计算过程如下:
◇ 首先使用初始值哈希值(64字节的固定数据)和第一块数据计算得出哈希值。
◇ 把计算出的这个哈希值作为初始值,循环计算下一块数据,并把计算出的哈希值替换初始值。
◇ 循环处理完每一块数据,就得到最终的哈希值。
计算的过程中,每一位数据都会参与,主要的计算就是各种位运算的组合,包括与、补、异或、移位等,经过多轮计算后得到哈希值。不同的哈希算法在进行位运算时算法都不尽相同。
因为哈希算法具有快速性和敏感性的特点,通过哈希值对比能很快的检测出来数据是否发生变化。哈希算法的主流应用场景之一就是数据完整性校验,包括网络传输数据的完整性校验、硬盘数据文件的完整性校验等。
等保2.0中,要求重要数据在传输和存储时保证完整性,避免数据被非法篡改,绝大部分场景就需要使用哈希算法。
大部分开源软件在发布时都会发布软件或代码的哈希值作为校验码,一般是MD5、SHA1或者SHA256,用户下载这些文件后,在本地使用同样的算法计算哈希值,和官方网站发布的哈希值进行比对,如果哈希值一致,就可以说明下载的文件无误,可以正常使用。
因为哈希算法具有确定性和唯一性的特点,也经常被用于认证和签名。
哈希算法在数字认证/签名场景主要有2种用法:
1、在原始数据基础上附加用户的特有信息(比如共享密钥)进行哈希计算。
HMAC(Hash-based Message Authentication Code),即基于哈希的消息认证码,就是这种典型用法,利用预共享密钥进行哈希计算和验证,实现对消息的完整性验证和认证。
HMAC扩展:在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。
2、对原始数据进行哈希计算后,对哈希值进行私钥签名。
数字证书能标识身份,具有法律效力,在更严谨的场合要使用数字证书进行数字签名。数字证书签名一般使用RSA算法,RSA算法的性能较差,不适合对大批量数据加密,所以数字证书签名方案里,一般对原始数据的哈希值进行签名,即等同于对原始数据签名。
因为哈希算法具有单向性和唯一性的特点,所以身份鉴权的方案中,普遍要用到哈希算法。身份鉴权最常用的方式是用户名+密码(或称为口令),为了保证安全性,密码严禁明文存储在数据库。如果使用对称加密算法加密存储,则意味着应用程序可以逆向解密得到密码,这也是身份鉴权方案的大忌。一般不推荐使用对称加密算法把密码加密存储,正确的做法是通过哈希算法对原始密码进行单向加密处理。
随着计算能力的提升和一些数学家的努力,越来越多的哈希算法被破解,纯粹使用哈希算法已经无法保证口令的安全性。哈希算法的快速性,在密码破解时反而成为了帮凶,有助于快速进行碰撞测试。
如有侵权,请告知;
小小了解,也请大家指正、补充。