1. 國密算法介紹
國密即國家密碼局認定的國産密碼算法,常用的算法有SM1,SM2,SM3,SM4,其中密鑰長度和分組長度均為128位。針對銀行客戶對資料庫安全能力的訴求以及提高産品安全競争力的要求,進行資料庫企業級安全能力增強,openGauss自2.0.0版本支援了國密算法,主要包括使用者認證支援國密SM3算法,支援利用國密SM4算法對資料進行加解密。
2. 國密SM3算法——使用者認證
2.1 使用方法
openGauss現支援四種使用者認證方式,其通過postgresql.conf檔案中的參數password_encryption_type确定,認證方式與該參數的對應關系如下表所示:
其中SM3認證算法目前隻支援gsql、 JDBC、 ODBC三種連接配接方式。
建立SM3認證方式的使用者的步驟:
(1)在postgresql.conf檔案中配置password_encryption_type=3,并重新開機資料庫使該參數生效,則之後建立的使用者将采用SM3算法進行明文密碼的加密。
(2)建立使用者
如下示例中,建立了test使用者,通過系統表pg_authid的rolpassword字段可以檢視使用者建立時對應的加密方式,圖示即對應SM3加密
(3)在pg_hba.conf檔案中配置認證方式為SM3
此時test使用者遠端登入方可認證通過
對于利用SM3加密算法建立的使用者,隻有加密算法和認證方式均為SM3算法時,認證才會通過。
針對SM3使用者,當通過JDBC遠端連接配接時,需手動下載下傳Jar包bcprov-jdk15on,并導入至應用程式中。
下載下傳:https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on/1.68
對于建立其他認證方式的使用者,過程與SM3類似,此處不再贅述。
2.2 實作原理
openGauss使用RFC5802密碼認證方案
- 使用者秘鑰生成
RFC5802秘鑰衍生過程如下圖所示:
SaltedPassword := PBKDF2 (password, salt, i)
ClientKey := HMAC(SaltedPassword, "Client Key")
StoredKey := Hash(ClientKey)
伺服器端存的是StoredKey和ServerKey:
1)StoredKey是用來驗證Client客戶身份的
服務端認證用戶端通過計算ClientSignature與用戶端發來的ClientProof進行異或運算,進而恢複得到ClientKey,然後将其進行hash運算,将得到的值與StoredKey進行對比。如果相等,證明用戶端驗證通過。
2)ServerKey是用來向用戶端表明自己身份的
類似的,用戶端認證服務端,通過計算ServerSignature與服務端發來的值進行比較,如果相等,則完成對服務端的認證。
3)在認證過程中,服務端可以計算出來ClientKey,驗證完後直接丢棄不必存儲。
要做到合法的登入,必須知道Password、SaltedPassword或者ClientKey。如果StoryKey和ServerKey洩露,無法做到合法登入。
- 認證流程
标準RFC5802密碼認證流程如下圖所示:
說明
1、用戶端發送username給服務端。
2、服務端傳回給用戶端AuthMessage 和計算出來的ServerSignature。
3、用戶端收到資訊後,首先利用認證資訊AuthMessage中的salt和iteration-count(疊代次數),從password計算得到SaltedPassword,然後計算得到下層所有的key。計算HMAC(ServerKey, AuthMessage) == ServerSignature是否相等,如果相等,則client完成對服務端的認證。
4、用戶端将計算得到的ClientProof發送給服務端。
5、服務端使用其儲存的StoredKey和AuthMessage計算HMAC,在和接收的client發送的ClientProof進行異或,得到ClientKey,在對ClientKey進行哈希,和其儲存的StoredKey進行比較是否一緻。如果一緻,則用戶端的認證通過。
伺服器端收到用戶端請求後,根據pg_hba.conf 配置的認證方式,與用戶端進行相應的認證互動。
3. 國密SM4算法——資料加解密
SM4國密算法可用于對表中的某一列資料進行加解密。參考gs_encrypt_aes128加密函數、gs_decrypt_aes128解密函數,新增的加密函數gs_encrypt,解密函數gs_decrypt支援aes128、sm4的加解密,可以相容aes128。其中SM4算法調用openssl中的EVP_sm4_cbc()接口。
gs_encrypt_aes128和gs_decrypt_aes128函數示意:
- gs_encrypt_aes128(encryptstr, keystr)
描述:以keystr為密鑰對encryptstr字元串進行加密,傳回加密後的字元串。
- gs_decrypt_aes128(decryptstr,keystr)
描述:以keystr為密鑰對decryptstr字元串進行解密,傳回解密後的字元串
gs_encrypt和gs_decrypt函數示意:
- gs_encrypt(encryptstr, keystr, algorithm)
描述:以keystr為密鑰對encryptstr字元串利用algorithm進行加密,傳回加密後的字元串。可選的algorithm為sm4和aes128。
- gs_decrypt(decryptstr,keystr, algorithm)
描述:以keystr為密鑰對decryptstr字元串利用algorithm進行解密,傳回解密後的字元串。可選的algorithm為sm4和aes128。
利用SM4算法對表中資料進行加解密示意圖:
至此,openGauss支援使用國密SM3算法進行使用者認證,SM4算法進行資料加解密。