如何加密會計信息系統(tǒng)數(shù)據(jù)庫

會計信息系統(tǒng)是基于計算機(jī)的、將會計數(shù)據(jù)轉(zhuǎn)換為信息的系統(tǒng)。會計信息系統(tǒng)是利用信息技術(shù)對會計信息進(jìn)行采集、存儲和處理,完成會計核算任務(wù),并能提供為進(jìn)行會計管理、分析、決策用的輔助信息的系統(tǒng),于20世紀(jì)80年代初開始在我國運(yùn)用的。

但隨著網(wǎng)絡(luò)技術(shù)的迅速發(fā)展及應(yīng)用領(lǐng)域的不斷拓寬,會計信息系統(tǒng)也出現(xiàn)了許多不安全的因素。數(shù)據(jù)庫集中存儲著關(guān)鍵信息,容易成為攻擊的對象,特別對持有敏感信息的會計信息系統(tǒng)來說更是如此。為了使得會計信息系統(tǒng)在網(wǎng)絡(luò)環(huán)境下安全有效地運(yùn)行,給會計信息系統(tǒng)數(shù)據(jù)庫加密是相當(dāng)必要的。

一、會計信息系統(tǒng)的安全策略及安全隱患

傳統(tǒng)的會計信息系統(tǒng)通過用戶權(quán)限來限制用戶可以訪問的數(shù)據(jù),并將系統(tǒng)與外網(wǎng)斷開連接,從而達(dá)到保護(hù)數(shù)據(jù)的目的。但是對數(shù)據(jù)庫本身的保護(hù)卻沒有涉及,財務(wù)數(shù)據(jù)以明文的形式保存在數(shù)據(jù)庫中。

數(shù)據(jù)庫作為存放財務(wù)數(shù)據(jù)的主要形式,數(shù)據(jù)庫面對著各方面的嚴(yán)重威脅,就要保證數(shù)據(jù)庫環(huán)境的兩個主要安全問題:完整性和機(jī)密性。

二、會計信息系統(tǒng)數(shù)據(jù)庫安全性要求

1、會計信息系統(tǒng)數(shù)據(jù)庫的完整性

數(shù)據(jù)庫的完整性是DBMS、操作系統(tǒng)和計算機(jī)系統(tǒng)管理者共同的責(zé)任。數(shù)據(jù)庫管理程序必須進(jìn)行訪問控制,確保只有經(jīng)批準(zhǔn)的用戶才能更新或刪除數(shù)據(jù),另外,數(shù)據(jù)庫系統(tǒng)還必須防范人為的外力災(zāi)難。從操作系統(tǒng)和計算機(jī)系統(tǒng)管理者的角度看,數(shù)據(jù)庫和DBMS分別是文件和程序。因此對整個數(shù)據(jù)庫的一種保護(hù)形式是對系統(tǒng)上的所有文件周期性地做備份。數(shù)據(jù)庫的周期性備份可以減少由災(zāi)禍造成的損失,并能在系統(tǒng)出錯后重建數(shù)據(jù)庫,因此DBMS必須維護(hù)對事務(wù)的記錄。在發(fā)生數(shù)據(jù)庫系統(tǒng)失敗的事故時,由數(shù)據(jù)庫的備份開始重新處理記錄之后的所有業(yè)務(wù)。

2、元素的完整性

數(shù)據(jù)庫元素的完整性是指它們的正確性和準(zhǔn)確性。由于用戶在搜集數(shù)據(jù)計算結(jié)果和輸入數(shù)值時可能會出現(xiàn)錯誤,所以DBMS必須幫助用戶在輸入時能發(fā)現(xiàn)錯誤,并在插入錯誤數(shù)據(jù)后能糾正他們。

DBMS用3種方式維護(hù)數(shù)據(jù)庫的每個項(xiàng)目的完整性。

(1)字段檢查:這種檢查可以防止在向數(shù)據(jù)庫輸入時可能出現(xiàn)的簡單錯誤。

(2)訪問控制:通過訪問控制來維護(hù)數(shù)據(jù)庫的完整性、真實(shí)性和一致性。一個數(shù)據(jù)庫可能包含幾種來源的數(shù)據(jù),而在開發(fā)一個數(shù)據(jù)庫之前,可能在許多表中存儲了重復(fù)的數(shù)據(jù),這就需要一種策略來解決可能發(fā)生的數(shù)據(jù)沖突問題。

