數據加密作為有效防止未授權訪問和防護數據泄露的技術,在各種信息系統中廣泛使用。作為信息系統的核心,GaussDB(DWS)數倉也提供數據加密功能,包括透明加密和使用SQL函數加密。本章節主要討論SQL函數加密。
說明DWS目前不支持從Oracle、Teradata和MySQL加密后到DWS解密。Oracle、Teradata和MySQL與DWS加解密有區別,需要非加密數據遷移到DWS后在DWS側進行加解密。
技術背景
- 哈希函數
哈希函數又稱為摘要算法,對于數據data,Hash函數會生成固定長度的數據,即Hash(data)=result。這個過程是不可逆的,即Hash函數不存在反函數,無法由result得到data。在不應保存明文場景(比如口令password屬于敏感信息),系統管理員用戶也不應該知道用戶的明文口令,就應該使用哈希算法存儲口令的單向哈希值。
實際使用中會加入鹽值和迭代次數,避免相同口令生成相同的哈希值,以防止彩虹表攻擊。
哈希函數


- 對稱密碼算法
對稱密碼算法使用相同的密鑰來加密和解密數據。對稱密碼算法分為分組密碼算法和流密碼算法。
分組密碼算法將明文分成固定長度的分組,用密鑰對每個分組加密。由于分組長度固定,當明文長度不是分組長度的整數倍時,會對明文做填充處理。由于填充的存在,分組密碼算法得到的密文長度會大于明文長度。
流加密算法是指加密和解密雙方使用相同偽隨機加密數據流作為密鑰,明文數據依次與密鑰數據流順次對應加密,得到密文數據流。實踐中數據通常是一個位(bit)并用異或(xor)操作加密。流密碼算法不需要填充,得到的密文長度等于明文長度。
對稱密碼算法


技術實現
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。
- 對稱密碼算法
?gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod)
采用cryptotype和cryptomode組成的加密算法以及hashmethod指定的HMAC算法,以keystr為密鑰對encryptstr字符串進行加密,返回加密后的字符串。
?gs_decrypt(decryptstr, keystr,cryptotype, cryptomode, hashmethod)
采用cryptotype和cryptomode組成的加密算法以及hashmethod指定的HMAC算法,以keystr為密鑰對decryptstr字符串進行解密,返回解密后的字符串。解密使用的keystr必須保證與加密時使用的keystr一致才能正常解密。
?gs_encrypt_aes128(encryptstr,keystr)
以keystr為密鑰對encryptstr字符串進行加密,返回加密后的字符串。keystr的長度范圍為1~16字節。
?gs_decrypt_aes128(decryptstr,keystr)
以keystr為密鑰對decryptstr字符串進行解密,返回解密后的字符串。解密使用的keystr必須保證與加密時使用的keystr一致才能正常解密。keystr不得為空。
更多詳情參見《數據倉庫服務用戶開發指南》中的“管理數據庫安全>敏感數據管理>使用函數加解密”章節。
應用示例
1.連接數據庫。
具體步驟參見《數據倉庫服務用戶操作指南》中的“連接集群>使用gsql命令行客戶端連接集群”章節。
2.創建表student,有id,name和score三個屬性。使用哈希函數加密保存name,使用對稱密碼算法保存score。
CREATE TABLE student (id int, name text, score text, subject text);
INSERT INTO student VALUES (1, gs_hash('alice', 'sha256'), gs_encrypt('95', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('math', '1234'));
INSERT INTO student VALUES (2, gs_hash('bob', 'sha256'), gs_encrypt('92', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('english', '1234'));
INSERT INTO student VALUES (3, gs_hash('peter', 'sha256'), gs_encrypt('98', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('science', '1234'));
3.不使用密鑰查詢表student,通過查詢結果可知:沒有密鑰的用戶即使擁有了select權限也無法看到name和score這兩列加密數據。
select * from student;
id | name | score |
subject
----+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+-----------
-----------------------------------------------------------------------------------
1 | 2bd806c97f0e00af1a1fc3328fa763a9269723c8db8fac4f93af71db186d6e90 | AAAAAAAAAABAuUC3VQ+MvPCDAaTUySl1e2gGLr4/ATdCUjTEvova3cb/Ba3ZKqIn1yNVGEFBvJnTq/3sLF4//Gm8qG7AyfNbbqdW3aYErLVpbE/QWFX9Ig== | aFEWQR2gkj
iu6sfsAad+dHzfFDHePZ6xd44zyekh+qVFlh9FODZ0DoaFAJXctwUsiqaiitTxW8cCSEaNjS/E7Ke1ruY=
2 | 81b637d8fcd2c6da6359e6963113a1170de795e4b725b84d1e0b4cfd9ec58ce9 | AAAAAAAAAABAuUC3VQ+MvPCDAaTUySl1taXxAoDqE793hgyCJvC0ESdAX5Mtgdq2LXI1f5ZxraQ73WIJVtIBX8oe3gTDxoXGlHbHht4kzM4U8dOwr5rjgg== | aFEWQR2gkj
iu6sfsAad+dM8tPTDo/Pds6ZmqdmjGiKxf39+Wzx5NoQ6c8FrzihnRzgc0fycWSu5YGWNOKYWhRsE84Ac=
3 | 026ad9b14a7453b7488daa0c6acbc258b1506f52c441c7c465474c1a564394ff | AAAAAAAAAACnyusORPeApqMUgh56ucQu3uso/Llw5MbPFMkOXuspEzhhnc9vErwOFe6cuGtx8muEyHCX7V5yXs+8FxhNh3n5L3419LDWJJLY2O4merHpSg== | zomphRfHV4
H32hTtgkio1PyrobVO8N+hN7kAKwtygKP2E7Aaf1vsjmtLHcL88jyeJNe1lxe0fAvodzPJAxAuV3UJN4M=
(3 rows)
4.使用密鑰查詢表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
----+------------+-------------------
1 | 95 | math
2 | 92 | english
3 | 98 | science
(3 rows)