会计信息系统是基于计算机的、将会计数据转换为信息的系统。会计信息系统是利用信息技术对会计信息进行采集、存储和处理,完成会计核算任务,并能提供为进行会计管理、分析、决策用的辅助信息的系统,于20世纪80年代初开始在我国运用的。

但随着网络技术的迅速发展及应用领域的不断拓宽,会计信息系统也出现了许多不安全的因素。数据库集中存储着关键信息,容易成为攻击的对象,特别对持有敏感信息的会计信息系统来说更是如此。为了使得会计信息系统在网络环境下安全有效地运行,给会计信息系统数据库加密是相当必要的。

一、会计信息系统的安全策略及安全隐患

传统的会计信息系统通过用户权限来限制用户可以访问的数据,并将系统与外网断开连接,从而达到保护数据的目的。但是对数据库本身的保护却没有涉及,财务数据以明文的形式保存在数据库中。

数据库作为存放财务数据的主要形式,数据库面对着各方面的严重威胁,就要保证数据库环境的两个主要安全问题:完整性和机密性。

二、会计信息系统数据库安全性要求

1、会计信息系统数据库的完整性

数据库的完整性是DBMS、操作系统和计算机系统管理者共同的责任。数据库管理程序必须进行访问控制,确保只有经批准的用户才能更新或删除数据,另外,数据库系统还必须防范人为的外力灾难。从操作系统和计算机系统管理者的角度看,数据库和DBMS分别是文件和程序。因此对整个数据库的一种保护形式是对系统上的所有文件周期性地做备份。数据库的周期性备份可以减少由灾祸造成的损失,并能在系统出错后重建数据库,因此DBMS必须维护对事务的记录。在发生数据库系统失败的事故时,由数据库的备份开始重新处理记录之后的所有业务。

2、元素的完整性

数据库元素的完整性是指它们的正确性和准确性。由于用户在搜集数据计算结果和输入数值时可能会出现错误,所以DBMS必须帮助用户在输入时能发现错误,并在插入错误数据后能纠正他们。

DBMS用3种方式维护数据库的每个项目的完整性。

(1)字段检查:这种检查可以防止在向数据库输入时可能出现的简单错误。

(2)访问控制:通过访问控制来维护数据库的完整性、真实性和一致性。一个数据库可能包含几种来源的数据,而在开发一个数据库之前,可能在许多表中存储了重复的数据,这就需要一种策略来解决可能发生的数据冲突问题。

(3)更改日志:它是数据库每次改变的记录文件,日志包括原来的值和修改后的值。数据库管理员可以根据日志撤消任何错误的修改。

3、可审计性

在某些应用中,可能需要产生对数据库的所有访问(读或写)的审计记录,这种记录可以协助维持数据的完整性,或者至少可以帮助在事后发现谁在影响以及何时影响过什么值。攻击者可能会以逐次递增的方式形成对被保护数据的访问,不是单用一次访问来获取被保护的数据,而是用一组访问来获取一些敏感的数据。在这种情况下,审计踪迹可以作为分析攻击者线索的依据。

4、访问控制

数据库通常根据用户访问权限进行逻辑分割。例如,一般用户访问一般数据——市场部可以得到销售数据,人事部门可以得到工资数据等。

DBMS必须实施访问控制策略,指定哪些数据允许被访问或者禁止访问;指定允许谁访问哪些数据,这些数据可以是字段或记录,甚至是元素就DBMS批准某个用户对某个进程有权读取、修改、删除、附加一个值,增加或删除整个字段或记录,或者重新组织完全的数据库。

对数据库的访问控制和操作系统的访问控制有根本的区别。数据库中更为复杂,因为数据库中的记录字段和元素是互相关联的,用户只能通过某个文件而确定文件内容,但却有可能通过读取数据库中的某些元素确定数据库中的另一个元素,也就是说,用户可以通过推理的方法从某些数据值得到另外一些数据值。

5、用户认证

DBMS会要求用户进行严格的用户认证——一个DBMS可能要求用户传递指定的通行字和时间日志检查。这一认证是在操作系统完成的认证之外另加的。DBMS在操作系统之外作为一个应用程序被运行,这意味着它没有与操作系统可信赖的互操作路径,DBMS必须怀疑它所收到的任何数据,包括用户认证。因此,DBMS最好有自己的认证机制。

6、可用性

