信息安全综合实践

发布时间:2017-09-11 21:04:24   来源:文档文库   
字号:

目录

实验一 网络通信安全

1.1实验目的

1.2实验内容

1.3相关知识

1.4实验成果

1.5实验小结

实验二 网络攻防

2.1实验目的

2.2实验内容

2.3实验原理

2.4实验步骤

2.5实验小结

实验三 Web服务器配置

3.1实验目的

3.2实验要求

3.3实验内容

3.4实验小结

实验四 信息系统安全

4.1实验目的

4.2实验内容

4.3开发环境

4.4系统实现

4.5实验小结


实验一 网络通信安全

1.1实验目的

通过本章的学习,使学生掌握密码学在通信安全中的具体应用。基本要求能够实现客户服务器通信,能够使用AES算法实现消息的加密与解密,对优秀的学生要求能够实现数字签名的生成与验证

1.2实验内容

1)实现客户服务器之间的通信;

2)发送方传输的消息使用AES加密,接收方对消息解密获取明文;

3)发送方传输的消息使用HMAC处理,接收方验证消息的完整性;

4)发送方对传输的消息使用RSA进行签名,接收方验证数字签名。

1.3相关知识

1.3.1对称密码AES

1997年美国国家标准和技术委员会NIST宣布征集一个新的对称密钥分组密码算法,以取代DES作为新的加密标准,新的算法被命名为高级加密标准AES。经过角逐,由比利时密码学家DaemenRijment共同设计的Rijndael算法成为最后赢家。

目前的AES算法是一个迭代型分组密码,其分组长度和密钥长度都可变,各自支持128比特、192比特、256比特。

DES相同,AES也是由最基本的变换单位——“轮”多次迭代而成的,当分组长度和密钥分组长度均为128bit时,轮数为N=10AES的轮(除最后一轮)变换由四个不同的变换组成,这些变化被称之为内部轮函数,可以表示成如下形式:

RoundStateRoundKey{

SubBytesState);

ShiftRowsState);

MixColumnsState);

AddRoundKeyStateRoundKey);}

State表示消息矩阵;RoundKey表示轮密钥矩阵;SubBytesState)为字节代替变换、ShiftRowsState)为行移位变换、MixColumnsState)为列混合变换、AddRoundKeyStateRoundKey)为与子密钥异或。

最后一轮略微不同,将其记为FinalRoundKeyStateRoundKey),相当于前面的RoundStateRoundKey)去掉MixColumnsState)。

对于加密来说,输入到第一轮的State就是明文消息矩阵,最后一轮输出的State就是对应的密文消息矩阵。

AES的解密变换和加密变换时互逆的,轮函数也分为4层,分别为InvShiftRowState)逆行移位变换、InvByteSubState)逆字节代替变换、AddRoundKeyStateRoundKey)与子密钥位异或和InvMixColumnState)逆列混合变换,可表示为:

InvRoundStateRoundKey{

InvShiftRowState);

InvByteSubState);

AddRoundKeyStateRoundKey);

InvMixColumnState);}

word/media/image1.gif

AES加密过程

1.3.2公钥密码RSA

RSA公钥加密算法是1977年由Ron RivestAdi ShamirhLenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。

RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

算法描述:

1)密钥的产生

选择两个保密的大素数pq;计算n=p*q,φ(n)=(p-1)(q-1),其中,φ(n)n的欧拉函数值;选一整数e,满足1φ(n),gcd(φ(n),e=1;计算d,满足de=1modφ(n),de在模φ(n)下的乘法逆元;以{en}为公开钥,以{dn}为秘密钥。

2)加密

加密时首先将明文比特串分组,是的每个分组对应的十进制数小于n,然后对每个明文分组m,做加密运算:c=m mod n

3)解密

对密文分组的解密运算为:m=c mod n

RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

1.4实验成果

我们使用JAVA语言(eciple工具)完成实验。

1.4.1代码分析

思路分析:首先完成客户服务器通信模块,然后插入加密模块

下面贴出部分代码以供分析

发送部分:

package kehuduan; //客户端的程序代码

import java.awt.BorderLayout;

import java.net.*;

import javax.crypto.Cipher;

import javax.crypto.spec.SecretKeySpec;

import javax.swing.JPanel;