(3)更改日志:它是數(shù)據(jù)庫每次改變的記錄文件,日志包括原來的值和修改后的值。數(shù)據(jù)庫管理員可以根據(jù)日志撤消任何錯誤的修改。

3、可審計性

在某些應(yīng)用中,可能需要產(chǎn)生對數(shù)據(jù)庫的所有訪問(讀或?qū)懀┑膶徲嬘涗?,這種記錄可以協(xié)助維持?jǐn)?shù)據(jù)的完整性,或者至少可以幫助在事后發(fā)現(xiàn)誰在影響以及何時影響過什么值。攻擊者可能會以逐次遞增的方式形成對被保護(hù)數(shù)據(jù)的訪問,不是單用一次訪問來獲取被保護(hù)的數(shù)據(jù),而是用一組訪問來獲取一些敏感的數(shù)據(jù)。在這種情況下,審計蹤跡可以作為分析攻擊者線索的依據(jù)。

4、訪問控制

數(shù)據(jù)庫通常根據(jù)用戶訪問權(quán)限進(jìn)行邏輯分割。例如,一般用戶訪問一般數(shù)據(jù)——市場部可以得到銷售數(shù)據(jù),人事部門可以得到工資數(shù)據(jù)等。

DBMS必須實(shí)施訪問控制策略,指定哪些數(shù)據(jù)允許被訪問或者禁止訪問;指定允許誰訪問哪些數(shù)據(jù),這些數(shù)據(jù)可以是字段或記錄,甚至是元素就DBMS批準(zhǔn)某個用戶對某個進(jìn)程有權(quán)讀取、修改、刪除、附加一個值,增加或刪除整個字段或記錄,或者重新組織完全的數(shù)據(jù)庫。

對數(shù)據(jù)庫的訪問控制和操作系統(tǒng)的訪問控制有根本的區(qū)別。數(shù)據(jù)庫中更為復(fù)雜,因?yàn)閿?shù)據(jù)庫中的記錄字段和元素是互相關(guān)聯(lián)的,用戶只能通過某個文件而確定文件內(nèi)容,但卻有可能通過讀取數(shù)據(jù)庫中的某些元素確定數(shù)據(jù)庫中的另一個元素,也就是說,用戶可以通過推理的方法從某些數(shù)據(jù)值得到另外一些數(shù)據(jù)值。

5、用戶認(rèn)證

DBMS會要求用戶進(jìn)行嚴(yán)格的用戶認(rèn)證——一個DBMS可能要求用戶傳遞指定的通行字和時間日志檢查。這一認(rèn)證是在操作系統(tǒng)完成的認(rèn)證之外另加的。DBMS在操作系統(tǒng)之外作為一個應(yīng)用程序被運(yùn)行,這意味著它沒有與操作系統(tǒng)可信賴的互操作路徑,DBMS必須懷疑它所收到的任何數(shù)據(jù),包括用戶認(rèn)證。因此,DBMS最好有自己的認(rèn)證機(jī)制。

6、可用性

DBMS的可用性。數(shù)據(jù)庫中的數(shù)據(jù)并不是任何時候都可以訪問,例如一個用戶在對幾個字段更新時,其他用戶對這幾個字段的訪問請求將被禁止,當(dāng)更新完畢,其他用戶便可允許對這些字段進(jìn)行訪問。

三、會計信息系統(tǒng)數(shù)據(jù)庫加密的一般策略

1、加密層次的選擇

數(shù)據(jù)庫加密模塊可以選擇在3個不同層次實(shí)現(xiàn),這3個層次分別是OS(操作系統(tǒng))、DBMS內(nèi)核和DBMS外層。

(1)0S層

在OS層加密,其加密粒度是整個文件,十分粗糙,無法辨認(rèn)數(shù)據(jù)庫文件中的數(shù)據(jù)關(guān)系,因而無法根據(jù)數(shù)據(jù)關(guān)系對數(shù)據(jù)進(jìn)行合理的加密。所以,在OS層直接對數(shù)據(jù)庫文件進(jìn)行加密,
對于大型數(shù)據(jù)庫來說,目前還難以實(shí)現(xiàn)。

(2)DBMS內(nèi)核層

在DBMS內(nèi)核層加密,是指數(shù)據(jù)在物理存取之前完成加密和解密工作。這種方式勢必造成DBMS和加密器(硬件或軟件)之間的接口需要DBMS開發(fā)商的支持。這種加密方式的優(yōu)點(diǎn)是加密功能強(qiáng),并且加密功能幾乎不會影響DBMS的功能。其缺點(diǎn)是在服務(wù)器端進(jìn)行加密和解密運(yùn)算,加重了數(shù)據(jù)庫服務(wù)器的負(fù)載。

