雲小課|使用SQL加密函數實現數據列的加解密

来源:https://www.cnblogs.com/huaweiyun/archive/2022/11/16/16895925.html
-Advertisement-
Play Games

摘要:數據加密作為有效防止未授權訪問和防護數據泄露的技術,在各種信息系統中廣泛使用。作為信息系統的核心,GaussDB(DWS)數倉也提供數據加密功能,包括透明加密和使用SQL函數加密。 本文分享自華為雲社區《看GaussDB(DWS)如何使用SQL加密函數實現數據列加解密》,作者:Hello EI ...


摘要:數據加密作為有效防止未授權訪問和防護數據泄露的技術,在各種信息系統中廣泛使用。作為信息系統的核心,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)

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 業界各大廠商或開源團隊都會構建並提供一些緩存框架組件提供給開發者按需選擇,這裡就會涉及到一個標準規範的遵循問題,本文我們一起聊聊JCache API規範與SpringCache規範。 ...
  • 今天看了段DNF視頻,有發現到血條變化效果是這樣的: 這裡為了突出Boss受到的傷害之大,也就是玩家的傷害之高,以至於Boss的血條變化會出現殘影效果。 那麼,就簡單使用協程來實現了一下這種效果: 實現思路也蠻簡單的:就是在Canvas下創建兩個Slider,分別是Slider和Slider01,先 ...
  • 一:背景 1.講故事 今天給大家帶來一個入門級的 CPU 爆高案例,前段時間有位朋友找到我,說他的程式間歇性的 CPU 爆高,不知道是啥情況,讓我幫忙看下,既然找到我,那就用 WinDbg 看一下。 二:WinDbg 分析 1. CPU 真的爆高嗎 其實我一直都在強調,要相信數據,口說無憑,一定要親 ...
  • 一、前言 本文章彙總c#中常見的鎖,基本都列出了該鎖在微軟官網的文章,一些不常用的鎖也可以參考微軟文章左側的列表,方便溫習回顧。 二、鎖的分類 2.1、用戶模式鎖 1、volatile 關鍵字 volatile 並沒有實現真正的線程同步,操作級別停留在變數級別並非原子級別,對於單系統處理器中,變數存 ...
  • 前言 拋開死鎖不談,只聊性能問題,儘管鎖總能粗暴的滿足同步需求,但一旦存在競爭關係,意味著一定會有線程被阻塞,競爭越激烈,被阻塞的線程越多,上下文切換次數越多,調度成本越大,顯然在高併發的場景下會損害性能。在高併發高性能且要求線程安全的述求下,無鎖構造(非阻塞構造)閃亮登場。 參考文檔: C# - ...
  • 在 Windows 環境下如果採用 IIS 作為 網站伺服器時,常規的網站綁定 HTTPS 需要一個一個站點手動選擇對應的證書綁定,而且證書過期之後更換證書時也是需要一個個重新綁定操作,無法便捷的做到像 Nginx 或者 Apache 等程式一樣,直接在配置文件中指定所需要使用的證書文件的路徑,像 ...
  • //源文件 void RccPhyConfig() { uint16_t retry = 0; RCC->APB1ENR|=1<<28; //電源介面時鐘使能 PWR->CR1|=3<<14; //高性能模式,時鐘可到 180Mhz PWR->CR1|=1<<16; //使能過驅動,頻率可到 216 ...
  • Babelfish是在PostgreSQL的基礎之上實現了類似Microsoft SQL Server部分功能。為了實現這個目標,PostgreSQL核心內部的幾個部分必須被修改。PostgreSQL 沒有提供這種開箱即用的功能,因此必須提供附加組件才能實現這一點。 Babelfish... ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...