数据加密作为有效防止未授权访问和防护数据泄露的技术,在各种信息系统中广泛使用。作为信息系统的核心,GaussDB (DWS) 数仓也提供数据加密功能,包括透明加密和使用 SQL 函数加密。这里主要讨论 SQL 函数加密。

GaussDB (DWS) 目前不支持从 Oracle、Teradata 和 MySQL 加密后到 DWS 解密。Oracle、Teradata 和 MySQL 与 DWS 加解密有区别,需要非加密数据迁移到 DWS 后在 DWS 侧进行加解密。

技术背景

  • 哈希函数

哈希函数又称为摘要算法,对于数据 data,Hash 函数会生成固定长度的数据,即 Hash (data)=result。这个过程是不可逆的,即 Hash 函数不存在反函数,无法由 result 得到 data。在不应保存明文场景(比如口令 password 属于敏感信息),系统管理员用户也不应该知道用户的明文口令,就应该使用哈希算法存储口令的单向哈希值。

实际使用中会加入盐值和迭代次数,避免相同口令生成相同的哈希值,以防止彩虹表攻击。

图 1 哈希函数

  • 对称密码算法

对称密码算法使用相同的密钥来加密和解密数据。对称密码算法分为分组密码算法和流密码算法。

分组密码算法将明文分成固定长度的分组,用密钥对每个分组加密。由于分组长度固定,当明文长度不是分组长度的整数倍时,会对明文做填充处理。由于填充的存在,分组密码算法得到的密文长度会大于明文长度。

流加密算法是指加密和解密双方使用相同伪随机加密数据流作为密钥,明文数据依次与密钥数据流顺次对应加密,得到密文数据流。实践中数据通常是一个位(bit)并用异或(xor)操作加密。流密码算法不需要填充,得到的密文长度等于明文长度。

图 2 对称密码算法

技术实现

GaussDB (DWS) 主要提供了哈希函数和对称密码算法来实现对数据列的加解密。哈希函数支持 sha256,sha384,sha512 和国密 sm3。对称密码算法支持 aes128,aes192,aes256 和国密 sm4。

哈希函数

  • md5(string)

将 string 使用 MD5 加密,并以 16 进制数作为返回值。MD5 的安全性较低,不建议使用。

  • gs_hash(hashstr, hashmethod)

以 hashmethod 算法对 hashstr 字符串进行信息摘要,返回信息摘要字符串。支持的 hashmethod:sha256, sha384, sha512, sm3。

SELECT gs_hash('GaussDB(DWS)', 'sha256');gs_hash
--------------------------------------------------------------------------------------------------e59069daa6541ae20af7c747662702c731b26b8abd7a788f4d15611aa0db608efdbb5587ba90789a983f85dd51766609
(1 row)

对称密码算法

  • gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod)

采用 cryptotype 和 cryptomode 组成的加密算法以及 hashmethod 指定的 HMAC 算法,以 keystr 为密钥对 encryptstr 字符串进行加密,返回加密后的字符串。

SELECT gs_encrypt('GaussDB(DWS)', '1234', 'aes128', 'cbc', 'sha256');gs_encrypt
--------------------------------------------------------------------------------------------------------------------------AAAAAAAAAACcFjDcCSbop7D87sOa2nxTFrkE9RJQGK34ypgrOPsFJIqggI8tl+eMDcQYT3po98wPCC7VBfhv7mdBy7IVnzdrp0rdMrD6/zTl8w0v9/s2OA==
(1 row)
  • gs_decrypt(decryptstr, keystr,cryptotype, cryptomode, hashmethod)

采用 cryptotype 和 cryptomode 组成的加密算法以及 hashmethod 指定的 HMAC 算法,以 keystr 为密钥对 decryptstr 字符串进行解密,返回解密后的字符串。解密使用的 keystr 必须保证与加密时使用的 keystr 一致才能正常解密。

SELECT gs_decrypt('AAAAAAAAAACcFjDcCSbop7D87sOa2nxTFrkE9RJQGK34ypgrOPsFJIqggI8tl+eMDcQYT3po98wPCC7VBfhv7mdBy7IVnzdrp0rdMrD6/zTl8w0v9/s2OA==', '1234', 'aes128', 'cbc', 'sha256');gs_decrypt
--------------GaussDB(DWS)
(1 row)
  • gs_encrypt_aes128(encryptstr,keystr)

以 keystr 为密钥对 encryptstr 字符串进行加密,返回加密后的字符串。keystr 的长度范围为 1~16 字节。

