目前,计算机大批量数据存储的安全问题、敏感数据的防窃取和防篡改问题越来越引起人们的重视。数据库系统作为计算机信息系统的核心部件,数据库文件作为信息的聚集体,其安全性将
是信息产业的重中之重。

与传统的通信加密技术相比,数据库存储加密有其自身的特点和要求。数据库存储加密的主要目的是按照用户的要求将敏感数据加密存储,防止非法用户采用其它手段获取数据,同时保证合法用户通过数据库加密系统仍能正常访问数据。因此,数据库存储加密系统的开发原则是:强调安全,保证效率,保持数据库特点。

一、整体概述

本系统是把数据库加密与一个基于Web平台的应用系统相结合,完成对数字电视用管系统的数据库加密实现,使系统的安全性得到提高。

本系统使用JSP技术编写业务逻辑。JSP技术的本质是JAVA语言,通过这种技术可以利用JAVA语言的特性实现动态网页的功能,从而实现复杂的业务逻辑。应用服务器采用Tomcatl解释和执行JSP程序,并传送给Web服务器,使得应用逻辑能够在网页中体现出来。后端使用MySQL作为数据库服务器。JSP和MySQL之间使用JDBC连接。JDBC是JAVA语言和数据库服务器之间的标准接口,通过它,JAVA得以操作数据库资源。

本系统的整体功能为:

(1)操作者的权限层次要有明确的分类,进入系统时要进行身份认证;

(2)出于对数字电视用户个人隐私的负责,数字电视用户详细信息只能由数字电视高级管理人员调阅,其它任何人包括普通操作人员都无权查阅。

本系统的系统框架如图1所示。

数字电视用户远程缴费加密系统设计

这个系统是根据Web应用的三层服务结构构建起来的,即系统逻辑结构分为表示层、业务逻辑层和数据服务层。

表示层收集用户数据,通过控件提交自己的数据,并把用户想要查询的数据进行展示。主要完成数据查询的转换、加密与解密等任务。

业务逻辑层用Java Servlet实现,主要完成包括数据库的连接、对数据的操作,接受客户端的请求、执行密文查询、把结果返回给用户端等,该层还屏蔽了数据库的访问方式及路径,在一定程度上阻止了对数据库的攻击。

数据服务层是数据库服务器,主要由一个数据库管理系统来实现,采用MySQL数据库,它通过中间层来连接用户操作。

用户通过浏览器向服务器发送请求,Web服务器对需要访问数据库的请求交中间件处理,对需要加密的数据由加,解密模块处理。

用户查询加密数据库,系统的处理流程过程如下:

(1)浏览器的用户程序发出连接数据库请求,即用户登录数据库。

(2)系统根据身份认证机制判断用户身份。

(3)用户通过用户界面向数据库加密后的系统提供用户密钥及访问请求。

(4)系统根据访问权限判断是否响应用户的请求。

(5)查询加密配置文件,判断加密类型、加密粒度、采用的加密算法和加密密钥。

(6)数据库加密,解密引擎把用户请求转化为原数据库系统可以操作的请求向原数据库提交查询请求。

(7)原数据库系统返回与用户安全等级相对应的密文数据给密文管理系统。

(8)密文管理系统查询加密字典、对比安全等级标志,在授权访问的情况下,获得密钥,将密文数据解密为明文数据返回给用户。

(9)用户程序完成数据库访问,请求断开连接。

(10)服务器接到请求,两通信模块断开连接。

二、用户管理模块的设计与实现

1、用户管理模块的设计

表示层包含一个对允许使用应用系统的用户及其可以执行的功能进行控制的管理功能模块,简称为用户管理模块,负责检查每一个请求服务的用户的身份。对于那些非法的或被拒绝提供服务的用户请求,用户管理模块将他们阻挡在网络应用系统之外;对于那些合法的用户请求,用户管理模块能够根据用户请求的类型和用户合法身份的级别,限制和管理这些合法用户在网络应用系统中使用的功能和能得到的服务种类。用户管理模块需要实现下述的两个功能。

(1)实现用户的身份校验功能

身份,是指包括认证和用户授权的安全体系结构要素。认证适用于那些使用特定的凭证来标识自己的用户,例如用户名和口令。授权是指对顺利地被标识了身份的个人的继续访问权利的特 征,通过授权工作,可以控制用户的操作,设定用户可以做和不可以做的一些事情。用户身份校验是验证用户合法性的重要功能。只有被确认是合法用户之后,应用系统使用者才有可能执行其要求的功能,得到其要求的服务。

(2)实现用户的级别管理

在所有可以使用应用系统功能的用户中,不同级别的用户可以使用的功能是不同的。

2、用户管理模块的实现