import javax.swing.JFrame;

import java.awt.Panel;

import java.awt.Rectangle;

import java.awt.GridBagLayout;

import javax.swing.JLabel;

import javax.swing.JTextField;

import javax.swing.JButton;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.security.Key;

public class Kehuduan extends JFrame {

private static final long serialVersionUID = 1L;

private JPanel jContentPane = null;

private JLabel jLabel = null;

private JTextField jTextField = null;

private JTextField jTextField1 = null;

private JButton jButton = null;

private JLabel jLabel1 = null;

public Kehuduan() {

super();

initialize();

}

private void initialize() {

this.setSize(398, 258);

this.setContentPane(getJContentPane());

this.setTitle("客户端");

}

private JPanel getJContentPane() {

if (jContentPane == null) {

jLabel1 = new JLabel();

jLabel1.setBounds(new Rectangle(21, 61, 116, 21));

jLabel1.setText("输入发送的消息:");

jLabel = new JLabel();

jLabel.setBounds(new Rectangle(20, 12, 115, 25));

jLabel.setText("服务器的ip地址:");

jContentPane = new JPanel();

jContentPane.setLayout(null);

jContentPane.add(jLabel, null);

jContentPane.add(getJTextField(), null);

jContentPane.add(getJTextField1(), null);

jContentPane.add(getJButton(), null);

jContentPane.add(jLabel1, null);

}

return jContentPane;

}

private JTextField getJTextField() {

if (jTextField == null) {

jTextField = new JTextField();

jTextField.setBounds(new Rectangle(152, 12, 208, 26));

}

return jTextField;

}

private JTextField getJTextField1() {

if (jTextField1 == null) {

jTextField1 = new JTextField();

jTextField1.setBounds(new Rectangle(22, 98, 341, 67));

}

return jTextField1;

}

public static String Encrypt(String sSrc, String sKey) throws Exception

//加密函数

{

if (sKey == null) {

System.out.print("Key为空null");

return null;

}

//判断Key是否为16

if (sKey.length() != 16)

{ System.out.print("Key长度不是16");

return null; }

byte[] raw = sKey.getBytes("ASCII");

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] encrypted = cipher.doFinal(sSrc.getBytes());

return byte2hex(encrypted).toLowerCase();

}

public static String byte2hex(byte[] b)

{ String hs = "";

String stmp = "";

for (int n = 0; n < b.length; n++)

{ stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));

if (stmp.length() == 1)

{ hs = hs + "0" + stmp; }

else

{ hs = hs + stmp; }

}

return hs.toUpperCase();

}

private JButton getJButton() {

if (jButton == null) {

jButton = new JButton();

jButton.setBounds(new Rectangle(130, 178, 115, 35));

jButton.setText("发送");

jButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) {

//System.out.println("mouseDragged()"); // TODO Auto-generated Event stub mouseDragged()

String ip=jTextField.getText();

String miyao="1234567890abcDEF";

String mingwen=jTextField1.getText();

String entring = null;

try {

entring= Kehuduan.Encrypt(mingwen , miyao);

} catch (Exception e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

try{

DatagramSocket DS=new DatagramSocket();

DatagramPacketDP=new DatagramPacket(entring.getBytes(),entring.getBytes().length,

InetAddress.getByName(ip),3333);

DS.send(DP);

DS.close(); }

catch (Exception excep){}}

});

}

return jButton; }

}

接收部分:

package fuwuqi; // 服务器端的程序代码

import java.awt.BorderLayout;

import javax.swing.JPanel;

import javax.swing.JFrame;

import javax.swing.JLabel;

import java.awt.Rectangle;

import javax.swing.JTextField;

import javax.swing.JButton;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import javax.crypto.*;

import javax.crypto.spec.*;

