1. 国密算法介绍 国 密即国家密码局认定的国产密码算法,常用的算法有SM1,SM2,SM3,SM4,其中密钥长度和分组长度均为128位。 针对银行客户对数据库安全能力的诉求以及提高产品安全竞争力的要求,进行数据库企业级安全能力增强,openGauss自2.0.0版本支持了国密 算法,主要包括用户认证支持国密SM3算法 ,支持利用国密SM4算法对数据进行加解密。

2. 国密SM3算法——用户认证


2.1 使用方法


openGauss现支持四种用户认证方式,其通过postgresql.conf文件中的参数password_encryption_type确定,认证方式与该参数的对应关系如下表所示:



认证方式



参数



md5



password_encryption_type=0



sha256+md5



password_encryption_type=1



sha256



password_encryption_type=2



sm3



password_encryption_type=3


其中SM3认证算法目前只支持gsql、 JDBC、 ODBC三种连接方式。


创建SM3认证方式的用户的步骤:


(1)在postgresql.conf文件中配置password_encryption_type=3,并重启数据库使该参数生效,则之后创建的用户将采用SM3算法进行明文密码的加密。


openGauss支持国密SM3和SM4算法_jdk

(2)创建用户


如下示例中,创建了test用户,通过系统表pg_authid的rolpassword字段可以查看用户创建时对应的加密方式,图示即对应SM3加密


openGauss支持国密SM3和SM4算法_客户端_02

(3)在pg_hba.conf文件中配置认证方式为SM3


openGauss支持国密SM3和SM4算法_jdk_03

此时test用户远程登录方可认证通过


openGauss支持国密SM3和SM4算法_jdk_04

对于利用SM3加密算法创建的用户,只有加密算法和认证方式均为SM3算法时,认证才会通过。

针对SM3用户,当通过JDBC远程连接时,需手动下载Jar包bcprov-jdk15on,并导入至应用程序中。

下载:https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on/1.68

对于创建其他认证方式的用户,过程与SM3类似,此处不再赘述。


2.2 实现原理


openGauss使用RFC5802口令认证方案


  • 用户秘钥生成

RFC5802秘钥衍生过程如下图所示:


openGauss支持国密SM3和SM4算法_openssl_05

 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口令认证流程如下图所示:


openGauss支持国密SM3和SM4算法_openssl_06

 说明




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字符串进行解密,返回解密后的字符串


openGauss支持国密SM3和SM4算法_postgresql_07


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。


openGauss支持国密SM3和SM4算法_java_08

利用SM4算法对表中数据进行加解密示意图:


openGauss支持国密SM3和SM4算法_jdk_09openGauss支持国密SM3和SM4算法_jdk_10

至此,openGauss支持使用国密SM3算法进行用户认证,SM4算法进行数据加解密。


欢迎访问openGauss官方网站


openGauss支持国密SM3和SM4算法_postgresql_11

openGauss开源社区官方网站:

https://opengauss.org

openGauss组织仓库:

https://gitee.com/opengauss

openGauss镜像仓库:

https://github.com/opengauss-mirror


openGauss支持国密SM3和SM4算法_java_12

扫码关注我们


微信公众号|openGauss

微信社群小助手|openGauss-bot

本文分享自微信公众号 - openGauss(openGauss)。

如有侵权,请联系 support@oschina.cn 删除。

 欢迎正在阅读的你也加入,一起分享。