数字签名技术是现代密码算法中非对称密码算法和消息摘要算法相结合的十分优秀的解决方案,应用面广泛,涉及到的知识点很多,本文将从概念、技术实现、合规性分析等方面逐一进行讲解。
数字签名(digital signature)是公钥密码算法的一类典型应用,常见应用场景为:发送方使用其私钥对消息进行处理得到签名值,接收方使用发送方的公钥对消息和签名值进行验证,简称“私钥加签,公钥验签”(相对应的使用公钥密码算法进行加密的流程为:“公钥加密,私钥解密”)。在此过程中可能使用到的主要密码算法有:非对称密码算法(又称公钥密码算法)、哈希算法(又称消息摘要算法、杂凑算法等)。
数字签名可以视为传统意义上的签名在网络虚拟环境中的映射,用来确保通信网络中用户身份的真实性、所发送消息的完整性,以及消息发送行为的不可否认性。本文重点讨论数字签名技术如何实现对真实性和不可否认性的保护。
真实性(Authenticity)需要解决的问题是:如何证明你是你(对这个问题的讨论已经上升到了哲学命题的高度)。常见的基于密码学技术的实现方式有:动态口令机制、基于对称密码算法或密码杂凑算法的消息鉴别码机制、基于公钥密码算法的数字签名机制等。有兴趣的读者可以去GB/T 15843《信息技术 安全技术 实体鉴别》中详细了解。
不可否认性(Non-Repudiation)需要解决的问题是:避免用户对自身发起的行为的抵赖,又称抗抵赖。常见的基于密码学技术的实现方式为基于公钥密码算法的数字签名机制。
上文中提到,数字签名的过程是使用用户私钥对消息进行处理进而得到签名值的过程,而提到公私钥对就不得不了解作为基础技术支撑的数字证书及其背后的PKI体系了。
数字证书以ASN.1编码规范来进行描述。符合X.509 v3 版本的数字证书结构如下:
证书
版本号
序列号
签名算法
颁发者
证书有效期
此日期前无效
此日期后无效
主题
主题公钥信息
公钥算法
主题公钥
颁发者唯一身份信息(可选项)
主题唯一身份信息(可选项)
扩展信息(可选项)
...
证书签名算法
数字签名
以下就是一个典型的SSL站点证书。
主流的数字证书格式有der、pem、pfx、p7b等,文件后缀有cer、crt、p12等,区别主要在于编码格式是二进制还是ASCII码,不同操作系统的支持情况也不一样。
关于数字证书的基础知识我们就介绍到这里,读者暂时只需要知道如何从数字证书中提取出公钥即可。以上图为例,此站点SSL证书中的公钥字段里面的以04e8开头的值就是这张证书的公钥,是公开给所有需要访问该站点的用户或终端的,通过使用这张证书,客户端可以实现对服务端的身份鉴别,同时可以为后续建立的SSL加密链路提供基础保证。
了解了数字证书的结构和作用以后,可能有读者会问那么数字证书是如何生成和注销的?这就需要依赖于一套完整的PKI体系了。
PKI全称为Public Key Infrastructure公钥基础设施,该体系解决了证书生命周期相关的认证和管理问题,而这些功能主要依托于CA、RA等模块来实现。
CA(Certification Authority)负责证书的颁发和吊销,接收来自 RA 的请求。
RA(Registration Authority)对用户身份进行验证,校验数据合法性,审核通过以后将请求转发给 CA。
证书资料库用来存储已签发的数字证书和公钥以及相关证书目录。
证书吊销列表CRL/OSCP用来管理数字证书的注销等事宜。
由于数字证书是由CA签发的,因此CA的权威性直接影响到数字证书的可信程度,一般来说由世界公认的顶级CA签发的证书都是被认为相对可信的,这也是为什么同样是HTTPS站点,浏览器提示有的站点的连接是安全的,有的是不安全的。原因就在于大部分浏览器和操作系统都内置了顶级CA的证书,通过对站点证书进行证书链验证以后,如果颁发该站点证书的CA机构在“受信任的根证书颁发机构”内,就会提示“连接是安全的”,如果不在,就会提示风险。
下面介绍两种典型的数字签名算法实现原理,一种是国际通用算法中比较常见的RSA算法,另一种是我国商用密码算法体系中的SM2算法。
RSA是基于大素数分解难题的非对称密码算法,目前是世界通用的公钥密码算法之一。
签名过程
随机选择两个不相等的素数p和q,并计算n=p*q
计算n的欧拉函数φ(n)=(p-1)(q-1)
随机选择一个整数e(在1和r中间且与r互质)
计算e对于φ(n)的模反元素d,满足e*d = 1 mod φ(n)
将n和e封装成公钥,n和d封装成私钥
计算消息m的消息摘要,记为 h(m)
使用私钥(n,d)对h(m)加密,生成签名s = (h(m))^d mod n
验签过程
计算消息m的消息摘要,记为h(m)
使用A的公钥(n,e) 和收到的s来计算H(m) = s^e mod n
比较H(m)与h(m),相同则说明签名验证通过
SM2是我国密码商用密码算法体系中基于ECC椭圆曲线的公钥密码算法,在GB/T 32918.2-2016《信息安全技术 SM2椭圆曲线公钥密码算法 第2部分:数字签名算法》中详细介绍了SM2算法签名及验签过程的实现。
签名过程
G为选定椭圆曲线上的基点,选取dA为私钥,pA为公钥,pA=dA*G
签名者用户A具有长度为entlenA比特的可辨别标识IDA,若没有特殊指定则一般默认为0x31323334353637383132333435363738
ENTLA是由整数entlenA转换而成的两个字节
待签名的消息为M
ZA=H256(ENTLA || IDA || a || b || xG || yG|| xA || yA),a、b为Fq中的元素,用来定义椭圆曲线,对于SM2算法而言一般来说是固定的,xG、yG和xA、yA分别为G点和pA点的横、纵坐标,ZA经过杂凑函数运算后长度为256位的杂凑值
e=H(ZA||M),H为输出长度为固定位数的杂凑函数
选取随机数k,计算(x1,y1)=k∗G
计算r=(e+x1) mod n
计算s=(k−r∗dA)/(1+dA) mod n
(r,s)即为签名值
验签过程
首先验证r和s是否在(1,n-1)集合中,若不在则验证失败
随后计算t=(r+s) mod n ,如果t=0则验证失败然后通过t与s计算曲线上的点(x1,y1)=s∗G+t∗PA
再计算R=(x1+e) mod n ,然后验证R与r是否相等,如果相等则表明验签通过。
可以看到,无论是RSA算法还是SM2算法,在对数据进行签名之前都会先进行哈希运算,实际上被签的数据并不是明文的消息值,而是经过各种处理后的消息摘要值,这也是数字签名技术无法用来保证数据机密性的原因。
RSA算法和SM2算法作为现代公钥密码算法的代表自身强度是经过时间考验的,然而这并不意味着绝对的安全,在配置失误的时候还是可能存在被攻击的风险的。由于在非对称密码算法中公钥是公开的,因此对私钥的保护要慎之又慎,私钥被破解也就意味着攻击者可以进行身份伪装、数据解密等操作。
基于大素数分解难题的公钥密码算法中的n=p*q,若选取过小,可能导致过于简单的大数分解,进而破解出用户私钥,此类问题也是CTF中的Cryto类的重点考察对象。
而对基于ECC算法的公钥密码算法而言,随机数k如果固定,在获取两个不同用户的签名值的前提下可推导出私钥。这个漏洞最出名的安全事件是2010年Sony的PS3事件。
除了RSA和SM2算法以外,还有DSA/ECDSA等算法可用作数字签名,而这些公钥密码算法除了可做数字签名以外还可以用来进行数据加解密、密钥协商等。出于摩尔定律和安全性的考量,目前密钥长度在2048位以下的RSA算法以及同等强度的密码算法已经被认为不再安全。
在基于椭圆曲线上离散对数难题的密码算法实现中,算法的强度很大程度取决于选取的椭圆曲线。对于某些因曲线参数选取不当导致的弱曲线,则存在特殊的算法来显著降低计算复杂度,从而高效地求解离散对数问题,即可能存在后门漏洞。
因此基于椭圆曲线密码算法实现过程中,建议使用我国商用密码体系的SM2算法以及GB/T 32918.5-2017《信息安全技术 SM2椭圆曲线公钥密码算法 第5部分:参数定义》标准定义的椭圆曲线参数。
PKCS#1
又称裸签(Raw Sign),即签名值中只有签名信息,不包含消息值、用户证书等信息的数字签名格式。
PKCS#7
即签名中可以附带其他信息,如:签名证书信息、签名原文信息等。值得一提的是PKCS#7不仅仅可作为数字签名的格式规范,也可以用于封装证书、数字信封等。P7格式的数字签名又可以细分为以下两种。
attached模式,又称P7A,即签名值中包含被签名的原文,但明文必须经过ASN.1编码。这样处理的话在通信过程中就无需重复传递原文,但会增加签名值的长度。
detached模式,又称P7D,格式中不包含被签名原文信息。因此在对端进行验签操作的时候,还需要额外传递消息值才可进行验证。
值得一提的是不管是P7A还是P7D格式的签名,被签名的原文可能都经过预处理,当验签不通过,而签名值、公钥都没问题的话,就需要考虑签名原文的格式是否正确了,需要具体情况具体分析。
a.密码产品实际运维过程中的身份鉴别实例
某密码厂商的KMS(密钥管理系统)产品在设备运维过程中使用”账户名”+“口令”以及Ukey+Pin码进行登录,这是一个非常典型的基于挑战响应机制的SM2算法签名验签来保证运维用户身份真实性的案例。整个身份鉴别过程的具体步骤如下:
1、首次打开设备运维页面时服务端向客户端传递一个随机数,也就是身份鉴别过程中所谓的challenge“挑战”。使用代理工具进行截包,可以看到服务端返回了一个base64格式编码的random随机数字段。
2、客户端将该随机数传递给本地端口提交签名请求,智能密码钥匙进行运算得出签名值并返回。
3、客户端通过浏览器将签名值及其他登录的必要参数传给服务端,由服务端进行验签,通过后完成对客户端的身份鉴别及授权。
下面我们从交互的数据包中提取必要的元素进行数字签名的验证:
通过对签名字段进行分析,发现是一个PKCS#7Attached格式的签名,签名数据中了包含了验签所需要的三要素:签名值、公钥、原文。
使用ASN.1分析工具可以看到签名值中包含了服务器发回的随机数字段。
从客户端用户的数字证书中提取SM2算法公钥:
从签名字段中找到messageDigest并进行提取(消息值经过预处理的中间原文),以及最下方的签名值r+s格式:
将签名值、公钥及原文代入算法验证工具后签名成功通过验证。
b.使用数字签名技术保证电子签章的不可否认性
某公文流转系统中需调用ukey对上传的PDF版报告进行电子签章,此过程中使用了RSA算法保证签名的不可否认性。
具体流程如下:
1、客户端上传报告后,服务端向客户端返回对应的消息摘要值:
2、客户端向服务端发送客户端证书及文件id等信息:
3、客户端向服务端提交由RSA格式数字签名完成电子签章行为:
下面尝试使用openssl工具对此过程中进行的RSA数字签名操作进行验签。
从第一步中把服务端返回的文件摘要值base64解码后保存为验签所需的的原文的文件。
从第2步的数据包中提取用户证书。
使用openssl工具进行RSA签名验证前需要先从cer格式的数字证书中导出pem格式的公钥文件。
将pem格式公钥文件进行base64解码并借用ASN.1分析工具可以看到,文件头中添加了RSA的算法标识符字段。
将第3步中客户端提交的签名值字段同样base64解码后另存为签名文件。
使用openssl工具进行RSA验签,指定数字证书文件、签名文件、原文、消息摘要算法,成功通过签名验证。
上文中提到,数字签名技术主要用来保护信息系统的真实性和不可否认性,而在我国的等保和密评合规体系的技术维度中也分别对相关的技术实现提出了保护要求,二者的测评要求和判定准则都是有区别的。
前者主要依据的标准是GB/T 22239《信息安全技术 网络安全等级保护基本要求》;
后者主要依据的标准是GB/T 39786《信息安全技术 信息系统密码应用基本要求》;
就测评要求而言,密评考察的更加细致,技术层面的测评指标分为DAK三个维度进行量化打分。
等保三级系统中涉及到真实性的测评项主要有:
8.1.4.1安全计算环境-身份鉴别d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。
密评三级系统中涉及到真实性的测评项主要有:
8.1 物理和环境安全
a) 宜采用密码技术进行物理访问身份鉴别,保证重要区域进入人员身份的真实性
8.2 网络和通信安全
a) 应采用密码技术对通信实体进行身份鉴别,保证通信实体身份的真实性
e) 可采用密码技术对从外部连接到内部网络的设备进行接入认证,确保接入的设备身份真实性
8.3 设备和计算安全
a) 应采用密码技术对登录设备的用户进行身份鉴别,保证用户身份的真实性
f) 宜采用密码技术对重要可执行程序进行完整性保护,并对其来源进行真实性验证
8.4 应用和数据安全
a) 应采用密码技术对登录用户进行身份鉴别,保证应用系统用户身份的真实性
以上文4.2.a为例,密码产品的运维在等保测评中属于安全计算环境层面,在密评中属于设备和计算安全层面。
本案例中,在密码产品的运维过程中使用了基于“挑战”-“响应”机制的SM2算法数字签名技术,辅助账户名+口令进行身份鉴别。
* 从等保的角度来考察,案例中对密码产品的运维采用的是账户名口令以及智能密码钥匙的双因素认证,智能密码钥匙使用过程中进行的数字签名是密码技术的一种,因此是满足等级保护中安全计算环境-身份鉴别测评项相关要求的。
* 从密评的角度来考察,还需要进一步分析身份鉴别过程中的算法及密钥合规性处理,用于进行密码运算智能密码钥匙和密钥管理系统都是取得了国家密码管理局商用密码产品认证证书的合规的密码产品,因此D、A、K三项都是符合的,也是满足设备和计算层面身份鉴别测评项相关要求的。
等保2.0中在四级及以上系统中提出了抗抵赖的要求:
9.1.4.7安全计算环境-数据完整性c)在可能涉及法律责任认定的应用中,应采用密码技术提供数据原发证据和数据接收证据,实现数据原发行为的抗抵赖和数据接收行为的抗抵赖
密评三级系统中涉及到不可否认性的测评项主要有以下:
8.4 应用和数据安全-不可否认性
h)在可能涉及法律责任认定的应用中,宜采用密码技术提供数据原发证据和数据接收证据,实现数据原发行为的不可否认性和数据接收行为的不可否认性
以上文中的4.2.b为例,电子签章发生在应用层面公文流转的业务流程中,因此属于等保测评的安全计算环境层面,密评的应用和数据层面。
* 从等保的角度来考察,使用了基于RSA算法的数字签名技术实现了电子签章的不可否认性。
* 从密评的角度来考察,使用了非合规的RSA算法,D项可判符合,A项应判为不符合,由于参与RSA签名验签运算的智能密码钥匙和电子签章服务器均为合规的商用密码产品,因此K项应判为符合。应用和数据层面的不可否认性测评项最终综合得分为0.5分,部分符合。
为了避免医患之间因为治疗产生的医疗纠纷事件,治疗方案可采用群签名或环签名技术,既有医生的签名,同时也不透露签名医生信息,在一定程度上可避免医患之间的纠纷。又如在:机密信息的批露、领导人的选举、电子商务、重要新闻发布、无线传感器网络等场景中,环签名都可发挥重要作用。
在群签名方案中,群成员可以匿名代表整个群对消息签名,同时具备不可伪造性、可追踪性、不关联性和防陷害性等特征。在一个群签名方案中,群体中的成员都可以生成群签名,外界可以验证其合法性,但无法确定到底是哪一个成员,即匿名性。若外界对群签名存在争议,此时群管理员只需“打开”争议的签名,揭示真正的签名者,即追踪性。
比特币之父中本聪选用了基于secp256k1椭圆曲线的ECDSA算法来进行数字签名,这就是数字签名在区块链中的核心应用。区块链通过使用基于共识机制来检测交易的有效性,使用分布式数据库来保存数据记录,人们可以在一个共享账本中储存数据、交换价值并记录交易活动,而其中的每一笔交易的背后都有数字签名技术的支撑。
区块链技术同时也是Web3的支柱,提供了安全的执行层,可以在其中创建、发行并交易加密资产,并且开发可编程的智能合约。