public class Fuwuqi extends JFrame implements Runnable {

private static final long serialVersionUID = 1L;

private JPanel jContentPane = null;

private JLabel jLabel = null;

private JLabel jLabel1 = null;

private JTextField jTextField = null;

private JButton jButton = null;

private JTextField jTextField1 = null;

public Fuwuqi() {

super();

initialize();

}

private void initialize() {

this.setSize(376, 260);

this.setContentPane(getJContentPane());

this.setTitle("服务");

this.setVisible(true);}

private JPanel getJContentPane() {

if (jContentPane == null) {

jLabel1 = new JLabel();

jLabel1.setBounds(new Rectangle(24, 156, 56, 44));

jLabel1.setText("明文:");

jLabel = new JLabel();

jLabel.setBounds(new Rectangle(25, 27, 54, 41));

jLabel.setText("密文:");

jContentPane = new JPanel();

jContentPane.setLayout(null);

jContentPane.add(jLabel, null);

jContentPane.add(jLabel1, null);

jContentPane.add(getJTextField(), null);

jContentPane.add(getJButton(), null);

jContentPane.add(getJTextField1(), null);}

return jContentPane;

}

private JTextField getJTextField() {

if (jTextField == null) {

jTextField = new JTextField();

jTextField.setBounds(new Rectangle(101, 11, 242, 71));}

return jTextField;

}

private JButton getJButton() {

if (jButton == null) {

jButton = new JButton();

jButton.setBounds(new Rectangle(122, 96, 70, 26));

jButton.setText("解密");

jButton.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseClicked(java.awt.event.MouseEvent e) {

//System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()

String drc= jTextField.getText();

String miyao="1234567890abcDEF";//给定的密钥

String src=null;

try {

src = Decrypt(drc,miyao);

//根据发送过来的加密内容以及密钥进行相应的解密工作

} catch (Exception e1) {

// TODO Auto-generated catch block

e1.printStackTrace();}

jTextField1.setText(src.trim());

}

});

}

return jButton;

}

public void run()//真正的执行函数

{ while(true)

{

byte[] buf=new byte[100];

try{

DatagramSocket DS =new DatagramSocket(3333);

DatagramPacket DP=new DatagramPacket(buf,buf.length);

DS.receive(DP);

jTextField.setText(new String(DP.getData()).trim());

DS.close();

Thread.sleep(200);

}catch(Exception excep){}

}

}

public static String Decrypt(String sSrc, String sKey) throws Exception

{//解密的函数

try { //判断Key是否正确

if (sKey == null)

{ System.out.print("Key为空null");

return null;}

//判断Key是否为16

if (sKey.length() != 16)

{ System.out.print("Key长度不是16");

return null;}

byte[] raw = sKey.getBytes("ASCII");

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.DECRYPT_MODE, skeySpec);

byte[] encrypted1 = hex2byte(sSrc);

try {

byte[] original = cipher.doFinal(encrypted1);

String originalString = new String(original);

return originalString;

} catch (Exception e) {

System.out.println(e.toString());

return null;

}

} catch (Exception ex) {

System.out.println(ex.toString());

return null; }

}

public static byte[] hex2byte(String strhex)

{ if (strhex == null) { return null; }

int l = strhex.length();

if (l % 2 == 1) { return null; }

byte[] b = new byte[l / 2];

for (int i = 0; i != l / 2; i++)

{ b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2), 16);}

return b;

}

private JTextField getJTextField1() {

if (jTextField1 == null) {

jTextField1 = new JTextField();

jTextField1.setBounds(new Rectangle(107, 139, 237, 76)); }

return jTextField1; }

public static void main(String arg[]){

Fuwuqi fu=new Fuwuqi();

Thread Th=new Thread(fu);

Th.start(); }

}

1.4.2成果展示

(加密在通信过程中完成,服务器端显示得到的密文,而后在服务器端进行解密,从而得到明文)

1.5实验小结

通过本次实验,我们学习了java课上的编程的相关知识,复习了java的应用,比如处理机制以及线程,了解了网络编程及通讯技术。由于自身能力的不足以及技术有限,实验成果比较简陋,比没有真正实现AES的加密解密,而是根据明文的长度(16的倍数)针对的做加密的变换,比如16位以下的明文,密文会是32位,而32位以下的会是对应64位的密文,同时也没有加入签名验证模块。


实验二 网络攻防

——利用135端口入侵个人计算机

2.1实验目的

评估操作系统的安全性,利用工具或独立编程发现系统漏洞,利用工具或独立编程攻破指定的系统,增强系统的安全性。

2.2实验内容

了解系统漏洞,通过实践提高学生网络攻防能力,包括漏洞发现,利用脚本攻击远程系统。

2.3实验原理

