---
title: openGauss支持国密SM3和SM4算法-官方技术文章-鲲鹏社区
description: 本文主要介绍openGauss支持的SM3和SM4两种国密算法的使用方法，包括如何使用SM3算法进行用户认证以及如何使用SM4进行数据加解密。
keywords: Gauss,SM,支持国密,官方技术文章,鲲鹏社区,国密算法介绍,国密,算法,用户认证
url: https://www.hikunpeng.com/developer/techArticles/20230913-9?envFlag=1
section: (其他)
---

# openGauss支持国密SM3和SM4算法-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20230913-9?envFlag=1
描述: 本文主要介绍openGauss支持的SM3和SM4两种国密算法的使用方法，包括如何使用SM3算法进行用户认证以及如何使用SM4进行数据加解密。
关键词: Gauss,SM,支持国密,官方技术文章,鲲鹏社区,国密算法介绍,国密,算法,用户认证

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

openGauss支持国密SM3和SM4算法

openGauss支持国密SM3和SM4算法

实战经验

发表于 2021/11/15

0

## 国密算法介绍

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

## 国密SM3算法——用户认证

### 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算法进行明文密码的加密。

（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 [了解详情](https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on/1.68)

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

### 2. 实现原理

openGauss使用RFC5802口令认证方案

（1）用户秘钥生成

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泄露，无法做到合法登录。

（2）认证流程

标准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 配置的认证方式，与客户端进行相应的认证交互。

## 国密SM4算法——数据加解密

SM4国密算法可用于对表中的某一列数据进行加解密。参考gs_encrypt_aes128加密函数、gs_decrypt_aes128解密函数，新增的加密函数gs_encrypt，解密函数gs_decrypt支持aes128、sm4的加解密，可以兼容aes128。其中SM4算法调用openssl中的EVP_sm4_cbc()接口。

（1）gs_encrypt_aes128和gs_decrypt_aes128函数示意：

```
gs_encrypt_aes128(encryptstr, keystr)
```

描述：以keystr为密钥对encryptstr字符串进行加密，返回加密后的字符串。

```
gs_decrypt_aes128(decryptstr,keystr)
```

描述：以keystr为密钥对decryptstr字符串进行解密，返回解密后的字符串

（2）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算法进行数据加解密。

欢迎访问openGauss官方网站

openGauss开源社区官方网站：

https://opengauss.org/ [了解详情](https://opengauss.org)

openGauss组织仓库：

https://gitcode.com/opengauss [了解详情](https://gitcode.com/opengauss)

openGauss镜像仓库：

https://github.com/opengauss-mirror [了解详情](https://github.com/opengauss-mirror)

本页内容