在DBMS內(nèi)核層加密,是指數(shù)據(jù)在物理存取之前完成加密和解密工作。這種方式可以更有效和DBMS內(nèi)部的各種功能結(jié)合起來,但是需要對DBMS的內(nèi)核進(jìn)行修改,需要DBMS開發(fā)商的支持。本文所舉的Oracle數(shù)據(jù)庫加密實(shí)例,以O(shè)racle提供的安全包為基礎(chǔ)制定加密策略。所采取的加密層次就是DBMS內(nèi)核層加密。

(3)DBMS外層

采用DBMS外層加密方式時,加密和解密運(yùn)算、密鑰的管理等工作在DBMS外層執(zhí)行,不會加重數(shù)據(jù)庫服務(wù)器的負(fù)載并且可以根據(jù)需要靈活配置數(shù)據(jù)庫加密,但是加密功能會受到一些限制。

2、會計信息系統(tǒng)數(shù)據(jù)庫加密算法的選擇

目前常用的加密算法可分為2類:對稱加密算法(DES)和非對稱加密算法(AES)。

對稱加密算法的加密和解密密鑰相同,具有加密和解密速度快、保密度高等優(yōu)點(diǎn)。對稱加密算法按加密模式又可分為序列密碼和分組密碼兩大類,序列密碼以字符為單位進(jìn)行加密變換,每一字符數(shù)據(jù)的加密與報文的其他部分無關(guān);分組加密時,明文按固定長度分組,對各組數(shù)據(jù)用不同的密鑰加密。

非對稱加密算法加密和解密使用不同的密鑰,加密解密速度較慢。

數(shù)據(jù)庫加密系統(tǒng)要求所使用的加密算法安全性高的同時加密和解密速度足夠快,盡量不影響用戶使用,并且加密后,數(shù)據(jù)量不應(yīng)該明顯增加。因此選擇使用對稱密鑰的分組加密算法。

3、會計信息系統(tǒng)數(shù)據(jù)庫加密的范圍

一方面,經(jīng)過加密的數(shù)據(jù)庫須經(jīng)得起來自O(shè)S和DBMS的攻擊;另一方面,DBMS要完成對數(shù)據(jù)庫文件的管理和使用,必須具有能夠識別部分?jǐn)?shù)據(jù)的條件。因此,只能對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行部分加密。數(shù)據(jù)庫中不能加密的部分包括:

(1)索引字段不能加密

為了達(dá)到迅速查詢的目的,數(shù)據(jù)庫文件需要建立一些索引,他們的建立和應(yīng)用必須是明文狀態(tài),否則將失去索引的作用。

(2)關(guān)系運(yùn)算的比較字段不能加密

DBMS要組織和完成關(guān)系運(yùn)算,參加并、差、積、商、投影、選擇和連接等操作的數(shù)據(jù)一般要經(jīng)過條件篩選,這種“條件”選擇項(xiàng)必須是明文,否則DBMS將無法進(jìn)行比較篩選。

(3)表間的連接碼字段不能加密

數(shù)據(jù)模型規(guī)范化以后,數(shù)據(jù)庫之間存在著密切的聯(lián)系,這種相關(guān)性往往是通過“外部編碼”聯(lián)系的,這些編碼若加密就無法進(jìn)行表與表之間的連接運(yùn)算。

四、會計信息系統(tǒng)數(shù)據(jù)庫加密設(shè)計

1、加密軟件包及功能

Oracle數(shù)據(jù)庫是會計信息系統(tǒng)的常用數(shù)據(jù)庫,與Sysbase、SqISewer等數(shù)據(jù)庫管理系統(tǒng)一樣,Oracle數(shù)據(jù)庫管理系統(tǒng)的主要功能仍然是實(shí)現(xiàn)對數(shù)據(jù)的管理及操作,數(shù)據(jù)加密只是為了提高存儲數(shù)據(jù)的安全性而附加的功能。Oracle數(shù)據(jù)庫加密功能的實(shí)現(xiàn)由數(shù)據(jù)庫平臺提供的軟件包來支持。

