openGauss支持国密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算法进行明文密码的加密。
(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算法——数据加解密
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算法进行数据加解密。
相关文章