信息安全课程设计金融服务系统.doc

上传人:文库蛋蛋多 文档编号:4180273 上传时间:2023-04-09 格式:DOC 页数:39 大小:941KB
返回 下载 相关 举报
信息安全课程设计金融服务系统.doc_第1页
第1页 / 共39页
信息安全课程设计金融服务系统.doc_第2页
第2页 / 共39页
信息安全课程设计金融服务系统.doc_第3页
第3页 / 共39页
信息安全课程设计金融服务系统.doc_第4页
第4页 / 共39页
信息安全课程设计金融服务系统.doc_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《信息安全课程设计金融服务系统.doc》由会员分享,可在线阅读,更多相关《信息安全课程设计金融服务系统.doc(39页珍藏版)》请在三一办公上搜索。

1、信息安全技术应用实践课程设计报告设计题目 金融信息服务系统专业名称: 班 级: 学 号: 姓 名: 同组成员: 指导教师: 2012年7月课 程 设 计 成 绩本组课题:金融信息服务系统本人任务:制作完整的金融信息系统。主要制作登录、注册、信息发布窗体、服务器窗体以及各窗体之间的链接与监听,使之能进行完整的信息交互过程。序号评分内容满分实际得分1学习态度认真,考勤全到102方案设计合理,满足安全需求,具有可操作性253系统功能完善、与方案一致、运行无误304报告撰写思路清晰、论证充分,行文流畅,书写规范205答辩时思路清晰,重点突出,准确无误106设计有独到见解5总分100等级五级制评语: 指

2、导教师签名: 年 月 日目 录目 录3第一章 课程设计背景4第二章 设计的方案4一注册和登录时MD5加密算法:5二沟通过程中,用AES进行分组加密6三(MAC)进行完整性检查以及抵抗窃听者的重放攻击7第三章 方案分析8一MD5安全性:8二AES安全性:9三MAC安全性:9第四章 设计成果9一以下是该系统的主要功能流程图:10二以下是该系统主要界面:111、首先运行服务器,后启动服务器。11122.客户登录133.客户注册134金融消息发布14第五章 总结16参考文献16附录(代码)16第一章 课程设计背景金融业是指经营金融商品的特殊企业,它包括银行业、保险业、信托业、证券业、租赁业和典当业。

3、在现代社会中,金融业用途广泛:第一,社会各阶层各行业所有人,都需要资金融通,不论长期的或短期的资金需求,不论国内的或海外的现金需求,不论短期的或远期的资金需求,金融业都可以满足这些需要。第二,已盈利的企业或个人,他的金钱需要有个存放或运用的去处,金融业正可以满足这个需要。所以金融服务系统是一个具有优化资金配置的作用的系统,而当下也是一个信息争夺的时代,因此金融信息获取的及时性就相关人员来说就显得尤其重要,影响到公司或个人的投资或融资决策。于是,金融业经营手段的现代化是急需解决的问题,运用电子计算机和自动化服务能保证信息的共享性和及时性,这也是我们开发本系统的目的。我们的目的是:创造一个为客户提

4、供金融信息的平台,金融服务人员可以在该平台发布信息,而所有的注册登录客户都可以及时跟进最新的金融信息,以做出相应的决策。第二章 设计的方案本系统是运用纯java语言制作的金融服务系统化,客户端服务器客户端的消息交互模式。客户端功能主要包括客户注册、登录、信息发送、在线用户显示。提供给客户一个友好的界面,方便客户的操作,从服务器上得到数据后再显示给客户,并根据不同的需求,向服务器发送各种请求。服务端的功能主要包括接受客户注册(采用口令、MD5方式管理保护注册信息)、接受客户登录请求、提示客户离线以及显示端口号、服务器当前状态等。服务器运行后,开启服务就可以开始监听客户请求,如有信息发送过来,首先