DBMS的可用性。数据库中的数据并不是任何时候都可以访问,例如一个用户在对几个字段更新时,其他用户对这几个字段的访问请求将被禁止,当更新完毕,其他用户便可允许对这些字段进行访问。

三、会计信息系统数据库加密的一般策略

1、加密层次的选择

数据库加密模块可以选择在3个不同层次实现,这3个层次分别是OS(操作系统)、DBMS内核和DBMS外层。

(1)0S层

在OS层加密,其加密粒度是整个文件,十分粗糙,无法辨认数据库文件中的数据关系,因而无法根据数据关系对数据进行合理的加密。所以,在OS层直接对数据库文件进行加密,
对于大型数据库来说,目前还难以实现。

(2)DBMS内核层

在DBMS内核层加密,是指数据在物理存取之前完成加密和解密工作。这种方式势必造成DBMS和加密器(硬件或软件)之间的接口需要DBMS开发商的支持。这种加密方式的优点是加密功能强,并且加密功能几乎不会影响DBMS的功能。其缺点是在服务器端进行加密和解密运算,加重了数据库服务器的负载。

在DBMS内核层加密,是指数据在物理存取之前完成加密和解密工作。这种方式可以更有效和DBMS内部的各种功能结合起来,但是需要对DBMS的内核进行修改,需要DBMS开发商的支持。本文所举的Oracle数据库加密实例,以Oracle提供的安全包为基础制定加密策略。所采取的加密层次就是DBMS内核层加密。

(3)DBMS外层

采用DBMS外层加密方式时,加密和解密运算、密钥的管理等工作在DBMS外层执行,不会加重数据库服务器的负载并且可以根据需要灵活配置数据库加密,但是加密功能会受到一些限制。

2、会计信息系统数据库加密算法的选择

目前常用的加密算法可分为2类:对称加密算法(DES)和非对称加密算法(AES)。

对称加密算法的加密和解密密钥相同,具有加密和解密速度快、保密度高等优点。对称加密算法按加密模式又可分为序列密码和分组密码两大类,序列密码以字符为单位进行加密变换,每一字符数据的加密与报文的其他部分无关;分组加密时,明文按固定长度分组,对各组数据用不同的密钥加密。

非对称加密算法加密和解密使用不同的密钥,加密解密速度较慢。

数据库加密系统要求所使用的加密算法安全性高的同时加密和解密速度足够快,尽量不影响用户使用,并且加密后,数据量不应该明显增加。因此选择使用对称密钥的分组加密算法。

3、会计信息系统数据库加密的范围

一方面,经过加密的数据库须经得起来自OS和DBMS的攻击;另一方面,DBMS要完成对数据库文件的管理和使用,必须具有能够识别部分数据的条件。因此,只能对数据库中的数据进行部分加密。数据库中不能加密的部分包括:

(1)索引字段不能加密

为了达到迅速查询的目的,数据库文件需要建立一些索引,他们的建立和应用必须是明文状态,否则将失去索引的作用。

(2)关系运算的比较字段不能加密

DBMS要组织和完成关系运算,参加并、差、积、商、投影、选择和连接等操作的数据一般要经过条件筛选,这种“条件”选择项必须是明文,否则DBMS将无法进行比较筛选。

(3)表间的连接码字段不能加密

数据模型规范化以后,数据库之间存在着密切的联系,这种相关性往往是通过“外部编码”联系的,这些编码若加密就无法进行表与表之间的连接运算。

四、会计信息系统数据库加密设计

1、加密软件包及功能

Oracle数据库是会计信息系统的常用数据库,与Sysbase、SqISewer等数据库管理系统一样,Oracle数据库管理系统的主要功能仍然是实现对数据的管理及操作,数据加密只是为了提高存储数据的安全性而附加的功能。Oracle数据库加密功能的实现由数据库平台提供的软件包来支持。

Oracle 10.2g提供了透明数据加密DBMS_CRYPTO程序包,该包包含2个基本的加密函数ENCRYPT和解密函数DE-CRYPl,它能够加密日期、字符串、数字等基本的Oracle数据类型,也能支持大对象LOB和RAW十六进制字符串类型。该程序包提供了多种加密方法,针对所选择的密钥可进行大量选项组合,增加了密钥破解的复杂度。

2、加密算法

