基于安全文档管理的日志系统设计
2011-07-03苏恒阳
苏恒阳
(广东轻工职业技术学院,广州 510300)
0 引言
随着安全技术的不断发展和成熟,数字签名技术被广泛应用于电子商务、金融、政治等领域,成为保护个人隐私的重要技术手段。在安全领域,数字签名保证了数据的完整性、不可抵赖性,而日志系统对于安全来说,同样非常重要。日志系统可以记录系统使用者的操作记录,可以通过它来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。数字签名和日志系统二者结合可以实现数据的安全记录。
1 用户模块的设计
用户通过注册建立自己的个人信息,登录以后可以通过用户管理,进行用户信息的修改。用户注册后就建立其个人文件夹,得到一定大小的用户空间,可以存储用户上传的文件。用户通过文件管理功能,可以进行文件的上传和删除操作。同时,用户还可以共享上传的文件。用户还可以通过消息管理给其他用户发送消息,通过备忘录管理书写备忘录。
图1 用户操作功能切换图
1.1 用户注册和登录功能
用户注册后建立自己的个人信息,用注册过的用户名和密码,用户可以登录系统。
用户注册之后,可以用注册的帐号的密码登入系统,在登录视图填写登录信息,把登入请求提交给登录控制器,控制器调用DataStore验证信息,并把验证的结果返回给用户,验证通过则进入系统,验证失败则提示失败信息。
1.2 用户操作功能
在系统中,采用了4个业务类ClientManagement、ClientFilemanagement、ClientMessage 和 Client-Remind分别来提供用户信息管理、用户文件管理、用户消息管理和用户备忘录管理,同时通过控制器ChooseAction进行功能切换。Login.jsp视图中输出4个链接的选项,分别对应4个主要的用户功能。用户通过点击不同的链接可以选择不同的功能。
1.2.1 用户信息管理功能
用户管理功能主要由业务类Clientmanagement来实现。用户从用户管理页面中点击修改用户个人信息链接,调用控制器ModifyAction,ModifyAction提供了重定向功能,使用户进入修改用户信息视图。在修改信息视图中填写要修改的用户信息,然后提交给信息修改控制器ModifySubmitAction,该控制器经过相应的验证后通过调用DataStore完成修改,保存修改的信息,并把修改的结果返回给用户功能视图。
1.2.2 用户文件管理功能
进入用户文件管理,可以进行用户文件查看、新文件上传以及文件删除操作。上传的文件存储在用户注册时分配到的空间。
用户进入上传文件的视图,选择要上传的文件,然后把上传的请求交给上传控制器,上传控制器调用数据库类DataStore执行上传文件的操作,执行文件表和文件空间表的插入和更新操作,并把上传结果返回给用户,显示在用户文件列表上。上传成功则显示文件上传成功界面,上传失败,则提示出错。
用户共享操作可以和其他用户共享自己上传的文件,进入共享文件列表可以查看各个用户共享的文件,并可以根据需要进行下载。同时,用户可以进行撤销共享操作,对于没有设置共享的文件,只有上传该文件的用户可以查看该文件。用户还可以删除自己上传的文件,操作流程和共享文件类似。
1.2.3 用户消息功能
消息业务类为用户提供发送和删除消息的功能,进入消息管理界面,用户可以给其他用户发送消息。
用户可以在自己的消息页面中查看其他用户发送给自己的消息,并且可以删除没有用的消息。删除消息不需要填写表单,直接将请求提交给删除控制器RemoveMessageAction,调用DataStore从数据库中删除信息。
1.2.4 用户备忘录功能
进入备忘录管理界面,用户可以添加新的备忘录。控制器对用户填写的表单信息进行验证,验证出错则返回输出错误信息,验证通过则将备忘录信息存入数据库,并将结果返回给用户。同时,用户可以删除过期的备忘录。
2 管理员模块的设计
系统为管理员提供了登录、注销、查看用户信息,删除用户信息,查看用户操作日志和查找文件的功能。
管理员登录之后,通过AdminLogAction控制器调用searchClient()方法从数据库中循环读出每一个用户的信息,并将用户信息保存在Vector中,然后将Vector中的用户信息存到session中。控制器最后返回到视图页面,视图页面从session中获取用户信息,放入Vector中,然后从Vector循环读出每一个用户的信息,显示在页面上,管理员即可浏览用户信息。
点击进入日志系统,管理员可以进入查看用户的操作日志。通过LogSys控制器,调用Log类中写好的searchLog()方法,从数据库中读出数据。最后转发到getLog.jsp页面上,将日志显示出来。
3 日志系统的设计
系统中用户的操作日志只有管理员可以进行查看。为了实现日志信息的记录,并使每个操作的日志记录都可以调用同一个类,实现代码的复用,专门写了一个日志信息记录的类Log.java。Log.java中包含了日志信息的数字签名、日志读取和记录日志的操作。
图 2 日志系统功能图
3.1 日志信息的产生
当用户进入系统进行操作时,包括用户的登录、文件操作、注销和用户信息修改等,日志系统都会记录相应的日志信息。根据MVC模式,用户的每次操作都由表单记录相应的信息、参数,通过模型收集信息,并将其传送给控制器Action进行处理。在每次动作的执行就会产生相应的操作日志信息,将信息作为参数,并调用Log类中的signLog()对日志信息进行数字签名,得出签名的结果。将操作信息和签名的结果作为参数传给Log类的recordLog()方法,在每次动作的最后调用该方法,产生用户操作的一条完整的日志信息,将这些信息存入到数据库中。同时,调用然后将日志信息写入到数据库中,签名的结果同样也保存在数据库中。
3.2 对日志信息的数字签名
3.2.1 非对称密钥对的产生
系统中利用非对称密钥加密算法进行数字签名, 首先必须完成的工作就是密钥对的生成。Java中的KeyPairGenertor类提供了创建用于非对称加密的密钥对的方法,密钥对创建好后封装在KeyPair类型的对象中。具体过程如下:
1)创建密钥对生成器
首先,通过工厂类KeyPairGenerator的静态方法getInstance()生成一个KeyPairGenerator 类的对象,传入的参数为非对称加密所使用的算法,常用的有RSA、DSA等,这里使用RSA算法。
KeyPairGenerator KeyGen = KeyPairGenerator.getInstance(“RSA”);
2)初始化密钥对生成器
通过KeyPairGenerator类中的initialize初始化,传入的两个参数为强度和随机数源,强度一般为1024,随机数源由SecureRandom类的对象自动生成一个原始值。
KeyGen.initialize( 1024, new SecureRandom());
3)生成密钥对
将生成的密钥对保存在KeyPair 类的一个实例中,其中包含了一对公钥和私钥的信息。
KeyPair kpair = KeyGen.genKeyPair();
4)获取公钥和私钥
publicKey pbkey = kpair.getPublic();privatekey prkey = kpair.getPrivate();
将生成的密钥对保存好,用户操作时利用私钥对日志信息进行加密,然后将签名和日志信息一起存入数据库。管理员要查看日志时,用公钥进行验证签名。
3.2.2 使用私钥对日志信息进行数字签名
日志信息产生后,利用MD5强加密消息散列算法对信息计算消息摘要,然后利用RSA非对称加密算法进行数字签名。Java.security包中的Signature类提供了进行数字签名的方法。Signature对象的initSign()方法传入私钥,执行update()方法可以将原始数据传递给Signature对象,然后执行sign()方法即可得到消息验证码。具体过程如下:
1)获取要签名的数据
用户的每一次系统操作都将产生操作记录,将用户的用户名、操作类型、操作的文件名、操作时间,作为一条操作记录,存在message.dat文件中,通过文件输入流将其读入字节类型数组data中。
FileInputStream f = new FileInputStream(“message.dat”);
int num = f.available();
byte[] data = new byte[num];
f.read(data);
2)获取私钥
生成的私钥保存在private_key.dat文件中,通过文件流读入私钥存放在RSAPrivateKey类型的变量中,用于加密日志信息。
FileInputStream f2 = new FileInputStream(“private_key.dat”);
objectInputStream b = new ObjectInputStream(f2);
RSAPrivateKey prk = (RSAPrivateKey)b.read-Object();
3)获取Signature对象
通过Signature的getInstance()方法获取对象,方法的参数指定了签名所用的算法,包含了计算消息摘要所用的算法和加密消息摘要所用的算法。系统中使用的是MD5和RSA算法。
Signature s = Signature.getInstance(“MD5withRSA”);
4)用私钥初始化Signature对象
使用Signature对象的initSign()方法初始化Signature对象,参数为加密使用的私钥,以后就可以用此加密日志信息。
s.initSign(prk);
5)传入要数字签名的数据
将保存在data数组中的用户操作信息传入,进行数字签名。
s.update(data);
6)执行数字签名签名
byte[] signdata = s.sign();
签名之后,得到的签名信息是二进制代码,通过编码类将二进制的信息转化成String类型,然后将String类型的签名结果保存在日志信息表中,以便于日志查看时进行验证。
BASE64Encoder base64Encoder = new BASE64Encoder();
String sign = base64Encoder.encode(signeddata);
3.3 日志查看功能
管理员通过登录,可以进入日志系统,查看日志信息。为了验证日志信息有没有被修改,需要对记录日志时产生的数字签名进行验证。当管理员进行查看时,触发控制器LogSysAction,该控制器从数据库中读出操作信息,并调用Log类中的checkSign()方法,利用公钥对签名进行验证,即对签名过的信息进行解密,将解密过的结果和原始信息进行对比,对比结果一致说明验证通过,不一致说明验证没有通过。验证结果同时显示在页面上,Check Pass表示通过验证,即日志信息没有被修改过;Check Fail表示没有通过验证,即日志信息已经被修改过。
日志系统提供给管理员按用户查看日志信息的功能。管理员输入用户名,日志系统可以将该用户的操作日志显示出来。
4 结束语
日志系统中,提供利用Java安全机制实现了数字签名,对于用户的操作日志签名保证了日志信息的完整性,及时了解日志信息是否被修改。
对于系统中用户包括管理员的身份认证,用户权限以及用户操作的授权管理方面等可以做一进步的工作,使得系统的安全性更强。
[1] Cay S. Horstmann, GaryCornell. 王建华, 董志敏, 杨保明, 等译. Java核心技术 卷II[M]. 北京: 机械工业出版社,2005.
[2] Jim D’Anjou, Dan Kehn, John Kellerman, 等. 束尧, 丁凡,许国梁, 译. Eclipse权威开发指南[M]. 北京: 清华大学出版社, 2006.
[3] Joseph Schmuller. 李虎, 赵龙刚, 译. UML基础、案例与应用[M]. 北京: 人民邮电出版社, 2005.
[4] Vivek Chopra, Jon Eaves, Rupert Jones, 等. 朱涛江, 张文静, 等译. JSP高级程序设计[M]. 北京: 人民邮电出版社,2006.
[5] Abraham Silberschatz, Henry F.Korth, S.Sudarshan. 杨冬青, 唐世渭, 等译. 数据库系统概念[M]. 北京: 机械工业出版社.
[6] Revist R L, Shamir A, Adleman L. A method for obtaining digital signatures and public-key cryptosystems[J].Communications of the ACM, 1978, 21(2): 120-126.
[7] 徐迎晓. Java安全性编程实例[M]. 北京: 清华大学出版社, 2003.
[8] Christopher Steel, Ramesh Nagappan, RayLai. 陈秋萍, 罗邓, 袁国忠, 等译. 安全模式[M]. 北京: 机械工业出版社,2006.
[9] 肖文, 尹建伟, 陈刚, 等. 基于J2EE的日志管理中间件的设计和实现[J]. 计算机应用研究, 2003, (10): 173-175.
[10] 刘泉, 吴涛. 基于Java的数字签名研究与实现[J]. 武汉理工大学学报, 2004, 26(1): 11-14.