5、发送确认信息,然后建立一个线程,处理接受到得数据,处理结束后,线程就结束,这样可以实时接受每一个客户的请求,不会因为处理一个客户的请求而忽略了其他客户的请求。 我们开发的系统应满足以下技术要求:一、 登录、注册、服务器、客户端等窗体的设计与连接。二、 实现客户账号和密码的对应安全存储;三、 对所有的交流信息进行分组加密;四、 对所有的交流信息进行完整性检验;五、 实现服务器端对客户身份的验证;六、 能够抵挡的攻击人的防重放攻击。一注册和登录时MD5加密算法:1、简介:MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)。它的作用是让大容量信息在用数字签名软件签署

6、私人密匙前被压缩成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。2、应用:MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。 MD5广泛用于加密和解密技术上。本文描述的系统中用户的密码就是以MD5经加密后存储在服务器。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在服务器中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度

7、。3、算法描述:对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。4、具体在本系统中的应用: 建立 MD5Encrypt1类,主要代码为:byte btInput = s.getBytes();MessageDigest mdInst = MessageDigest.getInstance(MD5);mdInst.update(btInput);/处理数据byte md = mdInst.digest();/完成哈希计算 注册时,调用

8、MD5Encrypt1类创建对象:MD5Encrypt1 md5=new MD5Encrypt1();data.password=md5.MD5(data.password); 由此将注册客户的密码用MD5加密,然后才发送到服务器。 第三,登录时,和注册时加密方法一样。二沟通过程中,用AES进行分组加密沟通过程中,我们对各种沟通信息采用对称密码分组加密方法,首先新建一个提供AES加密、解密算法的类,消息从发送端发送时调用AES加密算法,接受端接受到信息再调用AES解密算法进行解密。1、简介:AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于

9、加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。2、应用:在应用方面,尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。但是DES迟早要被AES代替。3、算法描述:AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permut

