UniDAC使用教程(五):數據加密

下載UniDAC最新版本算法

Universal Data Access Components (UniDAC)是一款通用數據庫訪問組件,提供了多個數據庫的直接訪問,如針對Windows的Delphi, C++Builder, Lazarus (以及 Free Pascal) , Mac OS X, iOS, Android, Linux和64和32位的FreeBSD等等。咱們將長期的經驗集於這個小組件,提供統一的數據庫鏈接訪問(如oracle、微軟SQL等等)。這意味着您能夠在您的項目之間輕鬆地切換不一樣的數據庫,以及建立跨數據庫應用程序接口。數據庫

UniDAC擁有內置的數據加密和解密算法。要啓用加密,應將TCREncryptor組件附加到數據集,並指定加密字段。在表中插入或更新數據時,將按照指定的方法在客戶端加密信息。一樣,當從服務器讀取數據時,組件會「即時」解密這些字段中的數據。安全

對於加密,您應該指定數據加密算法(EncryptionAlgorithm屬性)和密碼(Password屬性)。根據指定的密碼生成密鑰,對數據進行加密。也可使用SetKey方法直接設置密鑰。服務器

存儲加密數據時,除了初始數據外,還能夠存儲其餘信息:GUID和散列。(方法在TCREncryptor.DataHeader屬性中指定)。oracle

若是數據存儲時沒有附加信息,則沒法肯定數據是否加密。在這種狀況下,只應將加密的數據存儲在列中,不然,因爲沒法區分數據的性質,會出現混淆。一樣,從信息保護的角度來看,相似的源數據將以加密的形式等價,這是很差的。這種方法的優勢是初始數據的大小等於加密數據的大小。ide

爲了不這些問題,建議與數據一塊兒存儲適當的GUID,這對於指定記錄中的值是加密的,而且在讀取數據時必須對其進行解密是必需的。這容許您避免混淆並將加密和解密的數據保存在同一列中,這在使用現有表時尤其重要。一樣,這樣作時,在數據加密以前會生成一個隨機初始化向量,用於加密。這容許您接收相同初始數據的不一樣結果,從而顯著提升了安全性。性能

最可取的方法是存儲哈希數據以及GUID和加密信息,以肯定數據的有效性並驗證其完整性。這樣,若是在傳輸或數據存儲的任何階段試圖僞造數據,在解密數據時,都會產生相應的錯誤。爲了計算散列,可使用SHA1或MD5算法(HashAlgorithm屬性)。ui

後兩種方法的缺點是存儲輔助信息須要額外的內存。加密

因爲加密算法使用必定大小的緩衝區,而且在存儲附加信息時,須要使用附加內存,所以TCREncryptor僅支持對字符串或二進制字段(ftString、ftWideString、ftBytes、ftvarBytes、ftBlob、ftMemo、ftWideMemo)進行加密。若是使用字符串字段加密,首先對數據進行加密,而後將得到的二進制數據轉換爲十六進制格式。在這種狀況下,數據存儲須要兩倍的空間(一個字節=2個十六進制字符)。spa

所以,爲了可以加密其餘數據類型(如日期、數字等),須要在表中建立二進制或blob類型的字段,而後在數據映射的幫助下將其轉換爲客戶機端的所需類型。

須要注意的是,在服務器端不可能經過加密字段進行搜索和排序。只有在使用Locate和LocaTex方法對數據進行解密以後,才能在客戶端上對這些字段執行數據搜索。排序是經過設置TMemDataSet.IndexFieldNames屬性來執行的。

例如:

例如,表中存儲了一個企業的員工列表,其中包含如下數據:全名、僱用日期、工資和照片。咱們但願全部這些數據都以加密形式存儲。編寫用於建立表的腳本:

1

2

3

4

5

6

CREATE TABLE EMP (

EMPNO varbinary IDENTITY (1,1) NOT NULL PRIMARY KEY,

ENAME varbinary (2000),

HIREDATE varbinary (200),

SAL varbinary (200),

FOTO VARBINARY);

如咱們所見,文本信息、日期和浮點數的存儲字段是用VARBINARY類型建立的。這是爲了可以存儲加密的信息,而在文本字段的狀況下——爲了提升性能。編寫代碼在客戶機上處理這些信息。

1

2

3

4

5

6

7

8

9

10

11

UniQuery.SQL.Text : = 'SELECT * FROM EMP';

 

UniQuery.Encryption.Encryptor : = UniEncryptor;

UniQuery.Encryption.Fields : = 'ENAME, HIREDATE, SAL, FOTO';

UniEncryptor.Password : = '11111';

 

UniQuery.DataTypeMap.AddFieldNameRule ('ENAME', ftString);

UniQuery.DataTypeMap.AddFieldNameRule ('HIREDATE', ftDateTime);

UniQuery.DataTypeMap.AddFieldNameRule ('SAL', ftFloat);

 

UniQuery.Open;

相關文章
相關標籤/搜索