用户管理模块中的身份认证模块是整个系统的人口模块,其功能是确认操作用户的身份及权限,身份认证模块的流程设计如图2所示。

数字电视用户远程缴费加密系统设计

用户管理模块中的身份认证及权限认证是基于数据库加密模型中的角色管理:首先定义用户角色,然后由系统管理员创建及删除用户角色,对用户角色授权,并进行安全级别与安全范围的标记;其次创建数据库用户,由系统管理员通过操作前端系统界面,由程序调用DBMS的命令把用户角色授予数据库用户,并将数据库用户实际连接到数据库上设置的登录用户。系统登录用户要由系统安全管理员进行安全级别与安全范围的枥记,登录用户与角色之间的授权必须满足强制访问控制的要求;最后创建操作用户,这部分的功能主要是建立操作用户同数据库用户的映射,系统根据数据库用户来确定操作用户的访问权限。这样可以确保操作用户不能用自己的帐号和密码绕过系统直接访问数据库系统,增强了系统安全性,同时用消息摘要保存口令。

(1)口令验证

系统经常需要验证用户输入的口令是否正确,如果将正确的用户口令直接保存在数据库中,则很容易被黑客窃取到,因此只可以保存口令的消息摘要。

系统登陆后,根据用户输入口令计算消息摘要,根据用户输入的帐号在数据库中找到预先保存的正确的口令摘要,比较两个消息摘要是否相等,若不相等则说明输入的口令不正确口令不正确。

(2)角色划分

角色划分的制度是基于角色的安全管理系统实施安全策略的一个关键问题。粒度过大,将会影响数据和数据库系统的安全性,不易实测最小特权原则;粒度过小,角色数量的增加,提高了角色管理的复杂性。本系统根据每个岗位定义一个角色,角色关系在数据库中的存储如表1的设计,系统涉及的角色有以下4种。

数字电视用户远程缴费加密系统设计

①匿名角色

级别最低,不存在身份验证,只能用于浏览,不能进行任何操作。

②用户角色

级别低,不能获取级别高或同级别的信息。可联机注册成为用户,设定自己的登陆名及密码;可按用户姓名、地址自定义查询;可基于查询结果进行缴费,若查询电视卡仍有余额,则不用缴费,若无余额则可以缴费,缴费结果返回给用户;可对已经进行的缴费情况查看或撤销;缴费成功后可查询开通的电视节目信息和电视卡余额。

③操作员角色

权限级别由管理员设定,可查询比其级别低的信息。可查看用户的缴费情况、可查询用户基本信息、可创建新用户、可对用户基本信息进行修改。

④管理员角色

级别最高,负责对系统和数据的访问,存取的权限,分别赋予操作员和用户不同的权限级别,并可随时根据系统的要求或变化对角色的存取权限进行管理,包括对可传递性的限制。只有授权的用户能够对系统进行访问,防止没有权限的人员或进程登录进入系统。

根据角色分配相应的访问权限,最后将角色授予用户,建立用户和角色的映射关系,系统用户关系表设计如表2所示。

数字电视用户远程缴费加密系统设计

主键约束:pk_hosID

唯一索引:hosName(登录时用户名)

此表在关系到不同角色时会有不同,这里不再一一叙述。

这样设计不仅保证了数据库的安全性,简化了授权操作,还降低了权限管理的负担,减少系统的安全漏洞。同时根据RBAC存取的安全原则,对角色制定了约束规则。

规则1:在一次会话过程中,用户能且须激活所拥有的角色集中的某一种角色。

规则2:任何一个用户不能同时拥有同一个机构中的两个角色。

在系统设计中,通过引入角色约束规则,在为用户分配角色时,以及用户激活角色集开始一次会话时。系统根据角色的各种约束原则实施角色约束规则,实现本系统的安全访问。在本模块
中,确认用户身份中实现规则1,确认用户权限中实现了规则2和规则3。

3、数据服务层的设计与实现

这里的数据服务层所采用的数据库是MySQL,该数据库不但存储有敏感数据的密文和供查询的关键字的索引,而且还有恢复密文的相关信息,包括采用的解密算法和密钥信息等。使用数据库之前首先需要建立数据库,所有的密文信息存储在数据库hospital中。

(1)敏感数据加密保护

数字电视用管系统不同于其他数据库系统数据的保密性非常重要,尽管已经在系统功能上为不同的用户规定了不同的访问权限,但是对于最高权限拥有者如数据库管理员(DBA)。访问控制策略不能阻挡其对数据的知晓权。但就是DBA也不应该知道用户的银行账户信息,这就需要有进一步的安全措施一数据库加密技术;由于系统在Web上运行,免不了远程的数据交换,为防止传输过程中数据被截取,也应该采取数据加密技术。综上所述,在数字电视用管系统中对一些敏感数据采用一定的加密手段是非常必要的。

