翻譯|使用教程|編輯:李爽夏|2019-02-11 10:21:17.000|閱讀 489 次
概述:本篇文章介紹了UniDAC中的數據加密。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
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屬性中指定)。
如果數據存儲時沒有附加信息,則無法確定數據是否加密。在這種情況下,只應將加密的數據存儲在列中,否則,由于無法區分數據的性質,會出現混淆。同樣,從信息保護的角度來看,類似的源數據將以加密的形式等價,這是不好的。這種方法的優點是初始數據的大小等于加密數據的大小。
為了避免這些問題,建議與數據一起存儲適當的GUID,這對于指定記錄中的值是加密的,并且在讀取數據時必須對其進行解密是必需的。這允許您避免混淆并將加密和解密的數據保存在同一列中,這在使用現有表時尤為重要。同樣,這樣做時,在數據加密之前會生成一個隨機初始化向量,用于加密。這允許您接收相同初始數據的不同結果,從而顯著提高了安全性。
最可取的方法是存儲哈希數據以及GUID和加密信息,以確定數據的有效性并驗證其完整性。這樣,如果在傳輸或數據存儲的任何階段試圖偽造數據,在解密數據時,都會產生相應的錯誤。為了計算散列,可以使用SHA1或MD5算法(HashAlgorithm屬性)。
后兩種方法的缺點是存儲輔助信息需要額外的內存。
由于加密算法使用一定大小的緩沖區,并且在存儲附加信息時,需要使用附加內存,因此TCREncryptor僅支持對字符串或二進制字段(ftString、ftWideString、ftBytes、ftvarBytes、ftBlob、ftMemo、ftWideMemo)進行加密。如果使用字符串字段加密,首先對數據進行加密,然后將獲得的二進制數據轉換為十六進制格式。在這種情況下,數據存儲需要兩倍的空間(一個字節=2個十六進制字符)。
因此,為了能夠加密其他數據類型(如日期、數字等),需要在表中創建二進制或blob類型的字段,然后在數據映射的幫助下將其轉換為客戶機端的所需類型。
需要注意的是,在服務器端不可能通過加密字段進行搜索和排序。只有在使用Locate和LocaTex方法對數據進行解密之后,才能在客戶端上對這些字段執行數據搜索。排序是通過設置TMemDataSet.IndexFieldNames屬性來執行的。
例如:
例如,表中存儲了一個企業的員工列表,其中包含以下數據:全名、雇用日期、工資和照片。我們希望所有這些數據都以加密形式存儲。編寫用于創建表的腳本:
CREATE TABLE EMP ( EMPNO varbinary IDENTITY (1,1) NOT NULL PRIMARY KEY, ENAME varbinary (2000), HIREDATE varbinary (200), SAL varbinary (200), FOTO VARBINARY);
如我們所見,文本信息、日期和浮點數的存儲字段是用VARBINARY類型創建的。這是為了能夠存儲加密的信息,而在文本字段的情況下——為了提高性能。編寫代碼在客戶機上處理這些信息。
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;
購買UniDAC正版授權,請點擊“”喲!
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn