你应该知道的数仓安全——加密函数

你应该知道的数仓安全——加密函数

数据加密作为有效防止未授权访问和防护数据泄露的技术,在各种信息系统中广泛使用。作为信息系统的核心,GaussDB(DWS)数仓也提供数据加密功能,包括透明加密和使用SQL函数加密。透明加密在你应该知道的数仓安全——透明加密一文中已有介绍。本文讨论SQL函数加密。

加密算法介绍

密码学中密码算法可以分为三类:哈希函数、对称密码算法和非对称密码算法。

  • 哈希函数

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

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

  • 对称密码算法

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

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

    流密码算法将明文逐比特与密钥流运算。流密码算法不需要填充,得到的密文长度等于明文长度。

  • 非对称密码算法

    非对称密码算法,又称为公钥密码算法。算法使用两个密钥:公钥和私钥。公钥向所有人公开,私钥保密。非对称密码算法应用于密钥协商、数字签名、数字证书等领域。

加密函数SQL接口

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。

testdb=# SELECT gs_hash('GaussDB(DWS)', 'sha256');
                             gs_hash                              
------------------------------------------------------------------
 cc2d1b97c6adfba44bbce7386516f63f16fc6e6a10bd938861d3aba501ac8aab
(1 row)

对称密码算法

  • gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod)
    采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。
    支持的cryptotype:aes128, aes192, aes256, sm4。
    支持的cryptomode:cbc。
    支持的hashmethod:sha256, sha384, sha512, sm3。
testdb=# SELECT gs_encrypt('GaussDB(DWS)', '1234', 'aes128', 'cbc',  'sha256');
                                                        gs_encrypt                                                        
--------------------------------------------------------------------------------------------------------------------------
 AAAAAAAAAADlzZYiNQK1uB+p1gza4Lu3Moj3HdP4E1uJmqfDYBaXDLMt7RZoE0YVx9h2dMRYBQ5fhFNqqM49sUkeS72o8kX5vWRQvfW3fuocGyp+b+lX9A==
(1 row)
  • gs_decrypt(decryptstr, keystr,cryptotype, cryptomode, hashmethod)
    采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对decryptstr字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。
testdb=# SELECT gs_decrypt('AAAAAAAAAADlzZYiNQK1uB+p1gza4Lu3Moj3HdP4E1uJmqfDYBaXDLMt7RZoE0YVx9h2dMRYBQ5fhFNqqM49sUkeS72o8kX5vWRQvfW3fuocGyp+b+lX9A==', '1234', 'aes128', 'cbc',  'sha256');
  gs_decrypt  
--------------
 GaussDB(DWS)
(1 row)

应用举例

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

testdb=# create table student (id int, name text, score text);
CREATE TABLE
testdb=# insert into student values (1, gs_hash('alice', 'sha256'), gs_encrypt('95', '12345', 'aes128', 'cbc', 'sha256'));
INSERT 0 1
testdb=# insert into student values (2, gs_hash('bob', 'sha256'), gs_encrypt('92', '12345', 'aes128', 'cbc', 'sha256'));
INSERT 0 1
testdb=# insert into student values (3, gs_hash('peter', 'sha256'), gs_encrypt('98', '12345', 'aes128', 'cbc', 'sha256'));
INSERT 0 1

没有密钥的用户即使拥有了select权限也无法看到name和score这两列加密数据。

testdb=# select * from student;
 id |                               name                               |                                                          score                                                           
----+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------
  1 | 2bd806c97f0e00af1a1fc3328fa763a9269723c8db8fac4f93af71db186d6e90 | AAAAAAAAAAB26RmKZdGciLdOM1Z0sjsHg6Qh1b8taF3cY5KDVm+faJK5AT9tjufkr3Wogj3tIpFfiIEb6+miGqPHWcmKnFsArAMoBG9pPDawGs1Qze7xGg==
  2 | 81b637d8fcd2c6da6359e6963113a1170de795e4b725b84d1e0b4cfd9ec58ce9 | AAAAAAAAAAB26RmKZdGciLdOM1Z0sjsHZOHH7URkyme6r8Hfh1k0UsVbgbREjFMkgB52w+7GtUGqGgUik07ghajSD9PMIDLd/49wBCVROm2/HSOw6jzbxA==
  3 | 026ad9b14a7453b7488daa0c6acbc258b1506f52c441c7c465474c1a564394ff | AAAAAAAAAAB26RmKZdGciLdOM1Z0sjsHwv6p/OAfDUyVULAqpaHIrYJYMcqLmQSj3K/REyavfMoKB7hgUpEPXfHRutWur37bru68jjt5XcBHFBjZeMgowA==
(3 rows)

拥有密钥的用户可以通过解密查看到加密数据。

testdb=# select id, gs_decrypt(score, '12345', 'aes128', 'cbc', 'sha256') from student;
 id | gs_decrypt 
----+------------
  1 | 95
  2 | 92
  3 | 98
(3 rows)

总结

数据加密是防止未授权访问和防护数据泄露的有效技术。介绍了密码算法的基本原理和GaussDB(DWS)数仓的加密函数,包括哈希函数gs_hash,对称密码算法gs_encrypt/gs_decrypt。举例说明了加密函数的使用场景。

合智互联客户成功服务热线:400-1565-661

admin
admin管理员

上一篇:大红大紫的 Golang 真的是后端开发中的万能药吗?
下一篇:从零开始学习python | 通过示例学习如何制作Python模式程序

留言评论

暂无留言
取消
扫码支持