Oracle 10.2g提供了透明數(shù)據(jù)加密DBMS_CRYPTO程序包,該包包含2個基本的加密函數(shù)ENCRYPT和解密函數(shù)DE-CRYPl,它能夠加密日期、字符串、數(shù)字等基本的Oracle數(shù)據(jù)類型,也能支持大對象LOB和RAW十六進(jìn)制字符串類型。該程序包提供了多種加密方法,針對所選擇的密鑰可進(jìn)行大量選項(xiàng)組合,增加了密鑰破解的復(fù)雜度。

2、加密算法

從表1可以看出,在軟件包DBMS_CRYPTO中,加密算法不僅支持DES以及3倍DES (DES3),而且還支持256位的高級加密標(biāo)準(zhǔn)AES等,使用戶有了更多的選擇,也使加密數(shù)據(jù)可以達(dá)到更高的安全強(qiáng)度。軟件包中支持的算法屬于分組密碼算法,其分組大小是固定的。如果加密信息長度不在分組邊界,就需要附加數(shù)據(jù)填充,使它充滿整個分組。填充的方法有固定值填充、隨機(jī)填充、PKCS填充。固定值填充最常用的填充值是OxOO/Ox80加0、1字符串,不常用的填充值是Oxff;隨機(jī)填充采用隨機(jī)位來填充;PKCS (Public KeyCryptography Standard,公開密鑰密碼標(biāo)準(zhǔn))填充使用信息長度編碼,因此不需要預(yù)先知道信息長度就可以去掉填充。Oracle lOg中,可以根據(jù)需要用不同的參數(shù)來確定所選擇的填充類型。在運(yùn)算模式上,Oracle lOg中支持ECB、CBC、CFB及OFB。

3、密鑰存儲和管理

在數(shù)據(jù)加密中,密鑰的存儲和管理是非常重要的,它直接影響到數(shù)據(jù)加密的安全性。但是,在數(shù)據(jù)庫管理系統(tǒng)內(nèi)核層加密策略中,并沒有提供密鑰存儲的方法,這也是在以O(shè)racle提供的安全包為基礎(chǔ)制定加密策略時最難解決的部分。在制定密鑰的存儲和管理方案時,要確保以下兩點(diǎn):

(1)密鑰存儲足夠可靠,以確保能夠保護(hù)數(shù)據(jù);

(2)要保證合法用戶且只有合法用戶可以獲取密鑰。

在數(shù)據(jù)庫加密中,密鑰通常存在數(shù)據(jù)庫中,文件系統(tǒng)中或用戶自身的存儲設(shè)各中。Oracle數(shù)據(jù)庫加密中,密鑰仍然是以數(shù)據(jù)表形式存放在數(shù)據(jù)庫中。如果密鑰以明文形式存放在數(shù)據(jù)庫中,那么攻擊者只要進(jìn)入數(shù)據(jù)庫系統(tǒng)中,就很容易找到破解密文的密鑰。如果密鑰以密文形式存放在數(shù)據(jù)庫中鰣那么加密密鑰的密鑰如何存放就成了需要解決的新問題。

本例的解決方法是采用多級密鑰存儲管理,把用戶密鑰與數(shù)據(jù)密鑰結(jié)合使用,提高數(shù)據(jù)庫加密的安全性。

4、加密實(shí)例

下面用一個例子介紹如何利用Oracle軟件包DBMS_CPYPr0提供的功能,保護(hù)工資查詢系統(tǒng)中的數(shù)據(jù)庫。

(1)數(shù)據(jù)表結(jié)構(gòu)

本例中用到兩個數(shù)據(jù)表(為了便于理解,省略了其余字段),其中表emp_salary_enc存放職工薪資信息,Emp_id為職工工號,Salary_enc為加密后的薪資。而表emp_salary_keys中,Emp_id存放的仍然是職工的工號,它與表emp_salary_enc中的工號是一致的,key中存放的是加密相應(yīng)職工薪資的密鑰。

(2)數(shù)據(jù)查詢及更新

為了查詢職工薪資信息,首先需要生成視圖vw_emp_salary,生成語句:

Create or replace vw_emp_salary as

Select e.Emp_id as m.Emp_id,

cast(get_dec_val(e.salary_enc.k.key) as varchar2(20))

As Salary

From emp_salary_ence,

emp_salary_keysk

where k.emp_id=e.emp_id;

在建立視圖后,可以把其權(quán)限授予其他用戶,并建立一個視圖的同義詞。這種情況下,用戶只能從視圖中查找數(shù)據(jù)。