在设计系统加密实现时,首先要确定哪些数据需要加密以及哪些数据应该采用明文,采用风险分析步骤来进行决策。在风险分析中,需要根据不同的敏感程度来对数据进行分类。在考虑到数据加密的特殊性、数据加密与解密是比较费时的操作、数据加密与解密程序会占用大量的系统资源的情况下,本文采用的是对风险最大的数据进行加密:所有关于用户id和password的信息必须加密,所有关于用户账号相关的信息必须加密。

(2)密钥存储模块

服务器端加密算法的密钥存储是很重要的,特别在Web平台,给密钥的存储带来了更大的隐患。

本设计对密钥库使用了两套口令:一是密钥库口令,二是用户口令。

首先,使用密钥库口令对整个密钥库文件进行加密。访问密钥库之前,必须使用密钥库口令来打开密钥库。它对密钥库中的密钥实施了外部保护,保证非系统用户不能访问密钥库中的任何信息。

其次,每个用户都设置一个口令,使用该口令加密对应密钥项。用户口令对密钥实施了内部保护。它确保了只有拥有用户口令的用户才可以访问和管理该密钥项。用户在密钥库中只能管理自己的密钥,无权操纵其他实体的密钥。并且用户口令提高了对密钥的保密强度,即使密钥库口令被破解或泄漏,也不会殃及其中的密钥项。表3是对在数据库中存储的密钥关系表的设计。

4、业务逻辑层的设计与实现

作为表示层和数据服务层桥梁的业务服务层可有多个SeMet实现。java SeN-let接受客户端的请求、按照用户的请求执行密文查询,然后把结果返回给用户。

(1)数据库连接模块

此模块主要任务是和数据库进行连接,并读取和存入数据,系统程序采用JDBC-ODBC与数据库建立连接,将用户数据请求转换为相应的SQL语句,对数据库进行查询、添加、删除和修改等操作。

①请求连接

由于Connection是一个非常耗资源的对象,因此在这里使用了单例模式(Sin-gleton Design Patton)来设计DBConnec-tion类,保证了整个生命周期内只存在一个ConnecOon对象,该对象可以被其他类重复利用,这样可以大大节省系统资源。

②向数据库发送SQL语句

连接上数据库后,下一步就是对数据库进行具体操作,如查询、修改、删除等。在这一过程中主要使用了Statement类。Statement是通过活动链接发送SQL语句到数据库并返回结果的对象。

③处理由SQL操作返回的结果集

经过DBMS处理,SQL操作返回的结果将以特定的形式显示给用户,ResultSet用来管理输出的格式,使用ResultSet的next()方法“周游”它的行;在当前行中,调用getXXX()方法就可以获取单个列的值,这里的×××代表要返回的java数据类型。

(2)密钥加密模块

密钥加密模块主要实现对IDEA密钥的加密,以保证传输过程的安全。如上所述,本文采用的是基于大质数分解的公钥体制。其主要处理流程为:首先产生两个大素数构造出一对公钥和私钥;然后利用公钥,对IDEA算法的密钥进行加密。

5、数据加密模块流程

用户对数据进行增、删、改等操作时,涉及到明文数据到密文数据的转换,需要数据加密模块。数据加密模块通过在数据操作过程中隐藏的数据窗口来实现,用户对明文数据窗口的操作同步映射到隐藏的密文数据窗口中,对明文数据的保存操作同步映射密文数据窗口的保存操作。

数据加密模块的流程如下:

输入:明文信息。

输出:加密数据库中的密文信息。

(1)在用户将明文信息调入数据窗口后,利用主键将相应的密文数据的相应字段调入隐藏的密文数据窗口;

(2) lf用户执行增加操作Then;

(3)相应在隐藏的密文数据窗口中增加;

(4)对用户录入的新增加的数据用加密函数加密后写入密文数据窗口;

(5) Else;

(6)将用户对明文数据窗口中的某一行、某一列数据修改后的数据加密后写入密文数据窗口;

(7) End if;

(8)在明文数据窗口Update后,密文数据窗口同时执行Update操作。

其中使用算法加密数据的步骤为:

(1)生成一个包含要加密数据的字节数组;

(2)调用Cipher.getlnstance建立一个Cipher实例;

(3)通过调用init方法并传递密钥,在加密模式下初始化这个Cipher;

(4)调用doFinal方法,传递表示要加密数据的字节数组。

由于存储在数据库中的数据经过加密,在向数据库提交时采用的是字符串形式,在加密数据中出现的字符串随机,所以出现了一些预料不到的问题。例如:如果在密文字串中如果出现了‘/0’、 ‘/,’、或者‘)’,那么系统认为此字符串已经结束导致数据处理出错,甚至可能认为此语句结束而报错。