通过135端口入侵实际上是利用RPC漏洞来攻击计算机的。一般情况下135端口主要用于使用RPCRemote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务,通过RPC能确保在一台计算机上运行的程式能顺利地 执行远程计算机上的代码,使用DCOM能通过网络直接进行通信,能够跨包括HTTP协议在内的多种网络传输。RPC本身在处理通过TCP/IP的消息交换部分有一个漏洞,该漏洞是由于错误地处理格式不正确的消息造成的。会影响到RPCDCOM之间的一个接口,该接口侦听的端口就是135

2.4实验步骤

1、通过135端口入侵,攻击者首先需要查找网络上存在135端口漏洞的主机地址,在查找此类主机过程中,能使用一些扫描工具,比如SuperScan就是典型的端口工具之一,为了更容易找到此类主机,特地安装虚拟机。在SuperScanstart”文本框中输入需要扫描的起始地址,然后在“end”文本框里填写好扫描结束的IP地址,在“Scan type”选项中选择“all ports from”单选按钮,并在右侧的文本框中输入“135”。再点击“start”按钮即可开始扫描。扫描结束后,在下方的列表中能查看目标主机打开的端口。然后再点击“Save”按钮选好保存路径,把里面有漏洞的IP整理下即可。

为了能够比较容易扫描到“漏洞”,特意在虚拟机下进行实验。

利用SuperScan扫描查找存在135端口漏洞的主机

1IP192.168.19.128的为进行各个实验的主机

IP192.168.19.129的为此次进行扫描“漏洞”的主机

2、得到有漏洞后,我们更有一个功能强大的扫描工具,比如NTScan汉化版。然后在“Hostfile“处点击“打开”按钮找到我们刚才保存的IP路径,在连接共享$处选择“IPCscan”,在“scan host opened port”处填写135端口。最后点击“Strat”即可。要不了多久就会有结果显示。

注意:在扫描过后,软件的下方出现一行信息

192.168.19.129 administrator 123 unknow

表明了此主机管理员的密钥为123。一次在远程登录此主机时利用已知密钥可顺利登录,从而达到入侵的效果。

使用NTscan再次扫描漏洞主机

3、获得漏洞主机用户名以后,我们需要一个开启的工具,那就是Recton。把刚刚扫描的IP输入TELNET界面的“远程主机”处,及用户名和密码。下一步点击“开始执行”按钮等待把TELNET打开吧。打开后按WIN+R输入CMD进入再输入Telnet 192.168.19.129 回车,会提示让你输入用户名,把用户名输入后,回车即可进入主机。而且得到的还是SYSTEM权限。

选择23端口是由于telnet的需要。

使用Recton开启telnet服务

telnet到目标主机

4、下一步就是为我们加了拥有管理员权限的用户,这样我们就轻松的获取了一台肉机。最后我们能上传一些远程性木马软件作为后门,比如灰鸽子,冰河等。

2.5实验小结

通过本次实验使我对与网络攻防有了更加深入的了解,也学会了如何抓到自己的“下属,不过也清楚的知道能够利用这样的软件扫描漏洞关键在于虚拟机的主机过于陈旧,因为在自己电脑主机上已经试验过,不可能成功,一方面是密钥问题,软件的字典搜索扫描不出来密钥,另外一方面,如今的电脑漏洞少的可怜。所以说我们只是掌握到了简单的攻防,想要学习研究更深入的问题,还是要更加的努力才行。


实验三 Web服务器配置

3.1实验目的

操作系统的配置与管理、Web服务器的管理与配置、邮件服务器的管理与配置

3.2实验要求

通过本章的学习,使学生熟悉WindowsLinux操作系统的配置与管理。操作系统的安装、系统文件的配置、帐号管理、服务管理、配置安全策略、安全审核;IIS安全和Apeach安全。安装Web服务、配置访问控制、使用文件完整性检查;MICROSOFT EXCHANGESENDMAIL的管理与配置。

3.3实验内容

3.3.1 IIS配置

1.首先打开Win7控制面板,单击程序和功能,然后选择左侧的打开或关闭Windows功能

2.现在出现了安装Windows功能的选项菜单,注意选择的项目,我们需要手动选择需要的功能,下面这张图片把需要安装的服务都已经选择了,大家可以按照图片勾选功能。

