1. 国密算法介绍

    国密即国家密码局认定的国产密码算法,主要有 SM1,SM2,SM3,SM4。密钥长度和分组长度均为 128 位。针对银行客户对数据库安全能力的诉求以及提高产品安全竞争力的要求,进行数据库企业级安全能力增强,openGauss 自 2.0.0 版本支持了国密算法,主要包括用户认证支持国密 SM3 算法sm3 算法,支持 SM4 国密算法加解密函数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,并重启数据库使该参数生效

(2)创建用户

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

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

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

对于创建其他认证方式的用户,过程与 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 配置的认证方式,与客户端进行相应的认证交互。

  1. 国密 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 和 gs_decrypt 函数示意:

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

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

openGauss支持国密SM3和SM4算法的更多相关文章

  1. 一个支持国密SM2/SM3/SM4/SM9/ZUC/SSL的密码工具箱

    转:https://blog.csdn.net/xuq09/article/details/91815366 The GmSSL Project网址:http://gmssl.org/docs/qui ...

  2. 推荐一款能支持国密SM2浏览器——密信浏览器

    密信浏览器( MeSince Browser )是基于Chromium开源项目开发的国密安全浏览器,支持国密算法和国密SSL证书,同时也支持国际算法及全球信任SSL证书:密信浏览器使用界面清新,干净. ...

  3. openssl 全面支持国密SM2/SM3/SM4加密算法

    sm4展示 代码 /** 文件名: https://github.com/liuqun/openssl-sm4-demo/blob/cmake/src/main.c */ #include <s ...

  4. 国密SM3算法在linux和windows平台结果不一致问题

    什么是sm3,是一种类似于sha256的哈希算法,是咱们国家的哈希标准算法: 最近在使用sm3算法时,同样的一份数据,调用同样的sm3接口,发现得到的结果是不一样的: 那么在应用过的过程中,如果同样的 ...

  5. 使用Docker编译OpenResty支持国密ssl加密

    编译环境 执行编译操作环境如下 #操作系统 CentOS Linux release 7.4.1708 (Core) #docker版本 Version: 19.03.5 编译过程 Dockerfil ...

  6. OpenSSL 1.1.1 国密算法支持

    OpenSSL 1.1.1 国密算法支持 https://www.openssl.org/ https://github.com/openssl/openssl OpenSSL 1.1.1 新特性: ...

  7. 2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法

    国密商用算法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法.密码杂凑SM3算法.分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等. 第1节 SM2非对 ...

  8. Hyperledger Fabric密码模块系列之BCCSP(五) - 国密算法实现

    Talk is cheap, show me your code. 代码也看了,蛋也扯了,之后总该做点什么.响应国家政策,把我们的国密算法融合进去吧--  先附两张bccsp下国密算法的设计实现图. ...

  9. 20155206赵飞 基于《Arm试验箱的国密算法应用》课程设计个人报告

    20155206赵飞 基于<Arm试验箱的国密算法应用>课程设计个人报告 课程设计中承担的任务 完成试验箱测试功能1,2,3 . 1:LED闪烁实验 一.实验目的  学习GPIO原理  ...

  10. 《基于Arm实验箱的国密算法应用》课程设计 结题报告

    <基于Arm实验箱的国密算法应用>课程设计 结题报告 小组成员姓名:20155206赵飞 20155220吴思其 20155234昝昕明 指导教师:娄嘉鹏 设计方案 题目要求:基于Arm实 ...

随机推荐

  1. 【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection refused)的排查步骤

    问题描述 在PHP应用中,连接Redis的方法报错  RedisException(code: 0): Connection refused at /data/Redis/Connectors/Php ...

  2. 【Azure 应用服务】Azure App Service多实例中,出现某一个实例CPU居高不下的情况,如何重启单个实例呢?

    问题描述 在使用App Service服务中,当多实例中,其中一个实例出现高CPU,高Memory的情况,为了尽可能少的影响正在运行的应用,需要单独重启某一个实例的情况下,如何手动操作呢? 问题解答 ...

  3. 【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性

    问题描述 App Service For Linux 中安装paping的操作步骤 解决步骤 1) 登录App Service的Kudu站点,点击Bash 2)使用命令下载paping压缩文件:#wg ...

  4. 【Azure Developer】CURL 发送Oauth2 Token请求获取到 404 Not Found 问题

    问题描述 当使用 Postman 向AAD 发送如下请求时候,得到了404 Not Found的错误. "curl --location --request POST 'https://lo ...

  5. debian手册摘要

    apt-get source 包名 # 获取源码dpkg --info deb包名 # 查看包信息apt-cache show 包名 # 包信息(含有Depends.Suggests.Section. ...

  6. 详解 nebula 2.0 性能测试和 nebula-importer 数据导入调优

    这是由社区用户--繁凡撰写的一篇他的实践分享,主要讲解如何进行 Nebula 性能测试以及数据导入部分的性能调优.下文中出现的"我"代指用户繁凡. 0. 概要 之前在做 Nebul ...

  7. 使用FastWiki一分钟搭建公司的智能客服

    FastWiki 新UI介绍:基于React与LobeUI框架设计 FastWiki 最近引入了基于React的新UI,这是一个重大的更新.在设计新UI时,我们借鉴了LobeUI的框架,并且在接口调用 ...

  8. 修改主频 & 时钟树

    在system_stm32f10x.c中可以更改这个 最先调用void SystemInit (void)启动HSI+各种恢复缺省配置    然后   调用 SetSysClock();执行设置时钟7 ...

  9. 修改校准debain/manjaro的时间时钟

    一次重启后发现时间竟然从上午变成了晚上!要问,我是怎么发现在的我就是发现上午的时候我的屏幕夜灯突然出现了 使用命令 sudo rm -f /etc/localtime删除本地时间文件 sudo cp ...

  10. python文件获取并读取固定长度数据实例解析

    一 概念 1 file 操作: 文件操作一般有open,write,read,close几种,这里重点是read固定长度数据. read() 用于从文件读取指定的字节数,如果未给定或为负则读取所有. ...