针对这点,提出解决方法:将密文数据重新进行编码,使之杜绝以上三种符号的出现。在解密时再进行反编码恢复出数据的本来面目6我们采用的是Base64编码过程,该过程将一个3个8位字符映射到4个6位字符中。基本上,它将每六位映射为一个八位的ASClI字符(称它为Base64.是因为6个位能表示从0到63的数,为64个可能的值),这样就可以将二进制数以合适的方式写入到数据库中。同时,由于Base64编码中出现了‘/0’,因此在我们的系统中采用的Base64编码进行了改造,改为用Oxff代替。同时,由于在Javascript中所有字符都采用16位编码(UTF-16)。因此本文将3个16位字符映射到8个16位字符中o这样,问题得到了很好的解决。

6、软件测试问题

软件测试是保证软件质量的关键,是对需求分析、设计和软件编码的最后复审。针对本系统是否正确的保护了敏感数据,我们进行了一系列的端到端测试。

本系统采用先注册,后登陆的方式。因此采用端到端测试来测试登录过程本身。必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而
直接浏览某个页面等。

采用用户名和密码联合认证机制控制用户的访问权限,从而保证系统敏感数据的安全性。由于系统处于安全防护的中心位置,一旦用户的口令被非法获得,则攻击者就获得了该用户的全部权
限,如果泄露密码的是高权限用户,那么主机和网络就失去了安全性。

用户口令的测试中,口令应该为混合数字、大写字母、以及小写字母或标点,避免共享管理员口令,使用用户组或其他方式代替。需检测口令是否用加密方式保存,加密强度应该足够使一个
强大的工作站运算一周才能破解。本系统采用用户第一次登陆时,强迫用户该变口令,口令生存周期规定为最长6个月,最短1个月。同时在口令历史中最近使用过的5个口令不应该再被使用。

一个用户想在没有登陆的条件下访问网页,应用程序将迫使我们确认他们的身份,getRemoteUser方法返回经过客户端验证的用户名。同时在应用的Web部署描述文件中配置安全性。否则会返回"Authorization Failed"。

用户登录测试:

假如一个帐户在短时间内出现连续多次的登陆失败记录(例如在一个小时内20次登陆失败),立刻阻塞该帐户,并通知用户,但对于系统管理员帐户不能做同样处理,否则将可能被攻击者利
用造成一次拒绝服务攻击;

测试系统是否有超时的限制,用户登陆后在一定时间内(例如15分钟)没有点击任何页面.是否需要重新登陆才能正常使用;

当一个用户被解聘,他的帐户应该立刻被注销。

在确定页面要求请求为登陆用户后,我们就需要限制那些扮演管理角色的用户的访问权限。lsUserlnRole向container的安全机制访问一个特定的用户是否在—个给定的安全角色中,如果角色超出权限部分,则返回"forbidden”。如果getRemo-teUser返回null值(这意味着没有用户被验证),那么lsUserlnRole就总会返回talse,getUserPrinciple总会返回一个null。这就意味着我们需要重新进入登陆页面。

7、安全性总结

本系统的设计目标为:在目前的计算能力下,破译所要花费的如时间和工作量等成本非常昂贵,已经远远超过秘密本身的价值;或者依据现实的技术条件,还没有找到破译的方法,满足安全性要求。

(1)数据库的安全

数据库的安全要求是:一,不同的数据库必须由具有相应权限的人进行相应的操作;二,数据库不会扩散;三,数据库不会被破坏。

对于第一点,本系统会采用具有安全保障功能的数据库,并且对必要的字段进行变换后的存储处理;对第二点,主要由环境安全性来保障;对第三点,主要对数据库进行冗余等保护处理。

(2)算法的安全性

系统采用当前成熟的IDEA、RSA和SHA-256散列算法作为核心算法,具有很高的加密强度。保证在用户不知道密钥的情况下,使用本系统保护的内容短期内是不可能被破解的。由于密钥是在服务器端随机产生并存放在数据库中的,并由用户口令保护。只要保证服务器端内部的环境安全性,就可以同时保障密钥的安全性,保证在本系统中不会造成密钥的泄露。

(3)体系的安全性

密钥在任何情况下不作明文存储(包括在数据库内)、密钥在任何情况下不作明文传输(主要指在网络上)、对密钥进行变换的算法具有最高级的加密强度并永不公布、在密钥意外泄露时可以通过更改密钥及更改用户登录权限等简单手段迅速处理,并且不会影响其它密钥的安全性。

(4)环境的安全性

主要由服务器端内部保障。包括内部人员的安全、内部设备的安全、内部运行机制的安全等。

小知识之Statement

Statement是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句。