3.安装完成后,再次进入控制面板,选择管理工具,进入后双击 Internet(IIS)管理器选项,进入IIS设置。

4.选择左边小窗口的 Default Web Site,单击几下HUASHAO-PC就可以看到Default Web Site,然后双击中间窗口出现的“ASP”选项。

5.IISASP“父路径是没有启用的,开启父路径,选择True

6.配置IIS的站点。单击右边的高级设置选项,则可以设置网站的目录(最好将其设置在某一盘符的根目录下)。

7.点击右侧的绑定,设置网站的端口。至此,Win7旗舰版的IIS设置已经基本完成了,ASP+Access程序可以调试成功。

8.在编辑权限中实现安全控制

3.3.2 FTP服务器配置

1首先在控制面板->删除程序->打开或关闭windows功能->internet信息服务里面->FTP服务

2、控制面板---系统和安全---管理工具---Internet 信息服务(IIS)管理器---右键点你计算机名称那里,选择添加FTP站点;

FTP站点名称输入:"xinan"---选择你的FTP目录物理路径,点下一步---Ip地址选全部未分配,端口可以自己设,但不能用80,勾上自动FTP站点SSL允许,点下一步---身份验证选匿名,允许访问选匿名用户,权限勾读取,点完成。

4. 开始---控制面板---系统和安全---允许程序通过防火墙---钩上FTP及后面两个框框(家庭和公用)。5. ftp消息里面可以设置成功登录后欢迎的消息和退出时的消息,还可以设置最大连接数。

6设置用户权限:

1添加用户:以两个用户为例,“public“用户用于只读(下载)文件,“admin”用户可以读写(创建、删除、上传、下载)文件。

在桌面上右击计算机,点击管理,在计算机管理窗口的左窗格中依次展开系统工具”→“本地用户和组目录,单击选中用户选项。在右侧窗格中单击右键,点击新用户命令。在打开的新用户对话框中填写用户名public,并设定密码。然后取消用户下次登录时需更改密码复选框,并勾选用户不能更改密码密码永不过期复选框,单击创建完成该用户的添加。重复过程添加用户admin

2)设置每个用户的权限:

在设置权限前,为方便对这些用户的管理,最好将他们放入一个专门的组中。例如我们可以创建一个“FTPUsers组:在“计算机管理”窗口的目录树中单击选中“组”选项,然后在右侧窗格中单击右键,执行“新建组”命令,并将该组命名为“FTPUsers”。接着依次单击“添加”- “高级”→“立即查找”按钮,将刚才创建的用户全部添加进来。

然而事情并没有完,因为上述创建的用户默认隶属于“Users”组,也就是说他们拥有对大部分资源的浏览权限。为了实现对特定资源的有效管理,需要将这些用户从“Users”组中删除。在“计算机管理”窗口的右侧窗格中双击“Users”选项,用鼠标选中所有刚添加的用户并单击“删除”。

3)下面分别设置权限:

在第一步中FTP服务器的主目录路径为“D:/信息安全实践实验”,我们先来设置“public”用户对“Download”文件夹的权限。右击“信息安全实践实验”文件夹,执行“属性”命令。在打开的“信息安全实践实验属性”对话框中切换至“安全”选项卡下,然后依次单击“添加”→“高级”→“立即查找”按钮,单击选中“public”并依次单击“确定”按钮回到“Download属性”对话框。此时,“public”用户默认只有读取权限,符合我们的权限要求。接着同样的方法添加“admin”用户,并在“Download属性”的“安全”选项卡下部的“admin的权限”列表框中的“允许”列下面勾选“写入”复选框。至此,我们的要求就全部满足了。如果还想详细设置,单击 “安全”选项卡中的“高级”按钮,自行设置即可。

美中不足的是测试通不过。

3.3.3帐户管理

1、 打开控制面板,用户帐户

2、 新建一个帐户,配置用户名

7、安全设置:打开控制面板管理工具中的本地安全设置

8、配置帐户策略密码策略

9、策略配置

10、配置IP安全策略

3.3.4邮件服务器配置

1、 启动OUTLook

这样就可以直接在outlook上查看caifeitong@163.com邮箱内的邮件内容。

3.4实验小结

