云小课|使用SQL加密函数实现数据列的加解密
摘要:数据加密作为有效防止未授权访问和防护数据泄露的技术,在各种信息系统中广泛使用。作为信息系统的核心,GaussDB(DWS)数仓也提供数据加密功能,包括透明加密和使用SQL函数加密。
本文分享自华为云社区《看GaussDB(DWS)如何使用SQL加密函数实现数据列加解密》,作者:Hello EI。
数据加密作为有效防止未授权访问和防护数据泄露的技术,在各种信息系统中广泛使用。作为信息系统的核心,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 | english
3 | 98 | science
1 | 95 | math
(3 rows)
云小课|使用SQL加密函数实现数据列的加解密的更多相关文章
- 云小课|DGC数据开发之基础入门篇
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:欢迎来到DGC数据 ...
- 云小课|MRS基础原理之MapReduce介绍
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:MapReduce ...
- 云小课|MRS数据分析-通过Spark Streaming作业消费Kafka数据
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:Spark Str ...
- 云小课|云小课教您如何选择Redis实例类型
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:购买Redis实例 ...
- SQL点滴4—筛选数据列的类型,字段大小,是否可为空,是否是主键,约束等等信息
原文:SQL点滴4-筛选数据列的类型,字段大小,是否可为空,是否是主键,约束等等信息 项目需要将Access数据库中的数据导入到SQL Server中,需要检验导入后的数据完整性,数据值是否正确.我们 ...
- 云小课 | 搬迁本地数据至OBS,多种方式任你选
摘要:搬迁本地数据至OBS,包括OBS工具方式.CDM方式.DES磁盘方式.DES Teleport方式和云专线方式,每种方式特点不同,本节课我们就一起看看有什么区别. 已有的业务数据可能保存在本地的 ...
- MSSQL Sql加密函数 hashbytes 用法简介
转自:http://www.maomao365.com/?p=4732 一.mssql sql hashbytes 函数简介 hashbytes函数功能为:返回一个字符,通过 MD2.MD4.MD5. ...
- 云小课|带你揭开IP地址的神秘身份
摘要:本文带你了解网络云产品和相关的知识内容. 华为云网络服务大家族提供了丰富的云产品,可以满足用户的各种网络互联需求.相应地,华为云帮助中心也贴心的奉上了你想了解的所有网络云产品知识. 可是小课最近 ...
- 云小课 | IPv4枯了,IPv6来了
摘要:本篇主要分享IPv4与IPv6的区别和IPv6的应用场景,助您快速理解华为云IPv6双栈及IPv6 EIP. IPv6的由来 上节课我们讲了公网IP与私网IP,了解了IP地址的一些知识. 我们一 ...
- 云小课 | 需求任务还未分解,该咋整!项目管理Scrum项目工作分解的心酸谁能知?
温馨提醒:本文约3000字,需要阅读5分钟,共分为8个部分,建议分段阅读! 软件开发过程中,从产品概念形成到产品规划.往往要做详细的需求分析和项目规划等,因此,选对一款项目管理工具对开发者就显得尤为重 ...
随机推荐
- 【短道速滑十一】标准的Gabor滤波器及Log_Gabor滤波器的实现、解析、速度优化及其和Halcon中gen_gabor的比较。
最近有朋友在研究Halcon中gen_gabor的函数,和我探讨,因为我之前也没有怎么去关注这个函数,因此,前前后后大概也折腾了有一个星期去模拟实现这个东西,虽然最终没有实现这个函数,但是也是有所收获 ...
- ubuntu 20.1 (linux) 下软件安装教程(基本上都是使用命令行安装)
一.node 1. 安装教程 # 第二步,添加源后安装 需要什么版本直接替换后面的数字即可,如果需要21,直接将20替换为21就可以了 curl -sL https://deb.nodesource. ...
- Chromium GPU资源共享
资源共享指的是在一个 Context 中的创建的 Texture 资源可以被其他 Context 所使用.一般来讲只有相同 share group Context 创建的 Texture 才可以被共享 ...
- Flask后端开发(二) - 功能实现和项目总结
Flask后端开发(二) - 功能实现和项目总结 目录 Flask后端开发(二) - 功能实现和项目总结 1. 功能1:修改文件参数值 1.1. 获取网页端传参 1.2. 读取文件 1.2.1. 一般 ...
- webservice soap hessian
http://www.blogjava.net/freeman1984/archive/2010/01/20/310198.html http://www.cnblogs.com/JeffreySun ...
- 【scipy 基础】--积分和微分方程
对于手工计算来说,积分计算是非常困难的,对于一些简单的函数,我们可以直接通过已知的积分公式来求解,但在更多的情况下,原函数并没有简单的表达式,因此确定积分的反函数变得非常困难. 另外,相对于微分运算来 ...
- "拍牌神器"是怎样炼成的(一)--- 键鼠模拟之WinAPI
作为本系列博文的开篇,有必要先做些声明,用于免责.以绝口水: 博文仅围绕已经弃用的.C/S结构的<上海市个人非营业性客车额度竞拍程序>客户端(NetBidClient)进行介绍,对于正在使 ...
- Java系列:Java8 新特性:强大的 Stream API(创建 Stream、中间操作、终止操作)
Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 Stream API. Stream API ( java.util.stream) 把真正的函数式编程风格引入到Jav ...
- 2022.7.13 tongyf 讲课纪要
前言 这个笔记记晚了,主要是都在跟 \(LCT\) 进行殊死搏斗,所以博客这方面就挂了很久. tongyf 学长当年是拿到省一之后省选炸了,之后暴切高考.ORZ%%% 这节课讲的是线性dp和背包dp, ...
- 不会这5个Excel函数,别说你会做数据分析?
当涉及数据分析时,Excel是一个非常有用的工具,而掌握一些核心函数将大大提高你在数据处理和分析方面的能力.以下是我对五个重要的Excel函数的详细介绍: 1. VLOOKUP 函数 VLOOKUP ...