數(shù)字簽名技術是現(xiàn)代密碼算法中非對稱密碼算法和消息摘要算法相結合的十分優(yōu)秀的解決方案,應用面廣泛,涉及到的知識點很多,本文將從概念、技術實現(xiàn)、合規(guī)性分析等方面逐一進行講解。
1.數(shù)字簽名的含義和目標
1.1 什么是數(shù)字簽名
數(shù)字簽名(digital signature)是公鑰密碼算法的一類典型應用,常見應用場景為:發(fā)送方使用其私鑰對消息進行處理得到簽名值,接收方使用發(fā)送方的公鑰對消息和簽名值進行驗證,簡稱“私鑰加簽,公鑰驗簽”(相對應的使用公鑰密碼算法進行加密的流程為:“公鑰加密,私鑰解密”)。在此過程中可能使用到的主要密碼算法有:非對稱密碼算法(又稱公鑰密碼算法)、哈希算法(又稱消息摘要算法、雜湊算法等)。
1.2 為什么要使用數(shù)字簽名
數(shù)字簽名可以視為傳統(tǒng)意義上的簽名在網(wǎng)絡虛擬環(huán)境中的映射,用來確保通信網(wǎng)絡中用戶身份的真實性、所發(fā)送消息的完整性,以及消息發(fā)送行為的不可否認性。本文重點討論數(shù)字簽名技術如何實現(xiàn)對真實性和不可否認性的保護。真實性(Authenticity)需要解決的問題是:如何證明你是你(對這個問題的討論已經(jīng)上升到了哲學命題的高度)。常見的基于密碼學技術的實現(xiàn)方式有:動態(tài)口令機制、基于對稱密碼算法或密碼雜湊算法的消息鑒別碼機制、基于公鑰密碼算法的數(shù)字簽名機制等。有興趣的讀者可以去GB/T 15843《信息技術 安全技術 實體鑒別》中詳細了解。不可否認性(Non-Repudiation)需要解決的問題是:避免用戶對自身發(fā)起的行為的抵賴,又稱抗抵賴。常見的基于密碼學技術的實現(xiàn)方式為基于公鑰密碼算法的數(shù)字簽名機制。
2.數(shù)字證書及PKI體系
上文中提到,數(shù)字簽名的過程是使用用戶私鑰對消息進行處理進而得到簽名值的過程,而提到公私鑰對就不得不了解作為基礎技術支撐的數(shù)字證書及其背后的PKI體系了。
2.1 數(shù)字證書格式
數(shù)字證書以ASN.1編碼規(guī)范來進行描述。符合X.509 v3 版本的數(shù)字證書結構如下:證書版本號序列號簽名算法頒發(fā)者證書有效期此日期前無效此日期后無效主題主題公鑰信息公鑰算法主題公鑰頒發(fā)者唯一身份信息(可選項)主題唯一身份信息(可選項)擴展信息(可選項)…證書簽名算法數(shù)字簽名以下就是一個典型的SSL站點證書。
主流的數(shù)字證書格式有der、pem、pfx、p7b等,文件后綴有cer、crt、p12等,區(qū)別主要在于編碼格式是二進制還是ASCII碼,不同操作系統(tǒng)的支持情況也不一樣。
關于數(shù)字證書的基礎知識我們就介紹到這里,讀者暫時只需要知道如何從數(shù)字證書中提取出公鑰即可。以上圖為例,此站點SSL證書中的公鑰字段里面的以04e8開頭的值就是這張證書的公鑰,是公開給所有需要訪問該站點的用戶或終端的,通過使用這張證書,客戶端可以實現(xiàn)對服務端的身份鑒別,同時可以為后續(xù)建立的SSL加密鏈路提供基礎保證。
2.2 PKI體系
了解了數(shù)字證書的結構和作用以后,可能有讀者會問那么數(shù)字證書是如何生成和注銷的?這就需要依賴于一套完整的PKI體系了。PKI全稱為Public Key Infrastructure公鑰基礎設施,該體系解決了證書生命周期相關的認證和管理問題,而這些功能主要依托于CA、RA等模塊來實現(xiàn)。CA(Certification Authority)負責證書的頒發(fā)和吊銷,接收來自 RA 的請求。RA(Registration Authority)對用戶身份進行驗證,校驗數(shù)據(jù)合法性,審核通過以后將請求轉發(fā)給 CA。證書資料庫用來存儲已簽發(fā)的數(shù)字證書和公鑰以及相關證書目錄。證書吊銷列表CRL/OSCP用來管理數(shù)字證書的注銷等事宜。由于數(shù)字證書是由CA簽發(fā)的,因此CA的權威性直接影響到數(shù)字證書的可信程度,一般來說由世界公認的頂級CA簽發(fā)的證書都是被認為相對可信的,這也是為什么同樣是HTTPS站點,瀏覽器提示有的站點的連接是安全的,有的是不安全的。原因就在于大部分瀏覽器和操作系統(tǒng)都內置了頂級CA的證書,通過對站點證書進行證書鏈驗證以后,如果頒發(fā)該站點證書的CA機構在“受信任的根證書頒發(fā)機構”內,就會提示“連接是安全的”,如果不在,就會提示風險。
3.數(shù)字簽名的原理及常見算法
下面介紹兩種典型的數(shù)字簽名算法實現(xiàn)原理,一種是國際通用算法中比較常見的RSA算法,另一種是我國商用密碼算法體系中的SM2算法。
3.1 RSA算法數(shù)字簽名流程
RSA是基于大素數(shù)分解難題的非對稱密碼算法,目前是世界通用的公鑰密碼算法之一。
簽名過程
隨機選擇兩個不相等的素數(shù)p和q,并計算n=p*q計算n的歐拉函數(shù)φ(n)=(p-1)(q-1)隨機選擇一個整數(shù)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),相同則說明簽名驗證通過
3.2 SM2算法數(shù)字簽名流程
SM2是我國密碼商用密碼算法體系中基于ECC橢圓曲線的公鑰密碼算法,在GB/T 32918.2-2016《信息安全技術 SM2橢圓曲線公鑰密碼算法 第2部分:數(shù)字簽名算法》中詳細介紹了SM2算法簽名及驗簽過程的實現(xiàn)。
簽名過程
G為選定橢圓曲線上的基點,選取dA為私鑰,pA為公鑰,pA=dA*G簽名者用戶A具有長度為entlenA比特的可辨別標識IDA,若沒有特殊指定則一般默認為0x31323334353637383132333435363738ENTLA是由整數(shù)entlenA轉換而成的兩個字節(jié)待簽名的消息為MZA=H256(ENTLA || IDA || a || b || xG || yG|| xA || yA),a、b為Fq中的元素,用來定義橢圓曲線,對于SM2算法而言一般來說是固定的,xG、yG和xA、yA分別為G點和pA點的橫、縱坐標,ZA經(jīng)過雜湊函數(shù)運算后長度為256位的雜湊值e=H(ZA||M),H為輸出長度為固定位數(shù)的雜湊函數(shù)選取隨機數(shù)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算法,在對數(shù)據(jù)進行簽名之前都會先進行哈希運算,實際上被簽的數(shù)據(jù)并不是明文的消息值,而是經(jīng)過各種處理后的消息摘要值,這也是數(shù)字簽名技術無法用來保證數(shù)據(jù)機密性的原因。
3.3 攻擊方法
RSA算法和SM2算法作為現(xiàn)代公鑰密碼算法的代表自身強度是經(jīng)過時間考驗的,然而這并不意味著絕對的安全,在配置失誤的時候還是可能存在被攻擊的風險的。由于在非對稱密碼算法中公鑰是公開的,因此對私鑰的保護要慎之又慎,私鑰被破解也就意味著攻擊者可以進行身份偽裝、數(shù)據(jù)解密等操作。基于大素數(shù)分解難題的公鑰密碼算法中的n=p*q,若選取過小,可能導致過于簡單的大數(shù)分解,進而破解出用戶私鑰,此類問題也是CTF中的Cryto類的重點考察對象。
而對基于ECC算法的公鑰密碼算法而言,隨機數(shù)k如果固定,在獲取兩個不同用戶的簽名值的前提下可推導出私鑰。這個漏洞最出名的安全事件是2010年Sony的PS3事件。
除了RSA和SM2算法以外,還有DSA/ECDSA等算法可用作數(shù)字簽名,而這些公鑰密碼算法除了可做數(shù)字簽名以外還可以用來進行數(shù)據(jù)加解密、密鑰協(xié)商等。出于摩爾定律和安全性的考量,目前密鑰長度在2048位以下的RSA算法以及同等強度的密碼算法已經(jīng)被認為不再安全。
在基于橢圓曲線上離散對數(shù)難題的密碼算法實現(xiàn)中,算法的強度很大程度取決于選取的橢圓曲線。對于某些因曲線參數(shù)選取不當導致的弱曲線,則存在特殊的算法來顯著降低計算復雜度,從而高效地求解離散對數(shù)問題,即可能存在后門漏洞。因此基于橢圓曲線密碼算法實現(xiàn)過程中,建議使用我國商用密碼體系的SM2算法以及GB/T 32918.5-2017《信息安全技術 SM2橢圓曲線公鑰密碼算法 第5部分:參數(shù)定義》標準定義的橢圓曲線參數(shù)。
4.數(shù)字簽名格式解析及驗證
4.1 常見數(shù)字簽名格式
PKCS#1
又稱裸簽(Raw Sign),即簽名值中只有簽名信息,不包含消息值、用戶證書等信息的數(shù)字簽名格式。
PKCS#7
即簽名中可以附帶其他信息,如:簽名證書信息、簽名原文信息等。值得一提的是PKCS#7不僅僅可作為數(shù)字簽名的格式規(guī)范,也可以用于封裝證書、數(shù)字信封等。P7格式的數(shù)字簽名又可以細分為以下兩種。attached模式,又稱P7A,即簽名值中包含被簽名的原文,但明文必須經(jīng)過ASN.1編碼。這樣處理的話在通信過程中就無需重復傳遞原文,但會增加簽名值的長度。detached模式,又稱P7D,格式中不包含被簽名原文信息。因此在對端進行驗簽操作的時候,還需要額外傳遞消息值才可進行驗證。值得一提的是不管是P7A還是P7D格式的簽名,被簽名的原文可能都經(jīng)過預處理,當驗簽不通過,而簽名值、公鑰都沒問題的話,就需要考慮簽名原文的格式是否正確了,需要具體情況具體分析。
4.2 數(shù)字簽名的驗證方法
a.密碼產(chǎn)品實際運維過程中的身份鑒別實例
某密碼廠商的KMS(密鑰管理系統(tǒng))產(chǎn)品在設備運維過程中使用”賬戶名”+“口令”以及Ukey+Pin碼進行登錄,這是一個非常典型的基于挑戰(zhàn)響應機制的SM2算法簽名驗簽來保證運維用戶身份真實性的案例。整個身份鑒別過程的具體步驟如下:1、首次打開設備運維頁面時服務端向客戶端傳遞一個隨機數(shù),也就是身份鑒別過程中所謂的challenge“挑戰(zhàn)”。使用代理工具進行截包,可以看到服務端返回了一個base64格式編碼的random隨機數(shù)字段。
2、客戶端將該隨機數(shù)傳遞給本地端口提交簽名請求,智能密碼鑰匙進行運算得出簽名值并返回。
3、客戶端通過瀏覽器將簽名值及其他登錄的必要參數(shù)傳給服務端,由服務端進行驗簽,通過后完成對客戶端的身份鑒別及授權。
下面我們從交互的數(shù)據(jù)包中提取必要的元素進行數(shù)字簽名的驗證:通過對簽名字段進行分析,發(fā)現(xiàn)是一個PKCS#7Attached格式的簽名,簽名數(shù)據(jù)中了包含了驗簽所需要的三要素:簽名值、公鑰、原文。使用ASN.1分析工具可以看到簽名值中包含了服務器發(fā)回的隨機數(shù)字段。
從客戶端用戶的數(shù)字證書中提取SM2算法公鑰:
從簽名字段中找到messageDigest并進行提?。ㄏ⒅到?jīng)過預處理的中間原文),以及最下方的簽名值r+s格式:
將簽名值、公鑰及原文代入算法驗證工具后簽名成功通過驗證。
b.使用數(shù)字簽名技術保證電子簽章的不可否認性
某公文流轉系統(tǒng)中需調用ukey對上傳的PDF版報告進行電子簽章,此過程中使用了RSA算法保證簽名的不可否認性。具體流程如下:1、客戶端上傳報告后,服務端向客戶端返回對應的消息摘要值:
2、客戶端向服務端發(fā)送客戶端證書及文件id等信息:
3、客戶端向服務端提交由RSA格式數(shù)字簽名完成電子簽章行為:
下面嘗試使用openssl工具對此過程中進行的RSA數(shù)字簽名操作進行驗簽。從第一步中把服務端返回的文件摘要值base64解碼后保存為驗簽所需的的原文的文件。
從第2步的數(shù)據(jù)包中提取用戶證書。
使用openssl工具進行RSA簽名驗證前需要先從cer格式的數(shù)字證書中導出pem格式的公鑰文件。
將pem格式公鑰文件進行base64解碼并借用ASN.1分析工具可以看到,文件頭中添加了RSA的算法標識符字段。
將第3步中客戶端提交的簽名值字段同樣base64解碼后另存為簽名文件。
使用openssl工具進行RSA驗簽,指定數(shù)字證書文件、簽名文件、原文、消息摘要算法,成功通過簽名驗證。
5.數(shù)字簽名技術在密評及等保中的合規(guī)性判定
上文中提到,數(shù)字簽名技術主要用來保護信息系統(tǒng)的真實性和不可否認性,而在我國的等保和密評合規(guī)體系的技術維度中也分別對相關的技術實現(xiàn)提出了保護要求,二者的測評要求和判定準則都是有區(qū)別的。前者主要依據(jù)的標準是GB/T 22239《信息安全技術 網(wǎng)絡安全等級保護基本要求》;后者主要依據(jù)的標準是GB/T 39786《信息安全技術 信息系統(tǒng)密碼應用基本要求》;就測評要求而言,密評考察的更加細致,技術層面的測評指標分為DAK三個維度進行量化打分。
5.1 真實性
等保三級系統(tǒng)中涉及到真實性的測評項主要有:8.1.4.1安全計算環(huán)境-身份鑒別d)應采用口令、密碼技術、生物技術等兩種或兩種以上組合的鑒別技術對用戶進行身份鑒別,且其中一種鑒別技術至少應使用密碼技術來實現(xiàn)。
密評三級系統(tǒng)中涉及到真實性的測評項主要有:8.1 物理和環(huán)境安全a) 宜采用密碼技術進行物理訪問身份鑒別,保證重要區(qū)域進入人員身份的真實性8.2 網(wǎng)絡和通信安全a) 應采用密碼技術對通信實體進行身份鑒別,保證通信實體身份的真實性e) 可采用密碼技術對從外部連接到內部網(wǎng)絡的設備進行接入認證,確保接入的設備身份真實性8.3 設備和計算安全a) 應采用密碼技術對登錄設備的用戶進行身份鑒別,保證用戶身份的真實性f) 宜采用密碼技術對重要可執(zhí)行程序進行完整性保護,并對其來源進行真實性驗證8.4 應用和數(shù)據(jù)安全a) 應采用密碼技術對登錄用戶進行身份鑒別,保證應用系統(tǒng)用戶身份的真實性
以上文4.2.a為例,密碼產(chǎn)品的運維在等保測評中屬于安全計算環(huán)境層面,在密評中屬于設備和計算安全層面。本案例中,在密碼產(chǎn)品的運維過程中使用了基于“挑戰(zhàn)”-“響應”機制的SM2算法數(shù)字簽名技術,輔助賬戶名+口令進行身份鑒別。
*從等保的角度來考察,案例中對密碼產(chǎn)品的運維采用的是賬戶名口令以及智能密碼鑰匙的雙因素認證,智能密碼鑰匙使用過程中進行的數(shù)字簽名是密碼技術的一種,因此是滿足等級保護中安全計算環(huán)境-身份鑒別測評項相關要求的。
*從密評的角度來考察,還需要進一步分析身份鑒別過程中的算法及密鑰合規(guī)性處理,用于進行密碼運算智能密碼鑰匙和密鑰管理系統(tǒng)都是取得了國家密碼管理局商用密碼產(chǎn)品認證證書的合規(guī)的密碼產(chǎn)品,因此D、A、K三項都是符合的,也是滿足設備和計算層面身份鑒別測評項相關要求的。
5.2 不可否認性
等保2.0中在四級及以上系統(tǒng)中提出了抗抵賴的要求:9.1.4.7安全計算環(huán)境-數(shù)據(jù)完整性c)在可能涉及法律責任認定的應用中,應采用密碼技術提供數(shù)據(jù)原發(fā)證據(jù)和數(shù)據(jù)接收證據(jù),實現(xiàn)數(shù)據(jù)原發(fā)行為的抗抵賴和數(shù)據(jù)接收行為的抗抵賴
密評三級系統(tǒng)中涉及到不可否認性的測評項主要有以下:8.4 應用和數(shù)據(jù)安全-不可否認性h)在可能涉及法律責任認定的應用中,宜采用密碼技術提供數(shù)據(jù)原發(fā)證據(jù)和數(shù)據(jù)接收證據(jù),實現(xiàn)數(shù)據(jù)原發(fā)行為的不可否認性和數(shù)據(jù)接收行為的不可否認性
以上文中的4.2.b為例,電子簽章發(fā)生在應用層面公文流轉的業(yè)務流程中,因此屬于等保測評的安全計算環(huán)境層面,密評的應用和數(shù)據(jù)層面。
*從等保的角度來考察,使用了基于RSA算法的數(shù)字簽名技術實現(xiàn)了電子簽章的不可否認性。
*從密評的角度來考察,使用了非合規(guī)的RSA算法,D項可判符合,A項應判為不符合,由于參與RSA簽名驗簽運算的智能密碼鑰匙和電子簽章服務器均為合規(guī)的商用密碼產(chǎn)品,因此K項應判為符合。應用和數(shù)據(jù)層面的不可否認性測評項最終綜合得分為0.5分,部分符合。
6.數(shù)字簽名的新技術和新應用
6.1 新興技術
為了避免醫(yī)患之間因為治療產(chǎn)生的醫(yī)療糾紛事件,治療方案可采用群簽名或環(huán)簽名技術,既有醫(yī)生的簽名,同時也不透露簽名醫(yī)生信息,在一定程度上可避免醫(yī)患之間的糾紛。又如在:機密信息的批露、領導人的選舉、電子商務、重要新聞發(fā)布、無線傳感器網(wǎng)絡等場景中,環(huán)簽名都可發(fā)揮重要作用。在群簽名方案中,群成員可以匿名代表整個群對消息簽名,同時具備不可偽造性、可追蹤性、不關聯(lián)性和防陷害性等特征。在一個群簽名方案中,群體中的成員都可以生成群簽名,外界可以驗證其合法性,但無法確定到底是哪一個成員,即匿名性。若外界對群簽名存在爭議,此時群管理員只需“打開”爭議的簽名,揭示真正的簽名者,即追蹤性。
6.2 區(qū)塊鏈&Web3
比特幣之父中本聰選用了基于secp256k1橢圓曲線的ECDSA算法來進行數(shù)字簽名,這就是數(shù)字簽名在區(qū)塊鏈中的核心應用。區(qū)塊鏈通過使用基于共識機制來檢測交易的有效性,使用分布式數(shù)據(jù)庫來保存數(shù)據(jù)記錄,人們可以在一個共享賬本中儲存數(shù)據(jù)、交換價值并記錄交易活動,而其中的每一筆交易的背后都有數(shù)字簽名技術的支撐。區(qū)塊鏈技術同時也是Web3的支柱,提供了安全的執(zhí)行層,可以在其中創(chuàng)建、發(fā)行并交易加密資產(chǎn),并且開發(fā)可編程的智能合約。