从表1可以看出,在软件包DBMS_CRYPTO中,加密算法不仅支持DES以及3倍DES (DES3),而且还支持256位的高级加密标准AES等,使用户有了更多的选择,也使加密数据可以达到更高的安全强度。软件包中支持的算法属于分组密码算法,其分组大小是固定的。如果加密信息长度不在分组边界,就需要附加数据填充,使它充满整个分组。填充的方法有固定值填充、随机填充、PKCS填充。固定值填充最常用的填充值是OxOO/Ox80加0、1字符串,不常用的填充值是Oxff;随机填充采用随机位来填充;PKCS (Public KeyCryptography Standard,公开密钥密码标准)填充使用信息长度编码,因此不需要预先知道信息长度就可以去掉填充。Oracle lOg中,可以根据需要用不同的参数来确定所选择的填充类型。在运算模式上,Oracle lOg中支持ECB、CBC、CFB及OFB。

3、密钥存储和管理

在数据加密中,密钥的存储和管理是非常重要的,它直接影响到数据加密的安全性。但是,在数据库管理系统内核层加密策略中,并没有提供密钥存储的方法,这也是在以Oracle提供的安全包为基础制定加密策略时最难解决的部分。在制定密钥的存储和管理方案时,要确保以下两点:

(1)密钥存储足够可靠,以确保能够保护数据;

(2)要保证合法用户且只有合法用户可以获取密钥。

在数据库加密中,密钥通常存在数据库中,文件系统中或用户自身的存储设各中。Oracle数据库加密中,密钥仍然是以数据表形式存放在数据库中。如果密钥以明文形式存放在数据库中,那么攻击者只要进入数据库系统中,就很容易找到破解密文的密钥。如果密钥以密文形式存放在数据库中鲥那么加密密钥的密钥如何存放就成了需要解决的新问题。

本例的解决方法是采用多级密钥存储管理,把用户密钥与数据密钥结合使用,提高数据库加密的安全性。

4、加密实例

下面用一个例子介绍如何利用Oracle软件包DBMS_CPYPr0提供的功能,保护工资查询系统中的数据库。

(1)数据表结构

本例中用到两个数据表(为了便于理解,省略了其余字段),其中表emp_salary_enc存放职工薪资信息,Emp_id为职工工号,Salary_enc为加密后的薪资。而表emp_salary_keys中,Emp_id存放的仍然是职工的工号,它与表emp_salary_enc中的工号是一致的,key中存放的是加密相应职工薪资的密钥。

(2)数据查询及更新

为了查询职工薪资信息,首先需要生成视图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;

在建立视图后,可以把其权限授予其他用户,并建立一个视图的同义词。这种情况下,用户只能从视图中查找数据。

当需要插入或修改客户数据时,则可以通过一个触发器来更新表emp_salary_enc的信息。对表emp_salary_enc操作的触发器定义:

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、加密及解密函数

在上述操作中,函数get_enc_val及get_dec_val的功能分别是对数据库进行加密及解密。在函数中,利用了Oracle软件包DBMSCRYPTO中支持的加密函数、运算模式及填充模式。

(1)加密函数

create or replace function get_enc_val

(e_data in varchar2,/*定义待加密数据*/

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提供的加密算法,根据上面生成

的随机数(密钥)加密数据,e_val为加密后的数据*/

Return e_val;

end;

(2)解密函数

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:

在加密与解密函数中,分别用到了函数UTL_IL8N.STRING_ TO_RAW(e_val, ‘AL32UTF8’) 及UTL_IL8N .RAW_TO_CHAR (d_val,‘AL32UTF8’),其作用是进行字符类型与RAW类型的转换。由于Oracle 10g中加密函数En-crypt.()仅支持RAW类型的变量,因此在数据加密时需要先把其他类型的数据转换成RAW类型:而解密后则需要相反的操作。

5、测试密文数据库性能

在工资查询系统中,建立100000条数据,记录插入记录和查询记录所使用的时间。数据库加密模块对数据库系统效率的影响并不是很大,用户可以接受等待的时间。

小知识之会计信息系统会计信息系统是基于计算机的、将会计数据转换为信息的系统。会计信息系统是利用信息技术对会计信息进行采集、存储和处理,完成会计核算任务,并能提供为进行会计管理、分析、决策用的辅助信息的系统。会计信息系统大都属于会计EDP和MIS一类。由于技术水平的限制,会计DSS尚处于探索阶段。会计信息系统可以是一个独立的系统,也可以是企业MIS的一个子系统。