天天看點

使用SQL加密函數實作資料列的加解密

作者:華為雲開發者聯盟

本文分享自華為雲社群《【雲小課】EI第51課 看GaussDB(DWS)如何使用SQL加密函數實作資料列加解密-雲社群-華為雲》,作者:Hello EI。

資料加密作為有效防止未授權通路和防護資料洩露的技術,在各種資訊系統中廣泛使用。作為資訊系統的核心,GaussDB(DWS)數倉也提供資料加密功能,包括透明加密和使用SQL函數加密。這裡主要讨論SQL函數加密。

GaussDB(DWS)目前不支援從Oracle、Teradata和MySQL加密後到DWS解密。Oracle、Teradata和MySQL與DWS加解密有差別,需要非加密資料遷移到DWS後在DWS側進行加解密。

使用SQL加密函數實作資料列的加解密

技術背景

  • 哈希函數

哈希函數又稱為摘要算法,對于資料data,Hash函數會生成固定長度的資料,即Hash(data)=result。這個過程是不可逆的,即Hash函數不存在反函數,無法由result得到data。在不應儲存明文場景(比如密碼password屬于敏感資訊),系統管理者使用者也不應該知道使用者的明文密碼,就應該使用雜湊演算法存儲密碼的單向哈希值。

實際使用中會加入鹽值和疊代次數,避免相同密碼生成相同的哈希值,以防止彩虹表攻擊。

使用SQL加密函數實作資料列的加解密

圖1 哈希函數

  • 對稱密碼算法

對稱密碼算法使用相同的密鑰來加密和解密資料。對稱密碼算法分為分組密碼算法和流密碼算法。

分組密碼算法将明文分成固定長度的分組,用密鑰對每個分組加密。由于分組長度固定,當明文長度不是分組長度的整數倍時,會對明文做填充處理。由于填充的存在,分組密碼算法得到的密文長度會大于明文長度。

流加密算法是指加密和解密雙方使用相同僞随機加密資料流作為密鑰,明文資料依次與密鑰資料流順次對應加密,得到密文資料流。實踐中資料通常是一個位(bit)并用異或(xor)操作加密。流密碼算法不需要填充,得到的密文長度等于明文長度。

使用SQL加密函數實作資料列的加解密

圖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)           

點選下方,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