當(dāng)需要插入或修改客戶數(shù)據(jù)時,則可以通過一個觸發(fā)器來更新表emp_salary_enc的信息。對表emp_salary_enc操作的觸發(fā)器定義:

create or replace trigger io_vm_custom_info

instead of insert or update on vw_emp_salary for each row

declare l_key raw(200);

begin

if(inserting) then

l_key:=dbms_crypto.randombytes(128);

insert into emp_salary_enc(emp_id, salary_enc)

values(:new.emp_id,l_key);

else

select key into l_key

from emp_salary_keys

where emp_id=:new.emp_id;

update emp_salary_enc

set salary_enc=get_enc_val(:new.emp_id,l_key)

where emp_id=:new.emp_id;

end if

3、加密及解密函數(shù)

在上述操作中,函數(shù)get_enc_val及get_dec_val的功能分別是對數(shù)據(jù)庫進(jìn)行加密及解密。在函數(shù)中,利用了Oracle軟件包DBMSCRYPTO中支持的加密函數(shù)、運(yùn)算模式及填充模式。

(1)加密函數(shù)

create or replace function get_enc_val

(e_data in varchar2,/*定義待加密數(shù)據(jù)*/

e_key in raw/*定義加密密鑰變量*/

)

return raw is

e_val raw(2000);/*定義密文變量*/

e_mode_number:=dbms_crypto.ENCRYPT AES128

/*選擇由oracle軟件包DBMS_CRYPTO提供的AES128位的加密算法*/

+dbms_crypto.CHAIN_CBC/*分組模式為密碼鏈接*/

+dbms_crypto.PAD_PKCS5;/*填充模式為PKCS*/

Begin

e_val:=dbms_crypto.encrypt(UTL_IL8N.STRING_TO_RAW(e_data,’AL32UTF8’),l_mod. e_key);)

/*利用DBMS_CRYPTO提供的加密算法,根據(jù)上面生成

的隨機(jī)數(shù)(密鑰)加密數(shù)據(jù),e_val為加密后的數(shù)據(jù)*/

Return e_val;

end;

(2)解密函數(shù)

create or replace fuction get_dec_val

(e_val in raw./*定義密文變量*/

e_key in raw/*定義加密密鑰變量*/)

Return va rchar2 is

d_ret varchar2(2000);/*定義解密變量*/

d val raw(2000);

e_mode_number:=dbms.crypto.ENCRYPT_AES128

+dbms_crypto.CHAIN_CBC

+dbms_crypto.PAD_PKCS5;

begin

d_val:=dbms_crypto.decrypt(e_val.e_mode.e_key);

d_ret:=UTL_IL8N.RAW_TO_CHAR(d_val,’AL32UTF8’):

return d_ret;

end:

在加密與解密函數(shù)中,分別用到了函數(shù)UTL_IL8N.STRING_ TO_RAW(e_val, ‘AL32UTF8’) 及UTL_IL8N .RAW_TO_CHAR (d_val,‘AL32UTF8’),其作用是進(jìn)行字符類型與RAW類型的轉(zhuǎn)換。由于Oracle 10g中加密函數(shù)En-crypt.()僅支持RAW類型的變量,因此在數(shù)據(jù)加密時需要先把其他類型的數(shù)據(jù)轉(zhuǎn)換成RAW類型:而解密后則需要相反的操作。

5、測試密文數(shù)據(jù)庫性能

在工資查詢系統(tǒng)中,建立100000條數(shù)據(jù),記錄插入記錄和查詢記錄所使用的時間。數(shù)據(jù)庫加密模塊對數(shù)據(jù)庫系統(tǒng)效率的影響并不是很大,用戶可以接受等待的時間。

小知識之會計信息系統(tǒng)會計信息系統(tǒng)是基于計算機(jī)的、將會計數(shù)據(jù)轉(zhuǎn)換為信息的系統(tǒng)。會計信息系統(tǒng)是利用信息技術(shù)對會計信息進(jìn)行采集、存儲和處理,完成會計核算任務(wù),并能提供為進(jìn)行會計管理、分析、決策用的輔助信息的系統(tǒng)。會計信息系統(tǒng)大都屬于會計EDP和MIS一類。由于技術(shù)水平的限制,會計DSS尚處于探索階段。會計信息系統(tǒng)可以是一個獨(dú)立的系統(tǒng),也可以是企業(yè)MIS的一個子系統(tǒng)。