摘要:數據加密做爲有效防止未受權訪問和防禦數據泄露的技術,在各類信息系統中普遍使用。做爲信息系統的核心,GaussDB(DWS)數倉也提供數據加密功能,包括透明加密和使用SQL函數加密。
本文分享自華爲雲社區《你應該知道的數倉安全——加密函數》,原文做者:zhangkunhn 。算法
數據做爲信息系統中的核心資產,其機密性、完整性和可用性必須獲得保證,以免數據被非法泄漏或非法篡改。當前數據泄露事件層出不窮,給我的和企業形成重大損失。數據庫
防止數據泄露能夠有兩種技術路徑。一是權限管理,採用最小化受權原則對使用數據的用戶和應用程序受權。另外一種是數據加密,包括使用SQL函數加密和透明加密。權限管理在你應該知道的數倉安全——默認權限實現共享schema一文中有所介紹。本文討論透明加密,後續博文再談談SQL函數加密。segmentfault
透明加密可以保障用戶數據安全。更換磁盤、磁盤流出或者運維非法直接讀取磁盤文件會繞過認證、權限管理和審計,從而致使數據泄露的風險。客戶對業務數據有很高機密性要求時建議使用透明加密。安全
透明加密功能是對存在硬盤上的用戶數據加密存儲,對用戶及上層使用SQL的應用不感知。透明的含義是指對客戶來講是無感知的,僅須要建立GaussDB(DWS)集羣時配置透明加密。目前支持行存表和列存表文件的加密存儲,支持集羣級別的透明加密配置。運維
集羣級別的透明加密意味着集羣中的全部庫,庫中的全部表都是加密存儲。集羣級別的透明加密還意味着須要在建立集羣時進行配置,集羣建立以後不可修改,既不能將非加密集羣修改成加密集羣,也不能將加密集羣修改成非加密集羣。函數
透明加密核心是算法和密鑰。咱們採用AES-128算法,加密模式使用CTR。CTR流加密能夠保證實文和密文長度相等,不會致使加密後數據存儲空間膨脹。性能
使用華爲公有云KMS服務管理,保證了用戶的密鑰安全。
加密密鑰層次結構有三層。按層次結構順序排列,這些密鑰爲主密鑰(CMK)、集羣密鑰 (CEK)、數據庫密鑰 (DEK)。加密
出於安全考慮,用戶能夠執行密鑰輪轉操做。密鑰輪轉只輪轉集羣密鑰,不論轉數據庫祕鑰。spa
集羣級透明加密的優勢是全部數據包括用戶表和系統表都加密,適用於全部加密需求。一枚硬幣的兩面性告訴咱們,優勢也多是缺點。對全部數據庫對象加密會對數據導入和查詢帶來性能上的開銷。code
爲解決此問題,後續考慮支持細粒度透明加密。好比能夠支持表級透明加密,用戶在建立表時指定屬性爲加密表,該用戶表的數據會加密存儲。用戶能夠在包含敏感數據的表中開啓加密屬性,在查詢和使用過程當中不感知加解密過程。因爲加密粒度較小,對性能的影響也較小。
透明加密是保障用戶核心數據安全的有效手段。從使用場景和原理介紹了GaussDB(DWS)數倉的透明加密特性,指出了後續透明加密特性的研究方向。
密碼學中密碼算法能夠分爲三類:哈希函數、對稱密碼算法和非對稱密碼算法。
哈希函數又稱爲摘要算法,對於數據$$data$$,$$Hash$$函數會生成固定長度的數據,即$$Hash(data)=result$$。這個過程是不可逆的,即Hash函數不存在反函數,沒法由$$result$$獲得$$data$$。在不該保存明文場景,好比口令(password)屬於敏感信息,系統管理員用戶也不該該知道用戶的明文口令,就應該使用哈希算法,存儲口令的單向哈希值。
實際使用中會加入鹽值和迭代次數,避免相同口令生成相同的哈希值,以防止彩虹表攻擊。
對稱密碼算法使用相同的密鑰來加密和加密數據。對稱密碼算法分爲分組密碼算法和流密碼算法。
分組密碼算法將明文分紅固定長度的分組,用密鑰對每一個分組加密。因爲分組長度固定,當明文長度不是分組長度的整數倍時,會對明文作填充處理。因爲填充的存在,分組密碼算法獲得的密文長度會大於明文長度。
流密碼算法將明文逐比特與密鑰流運算。流密碼算法不須要填充,獲得的密文長度等於明文長度。
非對稱密碼算法,又稱爲公鑰密碼算法。算法使用兩個密鑰:公鑰和私鑰。公鑰向全部人公開,私鑰保密。非對稱密碼算法應用於密鑰協商、數字簽名、數字證書等領域。
GaussDB(DWS)主要提供了哈希函數和對稱密碼算法。哈希函數支持sha256, sha384, sha512和國密sm3。對稱密碼算法支持aes128, aes192, aes256和國密sm4。
將string使用MD5加密,並以16進制數做爲返回值。MD5的安全性較低,不建議使用。
以hashmethod算法對hashstr字符串進行信息摘要,返回信息摘要字符串。支持的hashmethod:sha256, sha384, sha512, sm3。
testdb=# SELECT gs_hash('GaussDB(DWS)', 'sha256'); gs_hash ------------------------------------------------------------------ cc2d1b97c6adfba44bbce7386516f63f16fc6e6a10bd938861d3aba501ac8aab (1 row)
testdb=# SELECT gs_encrypt('GaussDB(DWS)', '1234', 'aes128', 'cbc', 'sha256'); gs_encrypt -------------------------------------------------------------------------------------------------------------------------- AAAAAAAAAADlzZYiNQK1uB+p1gza4Lu3Moj3HdP4E1uJmqfDYBaXDLMt7RZoE0YVx9h2dMRYBQ5fhFNqqM49sUkeS72o8kX5vWRQvfW3fuocGyp+b+lX9A== (1 row)
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。舉例說明了加密函數的使用場景。