在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 手機(jī)與無線通信 > 設(shè)計(jì)應(yīng)用 > DB2中的數(shù)據(jù)值加密

            DB2中的數(shù)據(jù)值加密

            作者: 時(shí)間:2017-06-12 來源:網(wǎng)絡(luò) 收藏
            多年來,數(shù)據(jù)庫已經(jīng)能夠阻止未經(jīng)授權(quán)的人看到其中的數(shù)據(jù),這通常是通過數(shù)據(jù)庫管理器中的特權(quán)和權(quán)限來實(shí)現(xiàn)的。在當(dāng)前的環(huán)境下,對存儲數(shù)據(jù)的保密的需求日益增長。這意味著即使 DBA 對表中的數(shù)據(jù)有完全的訪問權(quán)限,但是表中可能還有數(shù)據(jù)擁有者不希望任何其他人看到的某些信息。特別是對于基于 Web 的應(yīng)用程序,這一問題就更加明顯了,在這種應(yīng)用程序中,用戶輸入的數(shù)據(jù)(比如信用卡號)需要保存起來,以備同一用戶以后使用該應(yīng)用程序。同時(shí),用戶擁有者希望能夠確保任何其他人不能訪問這種數(shù)據(jù)。為了實(shí)現(xiàn)這種功能,DB2 內(nèi)置了一些 SQL 函數(shù),這些函數(shù)允許應(yīng)用程序和解密數(shù)據(jù)。當(dāng)將數(shù)據(jù)插入到數(shù)據(jù)庫中時(shí),可以使用用戶提供的密碼對其。當(dāng)檢索該數(shù)據(jù)的時(shí)候,必須提供相同的密碼才能解密數(shù)據(jù)。對于要多次使用同一個(gè)密碼的情況,可以使用一個(gè)賦值語句設(shè)置 ENCRYPTION PASSWORD 值,并令其在某次連接期間內(nèi)有效。

            本文將描述這些 SQL 函數(shù),并給出一些關(guān)于如何使用這些加密函數(shù)的例子。我們還將討論在中使用加密數(shù)據(jù)的設(shè)計(jì)和性能相關(guān)事項(xiàng)。

            實(shí)現(xiàn)

            下面顯示了這些新的 SQL 函數(shù)的簽名。在 DB2 文檔的 SQL Reference 部分中有更詳細(xì)的文檔。(為了確保對加密的數(shù)據(jù)使用正確的數(shù)據(jù)類型和長度,請務(wù)必閱讀 SQL Reference 中 ENCRYPT 函數(shù)下的“Table Column Definition”部分。)

            Encrypt (StringDataToEncrypt, PasswordOrPhrase, PasswordHint)

            Decrypt_Char(EncryptedData, PasswordOrPhrase)

            GetHint(EncryptedData)

            Set Encryption Password

            用于對數(shù)據(jù)加密的算法是一個(gè) RC2 分組密碼(block cipher),它帶有一個(gè) 128 位的密鑰。這個(gè) 128 位的密鑰是通過消息摘要從密碼得來的。加密密碼與 DB2 認(rèn)證無關(guān),僅用于數(shù)據(jù)的加密和解密。

            這里可以提供一個(gè)可選的參數(shù) PasswordHint,這是一個(gè)字符串,可以幫助用戶記憶用于對數(shù)據(jù)加密的 PasswordOrPhrase。(例如,可以使用 George 作為記憶 Washington的提示。)

            列級加密

            列級加密(column level encryption)意味著對于一個(gè)給定列中的所有值都使用相同的密碼進(jìn)行加密。這種類型的加密可以在視圖中使用,也可以在使用了一個(gè)公共密碼的情況下使用。當(dāng)對一個(gè)或多個(gè)表中所有的行使用相同的密鑰時(shí),ENCRYPTION PASSWORD 專用寄存器將十分有用。

            例 1:這個(gè)例子使用 ENCRYPTION PASSWORD 值來保存加密密碼。它對雇員的社會保險(xiǎn)號進(jìn)行加密,并以經(jīng)過加密的形式將其存儲在 EMP 表中。

            create table emp (ssn varchar(124) for bit data);

            set encryption password = Ben123;

            insert into emp (ssn) values(encrypt(289-46-8832));

            insert into emp (ssn) values(encrypt(222-46-1904));

            insert into emp (ssn) values(encrypt(765-23-3221));

            select decrypt_char(ssn) from emp;

            例 2:這個(gè)例子在結(jié)合使用視圖的情況下使用 ENCRYPTION PASSWORD 值來保存加密密碼。下面的語句聲明了 emp 表的一個(gè)視圖:

            create view clear_ssn (ssn) as select decrypt_char(ssn) from emp;
            在應(yīng)用程序代碼中,我們將 ENCRYPTION PASSWORD 設(shè)置為 Ben123,現(xiàn)在可以使用 clear_ssn 視圖了。

            set encryption password = Ben123;

            select ssn from clear_ssn;

            行-列(單元格)或 集合-列級加密

            行-列(單元格)或 集合-列(Set-Column)級加密意味著在一個(gè)加密數(shù)據(jù)列內(nèi)使用多個(gè)不同的密碼。例如,Web 站點(diǎn)可能需要保存客戶信用卡號(ccn)。在這個(gè)數(shù)據(jù)庫中,每個(gè)客戶可以使用他自己的密碼或短語來加密 ccn。

            例 3:Web 應(yīng)用程序收集關(guān)于客戶的用戶信息。這種信息包括客戶名稱(存儲在宿主變量 custname中)、信用卡號(存儲在宿主變量 cardnum中)和密碼(存儲在宿主變量 userpswd中)。應(yīng)用程序像下面這樣執(zhí)行客戶信息的插入操作。

            insert into customer (ccn, name) values(encrypt(:cardnum, :userpswd), :custname)
            當(dāng)應(yīng)用程序需要重新顯示某客戶的信用卡信息時(shí),客戶要輸入密碼,同樣該密碼也要存儲在宿主變量 userpswd 中。之后,可以像下面這樣檢索該 ccn :

            select decrypt_char(ccn, :userpswd) from customer where name = :custname;
            例 4:這個(gè)例子使用提示來幫助客戶記憶他們的密碼。這里使用與例 3 相同的應(yīng)用程序,該應(yīng)用程序?qū)⑻崾颈4娴剿拗髯兞?pswdhint中。假設(shè) userpswd 的值是 Chamonix, pswdhint的值是 Ski Holiday。

            insert into customer (ccn, name)

            values(encrypt(:cardnum, :userpswd, :pswdhint), :custname)
            如果客戶請求關(guān)于所使用的密碼的提示,可以使用下面的查詢。

            select gethint(ccn) into :pswdhint from customer where name = :custname;
            pswdhint的值被設(shè)置為Ski Holiday。

            加密非字符值

            數(shù)值和日期/時(shí)間數(shù)據(jù)類型的加密通過強(qiáng)制類型轉(zhuǎn)換得到間接的支持。非字符的 SQL 類型通過強(qiáng)制轉(zhuǎn)換為 varchar 或 char,就可以被加密了。有關(guān)強(qiáng)制類型轉(zhuǎn)換的更多信息,請參閱 SQL 參考文檔中的 “Casting Between Data Types” 部分。

            例 5:加密和解密 TIMESTAMP 數(shù)據(jù)時(shí)用到的強(qiáng)制類型轉(zhuǎn)換函數(shù)。

            -- Create a table to store our encrypted value

            create table etemp (c1 varchar(124) for bit data);

            set encryption password next password;

            -- Store encrypted timestamp

            insert into etemp values encrypt(char(CURRENT TIMESTAMP));

            -- Select decrypt timestamp

            select timestamp(decrypt_char(c1)) from etemp;

            例 6:加密/解密 double 數(shù)據(jù)。

            set encryption password next password;

            insert into etemp values encrypt(char(1.11111002E5));

            select double(decrypt_char(c1)) from etemp;

            性能

            加密,就其本質(zhì)而言,會使大部分 SQL 語句慢下來。但是如果多加注意,多加判斷,還是可以將大量的額外開銷降至最低。而且,加密數(shù)據(jù)對于數(shù)據(jù)庫的設(shè)計(jì)有著很大的影響。通常,您需要對一個(gè)模式中的一些敏感數(shù)據(jù)元素進(jìn)行加密,例如社會保險(xiǎn)號、信用卡號、病人姓名,等等。而有些數(shù)據(jù)值就不是那么適于加密了 -- 例如布爾值(true 和 false),或者其他的像整數(shù) 1 到 10 這樣的小型集合。這些值與列名一起很容易被猜出,因此需要判斷加密是否真的有用。

            在某些情況下,對加密的數(shù)據(jù)創(chuàng)建索引是很好的主意。加密數(shù)據(jù)的正確匹配及連接將使用您創(chuàng)建的索引。由于加密數(shù)據(jù)實(shí)質(zhì)上是二進(jìn)制數(shù)據(jù),因此對加密數(shù)據(jù)進(jìn)行范圍檢查時(shí)需要掃描表。范圍檢查需要解密某一列在所有行的值,因此應(yīng)該避免進(jìn)行范圍檢查,至少也應(yīng)該進(jìn)行適當(dāng)?shù)恼{(diào)優(yōu)。

            下面的場景闡明了我們的討論。考慮一種常見的主從(master-detail)模式,程序員可以在很多項(xiàng)目中使用這種模式。我們將對雇員的社會保險(xiǎn)號(ssn)實(shí)現(xiàn)列級加密。在主表 emp 和從表 empProject 中,ssn 將以加密的形式存儲。

            -- Define Tables and Indexes for encrypted data

            create table emp (ssn varchar(48) for bit data,

            name varchar(48) );

            create unique index idxEmp on emp ( ssn ) includes (name) ;

            create table empProject( ssn varchar(48) for bit data,

            projectName varchar(48) );

            create index idxEmpPrj on empProject ( ssn );

            -- Add some data

            set encryption password = ssnPassWord;

            insert into emp values (encrypt(480-93-7558),Super Programmer);

            insert into emp values (encrypt(567-23-2678),Novice Programmer);

            insert into empProject values (encrypt(480-93-7558),UDDI Project);

            insert into empProject values (encrypt(567-23-2678),UDDI Project);

            insert into empProject values (encrypt(480-93-7558),DB2 UDB Version 10);

            -- Find the programmers working on UDDI select a.name, decrypt_char(a.ssn)

            from emp a, empProject b

            where

            a.ssn = b.ssn

            and b.project =UDDI Project;

            -- Build a list of the projects that the programmer with ssn

            -- 480-93-7558 is working on

            select projectName

            from empProject

            where ssn = encrypt(480-93-7558);

            相對于上面的例子,下面的兩個(gè)例子是 不應(yīng)該采用的反面典型。雖然這些查詢同樣能夠返回正確的答案,但是它們會需要為所有行解密 ssn。當(dāng)表很大的時(shí)候,這個(gè)問題就會變得突出起來。

            select a.name, decrypt_char(a.ssn)

            from emp a, empProject b

            where

            decrypt_char(a.ssn) = decrypt_char(b.ssn)

            and b.project =UDDI Project;

            該查詢會要求解密 emp 表的每一行以及 empProject 表的每個(gè) UDDI Project 行,以執(zhí)行連接。

            select projectName

            from empProject

            where decrypt_char(ssn)= 480-93-7558;

            該查詢會要求解密 empProject 表中的每一行。

            結(jié)束語

            在本文中,我們演示了 IBM DB2 Universal Database 中的加密函數(shù)如何提供簡單方式來加密敏感數(shù)據(jù)。這些函數(shù)可用來實(shí)現(xiàn)列級和行-列級的加密。在設(shè)計(jì)和實(shí)現(xiàn)期間,開發(fā)人員應(yīng)該審視一些重要的性能相關(guān)事項(xiàng)。數(shù)據(jù)加密為隱藏私有數(shù)據(jù)增添了一種新的可用工具,即使對于管理人員,也能起到保密的作用。



            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