在本次实验中,对IIS的安装及使用都有了基本的了解,在实现操作系统(Windows旗舰版)Web服务器或应用服务器(IIS、邮件服务器(Exchage)的管理与配置过程中,通过自己的操作对他们的配置也有了一定程度的熟悉,甚至觉得很新鲜,毕竟自己以前没发现过。不过也有不足的地方,查找资料以及按部就班的实验,就是成功不了,不知道为何,希望自己下次能精益求精,做到更好。


实验四 信息系统安全

——会员系统的设计实现

4.1实验目的

掌握构建安全信息系统的整个流程

4.2实验内容

实现一个安全的信息系统,包括用户注册、认证、授权、访问控制、查询等功能。

4.3开发环境

编译环境:Visual Studio.NET 2008

数据库:Access 2003

4.4系统实现

见源代码。

4.4.1功能设计

1、系统设置

比如系统登录,数据的备份、恢复。这些由于没有硬性要求,所以就没有实现这些功能。

2、 会员的管理

此部分我觉得应该有会员的录入、删除、修改等功能,最好还能有会员的积分管理,联系会员等等。

3、消费管理

会员消费,一般消费,消费记录等等。

4、商品管理

这个由于没有硬性要求,所以我只是简单的涉及了一点。包括,商品类别,商品信息,库存的管理。

4.4.2、数据库设计

由于这个会员管理系统比较小,也比较简单。所以,我们决定使用Access数据库。本系统的数据库名称为Vip,下辖5个表格,分别为goodsCategory(商品类别),goodInfo(商品信息),userInfo(用户信息),vipInfo(会员信息),vipShoppingRecord(商品消费记录)。

各个表格的详细信息如下:

4.1 goodsCategory

4.2 goodInfo

4.3 userInfo

4.4 vipInfo

4.5 vipShoppingRecord

4.4.3 几个主要模块

1.会员管理

这个模块是对会员进行管理,主要有会员的添加、修改、删除,会员的积分管理,会员的联系(未实现)几个模块,如图3

1)会员信息,包括会员的添加、修改、删除。

2)积分管理,可以增减会员的积分。

2. 消费管理

主要个方面的功能:会员消费操作,一般消费操作,消费记录的查询。

1)会员消费,会员购买商品。

2)消费记录,记录会员的消费情况。

3. 商品管理

模块的功能是对商品进行分类和查询,还有商品的库存管理几个功能,

1) 商品类别。

2) 商品信息。

4. 报表

表报模块主要有销售记录和会员情况2个报表组成。

1) 销售记录。记录销售情况

4.4.4 代码

数据库连接

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data.OleDb;

using System.Windows.Forms;

namespace VIPSys.Classes

{

public class GetConnection

{

public GetConnection()

{ }

public OleDbConnection GetCon()

{

String strPath=Application.StartupPath+ @"\vip.mdb";

String conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data source='" + strPath + "'";

OleDbConnection con = new OleDbConnection(conStr);

con.Open();

return con;

}

}

}

系统实现的部分代码如下:

(1) 管理员登录代码

/// 登录系统

private void btnLogin_Click(object sender, EventArgs e)