10、ations )和替换(substitutions)输入数据。4、 具体在本系统中的应用: 加密时: byte raw = sKey.getBytes();SecretKeySpec skeySpec = new SecretKeySpec(raw, AES);/根据给定的字节数组构造一个密钥Cipher cipher = Cipher.getInstance(AES/CBC/PKCS5Padding);/算法/模式/补码方式/生成一个实现指定转换的Cipher对象IvParameterSpec iv = new IvParameterSpec(0102030405060708.getByte

11、s();/初值/使用CBC模式,需要一个向量iv,可增加加密算法的强度cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);/加密byte encrypted = cipher.doFinal(sSrc.getBytes(); 解密时:byte raw = sKey.getBytes(ASCII);SecretKeySpec skeySpec = new SecretKeySpec(raw, AES);Cipher cipher = Cipher.getInstance(AES/CBC/PKCS5Padding);IvParameterSpec iv =

12、 new IvParameterSpec(0102030405060708.getBytes();cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);/解密byte encrypted1 = hex2byte(sSrc); String aesKey =randkey.randomString(16); /调用方法随机产生AES密钥三(MAC)进行完整性检查以及抵抗窃听者的重放攻击1、 简介:MAC算法 (Message Authentication Codes),即消息认证码(带密钥的Hash函数):消息的散列值由只有通信双方知道的秘密密钥K来控制。

13、此时Hash值称作MAC。2、 应用: 消息认证码是基于密钥和消息摘要所获得的一个值,可用于数据源发认证和完整性校验。是通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。3、 算法描述:在发送数据之前,发送方首先使用通信双方协商好的散列函数计算其摘要值。在双方共享的会话密钥作用下,由摘要值获得消息验证码。之后,它和数据一起被发送。接收方收到报文后,首先利用会话密钥还原摘要值,同时利用散列函数在本地计算所收到数据的摘要值,并将这两个数据进行比对。若两者相等,则报文通过认证。 算法流程如下:4、具体在本系统中的应用: String mackey=mac.getMacKey();/调用方

14、法随机产生MAC密钥String macmiwen=mac.toHex(mac.encryptHMAC(data,mackey);/MAC加密 取得HMAC密钥:KeyGenerator keyGenerator = KeyGenerator.getInstance(HmacMD5); SecretKey secretKey = keyGenerator.generateKey(); 执行加密:byte bkey = new BASE64Decoder().decodeBuffer(key);SecretKey secretKey = new SecretKeySpec(bkey, HmacM

15、D5);Mac mac = Mac.getInstance(secretKey.getAlgorithm();mac.init(secretKey);另外:String R=randkey.randomString(10); /生成10位随机数R,用于防重放认证。 String openKey=145gh89sc83fgjpw; /用于总体传送时外套的公共密钥第三章 方案分析一MD5安全性:Van Oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(Brute-Force Hash Function),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年

16、的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。这也是我们选用MD5算法的根本原因。二AES安全性:AES算法的密钥长度最小是128比特,即使每秒钟能够完成256个密钥的搜索,至少需

17、要的时间大约是149万亿年。因此, Rijndael算法对强力攻击是免疫的。这就是我们选择AES的最主要的原因,而且每次发送消息的密钥都是随机产生的,起到了更好的保护作用。三MAC安全性:MAC类似于加密,区别是MAC函数是单向的,因为它不需要解密,这个性质使得鉴别函数比加密函数更不容易被破译,安全强度提高了,起到很好的认证效果。且用产生的随机数R检验,保证信息传输的可靠性。第四章 设计成果 我们开发的系统应满足以下功能需求:一、 金融服务人员可以在一个安全的平台发布金融信息以及投资建议;二、 这些信息只有该金融服务集团的客户可以读取;三、 这些信息可以被所有的该金融服务集团的客户获取;四、

18、客户可以再该系统与服务人员或者是客户之间可以进行简单的沟通和交流;五、 金融服务人员可以识别登录人的身份;金融服务人员可以查看各登录人的登录和退出时间。一以下是该系统的主要功能流程图:图一 客户注册功能流程图备注:客户注册时,需要填写注册信息,包含“客户名”、“密码”和“邀请码”。其中邀请码由金融机构工作人员填写,若邀请码不等于系统内置的邀请码,则注册不能成功。这样做,保证了,不能随便任何人都可以注册成功,只有经过了工作人员核查信息之后,方能帮助其完成注册信息。图二 客户登录功能流程图备注:客户登录时,需要输入“客户名”和“密码”,若信息与注册时保存在服务器端的信息相匹配,则,客户可进入到服务

19、平台,否则,登录失败。图三 消息加密、解密、认证流程图备注:登录各方发送消息时,要发送“验证码”、“明文”、“随机数”,其中明文要通过AES加密和解密,验证码用来验证信息的完整性,若解密之后的明文的验证码和接收到的验证码不同则舍弃该信息,若相同,则发布信息到服务平台。随机数的产生是用来防止重放攻击。二以下是该系统主要界面:1、首先运行服务器,后启动服务器。图一 金融服务系统服务器管理界面 如果未开启服务器,系统将会出现如下图的提示:图二 登入失败页面2.客户登录图三 代理和客户登入页面备注:在这个页面我们用户名和密码都设置了非空的约束,如果输入错误的密码的用户名,系统将会提示“用户名或密码不能

20、为空”。你也可以点击“注册”进入注册页面。3.客户注册 图四 代理或客户注册页面备注:在这个页面我们设置了邀请码的功能,系统指定一个只有代理拥有的特定邀请码, 当客户在注册的时候需要代理代其输入邀请码,这在一定程度上限制了非任何人均可进入金融消息系统。在注册和登入成功后,服务器将会提示如下消息图五 注册和登入成功后服务器页面4金融消息发布此时页面将跳转到金融消息发布页面,如图所示: 图六 金融融消息发布页面接下来,你就可以在这里接受和发布消息了:图七 整体效果图备注:当代理发送消息时系统根据MD5加密算法和AES加密、解密算法生成一系列密文和密钥。第五章 总结通过这次金融信息服务系统的开发,我

21、们实现了金融服务人员向其客户发布信息的功能,并且保证了这些信息的保密性和完整性。在系统的设计上我们主要考虑两大方面问题:(1)制作完整的金融信息系统主要制作登录、注册、信息发布窗体、服务器窗体以及各窗体之间的链接与监听,使之能进行完整的信息交互过程。(2)对金融信息服务系统进行安全性设置本模块主要考虑的是服务器对用户密码的保护功能、发送端与接收端信息交互过程的加密功能、信息传输过程中的完整性判断功能、接收方信息传输过程中的防重放功能。但是我们这个系统也存在着一定的缺陷,比如客户如果想和某一客户或者服务人员沟通时,会使所有登录人员都看到其沟通信息,我认为我们可以进一步完善底层通讯协议,使能够更好

22、的处理数据的发送和接受,需做到以下几点:(1)多线程下的对临界数据访问的问题。(2)对本地用户名和密码的保存问题,在本程序中,没有对本地用户名和密码设置缓存。也就是说用户登录一次后,系统不会自动的保存下用户的用户名和密码,使得用户在第二次进入系统时还要重新输入用户名。(3)在客户端系统,功能的设置有待进一步丰富,功能的实现还有待完善和改进。参考文献【1】辛运帏 饶一梅 马素霞 java程序设计 清华大学出版社【2】张焕国 王张宜 密码学引论 武汉大学出版社【3】【4】【5】【6】附录(代码)Client.java/客户端程序import javax.swing.*;import java.aw

23、t.*;import java.awt.event.*;import .*;import java.io.*;import java.util.*;public class Client extends JFrame implements ActionListener JPanel pnlLogin; JButton btnLogin, btnRegister,btnexit; JLabel lblServer, lblPort, lblName, lblPassword, lblLogo; JTextField tfName, tfServer, tfPort; JPasswordField

24、 pwd; String strServerIp; int port; /用于将窗口定位 / Dimension scnSize = Toolkit.getDefaultToolkit().getScreenSize(); private Dimension scrnsize; private Toolkit toolkit = Toolkit.getDefaultToolkit(); public Client() /构造方法 super(登录金融服务系统); pnlLogin = new JPanel(); this.getContentPane().add(pnlLogin); lblS

25、erver = new JLabel(服务器:); lblPort = new JLabel(端口:); lblPort.setVisible(false); lblName = new JLabel(用户名:); lblPassword = new JLabel(密 码:); tfServer = new JTextField(20); tfServer.setText(127.0.0.1); tfPort = new JTextField(4); tfPort.setText(8888); tfPort.setVisible(false); tfName = new JTextField(

26、20); pwd = new JPasswordField(20); btnLogin = new JButton(登录); btnRegister = new JButton(注册); btnexit=new JButton(取消); pnlLogin.setLayout(null); /组件用手动布局 lblServer.setBounds(80, 140, 50, 30);tfServer.setBounds(80, 170, 120, 25); /lblPort.setBounds(175, 15, 30, 30); /tfPort.setBounds(210, 15, 40, 25)

27、; lblName.setBounds(80, 200, 100, 30);tfName.setBounds(80, 230, 120, 25); lblPassword.setBounds(80, 260, 100, 30);pwd.setBounds(80, 290, 120, 25);btnLogin.setBounds(30, 320, 80, 25);btnRegister.setBounds(110, 320, 80, 25);btnexit.setBounds(190, 320, 80, 25); pnlLogin.add(lblServer); pnlLogin.add(tfS

28、erver); pnlLogin.add(lblPort); pnlLogin.add(tfPort); pnlLogin.add(lblName); pnlLogin.add(tfName); pnlLogin.add(lblPassword); pnlLogin.add(pwd); pnlLogin.add(btnLogin); pnlLogin.add(btnexit); pnlLogin.add(btnRegister); lblName.setForeground(Color.BLACK);lblPassword.setForeground(Color.BLACK);/ 设置背景图片

29、Icon logo1 = new ImageIcon(imagesloginlogo.jpg);lblLogo = new JLabel(logo1);lblLogo.setBounds(0, 0, 300, 140);pnlLogin.add(lblLogo); /设置登录窗口 setResizable(false); setSize(300,400); setVisible(true); / setLocation(scnSize.width - getWidth()/2,(scnSize.height - getHeight()/2);scrnsize = toolkit.getScre

30、enSize();setLocation(scrnsize.width / 2 - this.getWidth() / 2, scrnsize.height/ 2 - this.getHeight() / 2);Image img = toolkit.getImage(imagesappico.jpg);setIconImage(img); /为按钮注册监听 btnexit.addActionListener(this); btnLogin.addActionListener(this); btnRegister.addActionListener(this); addWindowListen

31、er(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); /按钮监听响应 public void actionPerformed(ActionEvent ae) Object source = ae.getSource(); strServerIp = tfServer.getText(); try port = Integer.valueOf(tfPort.getText(); if (port =6000) JOptionPane.showMessageDialog(null, 请使

32、用大于6000的端口号); return; catch (NumberFormatException e) JOptionPane.showMessageDialog(null, 输入的端口号不是整数); if (source.equals(btnLogin) if (tfName.getText().equals() | pwd.getPassword().equals() JOptionPane.showMessageDialog(null, 用户名或密码不能为空); else login(); if (source.equals(btnRegister) this.dispose();

33、new Register(strServerIp, port); if (source.equals(btnexit) System.exit(0); public void login() /登录 User data = new User(); data.name = tfName.getText(); data.password = new String(pwd.getPassword(); try MD5Encrypt1 md5=new MD5Encrypt1(); data.password=md5.MD5(data.password); Socket sock = new Socke

34、t(strServerIp, port);/连接到服务器 ObjectOutputStream os = new ObjectOutputStream(sock.getOutputStream(); os.writeObject( (User) data); /将登录用户信息送到服务器socket /读来自服务器socket的登录状态 BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream(); String status = br.readLine(); if (status.equal

35、s(登录成功) new Room( (String)data.name, strServerIp, port); this.dispose(); /关闭流对象 os.close(); br.close(); sock.close(); else JOptionPane.showMessageDialog(null, status); os.close(); br.close(); sock.close(); catch (ConnectException e1) JOptionPane.showMessageDialog(null, 连接到指定服务器失败!); catch (Exception

36、 e2) JOptionPane.showMessageDialog(null, 发生错误!); public static void main(String args) new Client(); MACEncrypt.javaimport java.security.MessageDigest;import javax.crypto.KeyGenerator;import javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64De

37、coder;import sun.misc.BASE64Encoder;public class MACEncrypt /* 取得HMAC密钥 */ public static String getMacKey() throws Exception KeyGenerator keyGenerator = KeyGenerator.getInstance(HmacMD5); SecretKey secretKey = keyGenerator.generateKey(); return new BASE64Encoder().encode(secretKey.getEncoded(); /* 执

38、行加密 */ public static byte encryptHMAC(byte data, String key) throws Exception byte bkey = new BASE64Decoder().decodeBuffer(key); SecretKey secretKey = new SecretKeySpec(bkey, HmacMD5); Mac mac = Mac.getInstance(secretKey.getAlgorithm(); mac.init(secretKey); return mac.doFinal(data); static String to

39、Hex(byte buffer) StringBuffer sb = new StringBuffer(buffer.length * 3); for (int i = 0; i 4, 16); sb.append(Character.forDigit(bufferi & 0x0f, 16); return sb.toString(); public static int getWordCount(String s) int length = 0 ; for ( int i = 0 ; i = 0 & ascii = 255 ) length + ; else length += 2 ; re

40、turn length; public static void main(String args) String msg = 3123; byte data = msg.getBytes(); try System.out.println(msg); String key = getMacKey(); System.out.println(mac key: + key); System.out.println(mac: + toHex(encryptHMAC(data, key); System.out.println(mac length: + getWordCount(key); catch (Exception e) e.printStackTrace(); RandAESKey.javaimport java.util.*;public class RandAESKey private static Random randGen = null;private static char number

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号