SELECT gs_encrypt_aes128('MPPDB','1234');gs_encrypt_aes128
-------------------------------------------------------------------------------------
gwditQLQG8NhFw4OuoKhhQJoXojhFlYkjeG0aYdSCtLCnIUgkNwvYI04KbuhmcGZp8jWizBdR1vU9CspjuzI0lbz12A=
(1 row)
  • gs_decrypt_aes128(decryptstr,keystr)

以 keystr 为密钥对 decryptstr 字符串进行解密,返回解密后的字符串。解密使用的 keystr 必须保证与加密时使用的 keystr 一致才能正常解密。keystr 不得为空。

SELECT gs_decrypt_aes128('gwditQLQG8NhFw4OuoKhhQJoXojhFlYkjeG0aYdSCtLCnIUgkNwvYI04KbuhmcGZp8jWizBdR1vU9CspjuzI0lbz12A=','1234');gs_decrypt_aes128
-------------------MPPDB
(1 row)

应用示例

创建表 student,有 id,name 和 score 三个属性。使用哈希函数加密保存 name,使用对称密码算法保存 score。

CREATE TABLE student (id int, name text, score text, subject text);
CREATE TABLE
INSERT INTO student VALUES (1, gs_hash('alice', 'sha256'), gs_encrypt('95', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('math', '1234'));
INSERT 0 1
INSERT INTO student VALUES (2, gs_hash('bob', 'sha256'), gs_encrypt('92', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('english', '1234'));
INSERT 0 1
INSERT INTO student VALUES (3, gs_hash('peter', 'sha256'), gs_encrypt('98', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('science', '1234'));
INSERT 0 1

不使用密钥查询表 student,通过查询结果可知:没有密钥的用户即使拥有了 select 权限也无法看到 name 和 score 这两列加密数据。

SELECT * FROM STUDENT;id |                               name                               |                                                          score                                                           |subject
----+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+------------
----------------------------------------------------------------------------------2 | 81b637d8fcd2c6da6359e6963113a1170de795e4b725b84d1e0b4cfd9ec58ce9 | AAAAAAAAAACCWNznqIVSGYgcuDz9jNKTHTd35+Jmhd/8j6zRLTfAa+Yl448SxNUsDTOBtW4w2ePmnqwf2FfbfsF3hYYlOlCQV/BSv2M3fQKKUwc0Ytunug== | Ti4Shb5N511
imwH8ugtiveRiSF6j7SC8OyUK/DQRPRRwwW9MFXPnGbG6jOMhMSMpKiz3NoEGOaT384aywVgI31MS3Z8=3 | 026ad9b14a7453b7488daa0c6acbc258b1506f52c441c7c465474c1a564394ff | AAAAAAAAAAClDZIa1LfJuG+2dHpbnxn7VwHkCFuHChKErh069OHnMR+rhpWk0TxWlRfq8NIjX+590C3MqhPtha0ERbHbDpr5z8XVMkLgyAOQzJf6XtXvOA== | ijHXT/z94Zf
MKQ0k7fYDCUML7ZeU15tLXQreBwp0borh/pgB4ifh8j032v7IiENbHqnRdfRDgkrQDHswu5ZDb3Op3vE=1 | 2bd806c97f0e00af1a1fc3328fa763a9269723c8db8fac4f93af71db186d6e90 | AAAAAAAAAACQF3OcOktEKkPEL6G/AKL7DVA9WeXiNOwPPcXZuk49GZq0mrtR1ebqIiZBCvmGJ4wqoa7WEo3w8PRw+CK1oFP8J3b51ZZTVf1HD3nS46uEeg== | Sq5Zi0Yhg6h
/hEcLD8bJqmpGKVkr0Ke4SKHqf7xBMqWflZjXeFvE9s7CUMvXzJ0uSg7P5Ta1CT4sm0vvB1fc+84o+7o=
(3 rows)

使用密钥查询表 student,通过查询结果可知:拥有密钥的用户通过使用 gs_encrypt 对应的解密函数 gs_decrypt 解密后,可以查看加密数据。

SELECT id, gs_decrypt(score, '12345', 'aes128', 'cbc', 'sha256'),gs_decrypt_aes128(subject, '1234') FROM STUDENT;id | gs_decrypt | gs_decrypt_aes128
----+------------+-------------------2 | 92 | english3 | 98 | science1 | 95 | math
(3 rows)

使用 SQL 加密函数实现数据列的加解密相关推荐

  1. 云小课|使用SQL加密函数实现数据列的加解密

    摘要:数据加密作为有效防止未授权访问和防护数据泄露的技术,在各种信息系统中广泛使用.作为信息系统的核心,GaussDB(DWS)数仓也提供数据加密功能,包括透明加密和使用SQL函数加密. 本文分享自华 ...

  2. 技术分享 | 详解SQL加密函数:AES_ENCRYPT()

    作者:岳明强 爱可生北京分公司 DBA 团队成员,人称强哥,负责数据库管理平台的运维和 MySQL 问题处理.擅长对 MySQL 的故障定位. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授 ...

  3. pandas编写自定义函数计算多个数据列的加和(sum)、使用groupby函数和apply函数聚合计算分组内多个数据列的加和

    pandas编写自定义函数计算多个数据列的加和(sum).使用groupby函数和apply函数聚合计算分组内多个数据列的加和 目录

  4. pandas对dataframe的数据列进行随机抽样(Random Sample of Columns)、使用sample函数进行数据列随机抽样

    pandas对dataframe的数据列进行随机抽样(Random Sample of Columns).使用sample函数进行数据列随机抽样 目录

  5. pandas对dataframe的数据列进行随机抽样(Random Sample of Columns):使用sample函数进行数据列随机抽样(有放回的随机抽样,replacement)

    pandas对dataframe的数据列进行随机抽样(Random Sample of Columns):使用sample函数进行数据列随机抽样(有放回的随机抽样,replacement) 目录

  6. R语言dplyr包使用recode函数进行数据列内容编码、转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值)

    R语言dplyr包使用recode函数进行数据列内容编码.转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值) 目录

  7. MSSQL Sql加密函数 hashbytes 用法简介

    原文:MSSQL Sql加密函数 hashbytes 用法简介 转自:http://www.maomao365.com/?p=4732 一.mssql sql hashbytes 函数简介 hashb ...

  8. PL/SQL实现POST请求和参数AES加解密

    PL/SQL实现POST请求和参数AES加解密 背景 程序运行环境 相关函数 代码 背景 项目上使用的HIS程序(C/S架构:PowerBuilder+Oracle12c)需要对接第三方支付系统(RE ...

  9. SM2加密解决java与iOS端加解密不配套问题

    SM2加密解决java与iOS端加解密不配套问题 问题描述 问题判定 代码 声明 问题描述 使用java开发的SM2加解密,由java层生成SM2公私钥,iOS.Android(因和java层一致,暂 ...

最新文章

  1. 怎么把快捷键改成eclipse_Java IDE超好用的10个快捷键
  2. 不要再用arxiv链接了!为了让论文引用更规范,上交毕业生、南加州大学华人博士创建了一个小工具...
  3. 黑马程序员-JAVA基础-IO流之流操作规律及读写转换流
  4. 沿海产业基地与海润光伏共建产业园开工在即
  5. UML建模与软件开发过程模型
  6. 极客时间 MySQL 字段
  7. caffe:将mean.binaryproto文件转化为mean.npy文件
  8. 拥有十多年欧美金融行业经验,他曾任硅谷Top2互联网金融公司Prosper核心高管,突然回国,究竟是为何?
  9. 全局vue中修改字体样式 苹方字体 微软雅黑 亲测可用
  10. 【echarts地图制作】下钻到乡镇/街道级别的
  11. Matlab GUI编程技巧(十三):checkbox创建复选框
  12. 后端技术 - 收藏集 - 掘金
  13. 快播3.5不升级版常见问题
  14. Matlab中uigetfile( ) iscell() 函数的使用
  15. android2.5纬数字地图,步行者地图安卓版下载
  16. Stop:c000021a蓝屏解决方法
  17. 【Golang】安装 iris 的方法
  18. CentOS 64位 安装chrome
  19. JS中时间戳(毫秒数)转换为标准时间日期
  20. 三菱PLC触摸屏仿真测试

热门文章

  1. 将串口转换成TCP连接
  2. 小米手机如何关闭系统扩展服务器,小米手机如何关闭广告?MIUI12系统这样操作就够了...
  3. ffmpeg转码过程分析
  4. 《三体》里的超级计算机,我们今天能造出来吗?
  5. 基于人工鱼群优化可倒摆法(QIP)控制器附matlab代码
  6. 华为隐藏鸿蒙,鸿蒙系统有隐私空间吗_华为鸿蒙系统有隐私空间吗
  7. 基于JAVA电商购物商城系统设计与实现 开题报告
  8. Android 尺寸转换器(适配各种屏幕)
  9. 2020/11/05随记 基于jini的C++和Java交互
  10. Windos环境下kafka配置启动Zookeeper时,报错:Invalid config, exiting abnormally.