{

GetConnection con = new GetConnection();

OleDbConnection conStr = con.GetCon();

string check = "select * from userInfo where 用户名='" + cbUser.Text + "' and 密码='" + tbPw.Text +"'";

int i = 0;

if (cbUser.Text == "")

{

MessageBox.Show("请输入用户名!");

cbUser.Focus();

return;

}

else if (tbPw.Text == "")

{

MessageBox.Show("密码不能为空!");

tbPw.Focus();

}

else if (Check(i,check,conStr) == 1)

{

frmMain main = new frmMain();

main.Show();

this.Hide();

}

else

{

MessageBox.Show("用户名或密码错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);

cbUser.Text = "";

tbPw.Text = "";

cbUser.Focus();

return;

}

}

添加会员部分代码

//添加会员

private void btnAdd_Click(object sender, EventArgs e)

{

if (tbId.Text != "" && tbName.Text != "" && cbSex.Text != ""&&

tbJiFen.Text != "" && cbState.Text != "" && cbLevel.Text != "")

{

OleDbCommand cmd = new OleDbCommand("select * from vipInfo where vipID='" + tbId.Text + "'", conStr);

OleDbDataReader dr = cmd.ExecuteReader();

if (dr.HasRows)

{ MessageBox.Show("此卡号已经存在!"); }

else

{

dr.Close();

string str = "insert into vipInfo(vipID,vipName,vipSex,vipIntegration,vipState,vipLevel,vipPhone) " +

" values(" + tbId.Text + ",'" + tbName.Text + "','" + cbSex.Text + "'," + tbJiFen.Text + ",'" + cbState.Text + "','" + cbLevel.Text + "','" + tbPhone.Text + "')";

cmd.CommandText = str;

cmd.ExecuteNonQuery();

MessageBox.Show("添加成功!");

ClearInfo();

}

}

else

{ MessageBox.Show("请将信息输入完整!"); }

}

会员消费部分代码

/// 确认支付

private void btnSubmit_Click(object sender, EventArgs e)

{

string shoppingSum = tbShopping.Text.Substring(0, tbShopping.Text.Length - 2);

string str = "insert into vipShoppingRecord(vipId,shoppingTime,shoppingMoney,goodsName) " +

"values( '" + tbVipId.Text + "','" + lbTime.Text + "','" + shoppingSum + "','" + tbgoodsName.Text + "')";

OleDbCommand cmd = new OleDbCommand(str, conStr);

cmd.ExecuteNonQuery();

MessageBox.Show("支付成功!");

tbgoodsName.Text = "";

tbShopping.Text = "";

tbVipId.Text = "";

}

/// 显示消费金额

private void goodsName_Leave(object sender, EventArgs e)

{

string str = "select goodsPrice from goodsInfo where goodsName='" + tbgoodsName.Text + "'";

OleDbDataAdapter da = new OleDbDataAdapter(str, conStr);

DataTable dt = new DataTable();

da.Fill(dt);

if (dt.Rows.Count >0 )

{

tbShopping.Text = dt.Rows[0][0].ToString() + " ";

}

else

{ MessageBox.Show("商品输入错误!"); }

}

}

}

消费记录部分代码

/// 查询会员消费信息

private void btnSearch_Click(object sender, EventArgs e)

{

if (tbVipId.Text == "")

{ MessageBox.Show("请输入会员卡号!"); }

else

{

string str = "select vipId as 会员卡号, shoppingTime as 消费时间, shoppingMoney as 消费金额,goodsName as 商品名称 from vipShoppingRecord where vipId='" + tbVipId.Text + "'";

OleDbDataAdapter da = new OleDbDataAdapter(str, conStr);

DataTable dt = new DataTable();

da.Fill(dt);

dataGridView1.DataSource = dt.DefaultView;

lbTimes.Text = dt.Rows.Count.ToString();

string str1 ="select sum(shoppingMoney) from vipShoppingRecord";

OleDbDataAdapter da1 = new OleDbDataAdapter(str1, conStr);

DataTable dt1 = new DataTable();

da1.Fill(dt1);

lbTotal.Text = dt1.Rows[0][0].ToString() + "";

}

}

5)报表部分代码

public FrmShoppingReport()

{ InitializeComponent(); }

/// 消费记录报表

private void crystalReportViewer1_Load(object sender, EventArgs e)

{

shoppingReport1.Load(@"..\..\ShoppingReport.rpt");

crystalReportViewer1.ReportSource = shoppingReport1;

}

public frmVipRecord()

{InitializeComponent(); }

/// 会员情况报表

private void crystalReportViewer1_Load(object sender, EventArgs e)

{

vipLevelReport1.Load(@"..\..\VipLevelReport.rpt");

4.5实验小结

这个系统可以分为数据层、在其上分为会员管理部分、消费管理、商品管理、报表等几个模块。功能清晰,便于维护,虽然比较简单但是实现了要求的功能,可以有用户注册,角色的访问控制,信息修改。我们主要遇到的问题就是在数据库的制作以及程序和数据库的连接。通过这些的学习我们对于access数据库以及可视化编程有了进一步的交接和加深,对以后的学习和工作都有很大的帮助。忽略此处..

本文来源:https://www.2haoxitong.net/k/doc/d63dee11b80d6c85ec3a87c24028915f804d841c.html

《信息安全综合实践.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式