接触数据库系统文件,从而可能绕过身份认证和存取控制而直接窃取或篡改数据库内容。对数据库中的数据进行加密是防范这类威胁的有效手段。数据库操作审计:监视和记录用户对数据库所做的各种操作的安全机制,它记录并存储用户的操作,用于事后分析,以检查导致数据库现状的原因以及提供追踪攻击者的线索。数据库的备份与恢复:当数据库发生不可恢复的故障时,可以将数据库恢复到先前的某个一致性的状态。
2.2
SQLite数据库的安全机制
为了满足嵌入式系统对数据库本身的轻便性,以及对数据存储效率、访问速度、内存占
用率等性能的要求,SQLite采取了不同于大型数据库的实现机制,但同时也带来了一些潜在的安全隐患。SQLite不提供网络访问服务,它使用单一文件存储数据库的结构和内容,这使得数据库非常轻便,而且便于移植。数据库没有用户管理、访问控制和授权机制,它利用操作系统对文件的访问控制能力实施文件级别的访问控制,凡是操作系统的合法用户,即:只要该用户对数据库文件具有读/写权限,就可以直接访问数据库文件。开源SQLite数据库不提供加密机制,因此不提供数据级的保密性。此外,SQLite的存储格式简单,不需专门的工具,使用任何文本编辑器都可以查看文件的内容。由于不提供多用户机制,所以数据库没有审计机制,而且它的备份和恢复也只能依赖于对数据库文件的手工拷贝。总之,SQLite的安全机制非常薄弱。
3SQLite安全机制设计
由于SQLite是开放源码的,并且在其源码中预留了加密接口,我们可以通过实现其预留的加密接口实现口令认证和数据库加密以完善其加密机制。
3.1
口令认证
SQLite数据库文件是一个普通文本文件,对它的访问首先依赖于文件的访问控制。在
此基础上,再增加进一步的口令认证,即在访问数据库时必须提供正确的口令,如果通过认证就可以对数据库执行创建、
查询、修改、插入、删除和修改等操作;否则,不允许进一步的访问。
3.2
3.2.1
数据库加密
加密方式
数据库加密有两种方式:1)在数据库管理系(DataBaseManagementSystem,DBMS)中实
-3-
中国科技论文在线
paper.edu
现加密功能[4],即在从数据库中读数据和向数据库中写数据时执行加解密操作;2)应用层加密,即在应用程序中对数据库的某些字段的值进行加密,DBMS管理的是加密后的密文。前者与DBMS结合好,加密方式对用户透明,但增加了DBMS的负载,并且需要修改DBMS的原始代码;后者则需要应用程序在写入数据前加密,在读出数据后解密,因而会增大应用程序的负载。在此,通过实现SQLite源码中预留的加密接口,实现DBMS级的加密。3.2.2加解密算法
加密算法是数据加密的核心,从加解密的密钥是否相同可以分为对称加密算法和非对称加密算法。对称加密算法,适用于对数据库和文件加密,速度较快,这个特点特别适合嵌入式系统,常用的对称加密算法为:DES、RC4、AES等;非对称加密算法加解密的速度相对较慢。在此,考虑到智能终端硬件资源的局限性,选用DES加密算法。3.2.3密钥用户选择的口令长度一般不固定,而且从安全角度考虑,如果直接使用输入的口令作为加密密钥,则可能会在应用程序中泄露数据库的密钥。为此,系统中提供一个密钥导出函数,对输入的口令进行变换,将变换的结果作为数据库加解密的密钥。根据以上对安全机制各方面的分析,我们在口令认证和数据库加密两个方面对SQLite的安全机制进行改进。
4SQLite安全机制实现
本研究通过修改SQLite
源代码,在DBMS级实现了口令认证、数据库加密功能;将口令认证和数据库加密二者结合,统一为加密机制,即对数据库结构信息以及存储的数据都加密。并把数据加解密接口通过JNI接口形式提供给上层应用程序调用,从而使Android上的应用程序可以使用安全性更高的SQLite数据库。
4.1
SQLite中预留的加密接口
在开源的SQLite代码中,已经预留了加密接口,主要包括4个函数的原型:sqlite3.在h
中提供了sqlite3_key()和
sqlite3_rekey()函数的原型,前者用于指定数据库使用的密钥,后者用于为数据库重新设定密钥;在文件attach.c中提供了密钥与数据库关联的接口函数,即函数sqlite3CodecGetKey()和sqlite3CodecAttach(),前者用于返回数据库的当前密