![](/uploads/image/0512.jpg)
淮阴工学院
网络编程实验报告
项目名称: | 实验六 |
学 院:兰州经典一日游 | 计算机与软件工程学院 |
班 级: | |
学 号: | |
学生姓名: | |
指导老师: | 张秀芳 |
学年学期: 2020 ~ 2021 学年 第 1 学期 |
| |
2020年 11 月 162021年春节闹鬼 日
一、实验目的
2上海十大游乐园
、理解掌握安全登录的步骤与编程方法; 3、理解掌握安全注册的步骤与编程方法。
二、实验内容
1、进一步提高登录安全。为保障用户登录安全,采取了将用户密码用SHA-256算法加密传输的方式。
2、完成用户安全注册模块。用户单击“注册”按钮后,弹出注册界面对话框,填入必需的信
息后,完成注册,给出注册的结果提示。
三、工作原理
SSL/TLS协议可以有效防范网络数据交换过程中的攻击。SSL/TLS协议的基本原理是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。公钥加密需要解决两个重要问题: (1)保证公钥不被篡改。解决方法:通常将公钥放在数字证书中,只要证书是可信的,公钥就是可信的。
(2)公钥加密计算量太大,不适合加密大数据量内容。解决方法:每一次对话,客户端生成一个对称密钥,用对称密钥加密,运算速度会非常快。再用服务器公钥加密对称密钥,客户机将数据和加密的密钥一起发送给服务器。 原理图
四、运行结果
1、首先运行服务器程序,单击初始界面上的“启动服务器”按钮,服务器运行状态如图3.1所示。此时服务器工作与localhost主机的5杭州自由行五日游攻略0000端口,根据监控面板的提示,服务器此时处于侦听状态,等待新客户机的到来。
图3.1 服务器启动后的初始页面
2、下面启动客户机程序,在登录对话框中输入用户账号50000,输入密码123456,单击“登录”按钮,登录成功后的界面如图3.2所示。
图3.2 账号50000登录页面
用未注册的账号进行登录,服务器端并不到数据库查和验证用户名与密码,给出登录失败的消息如图3athens.3所示。
图3.3 未注册账号登录页面
4、接下来用账号50000像服务器发送一个文件,图3.5给出了客户机监控的文件发送过程和数字签名与密钥等信息,图3.6给出了服务器接收文件过程和解密过程。
图3.5 客户机发送SSL加密文件过程
图3.6 服务器接收文件过程和解密过程
图3.7最终结果图
五、源代码
1、服务器处理连接线程
private void btnStartActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
try {
//获取服务器工作地址端口
String Text();
int hostPort=Integer.Text());
//创建UDP数据报套接字,在指定端口侦听
DatagramSocket serverSocket=new DatagramSocket(hostPort);
txtArea.append("服务器开始侦听...\n");
//创建并启动UDP消息接收线程
意大利世界杯冠军 Thread recvThread=new ReceiveMessage(serverSocket,this);
recvThread.start();
//创建并启动文件接收线程
new Thread(new Runnable() {
public void run() {
try {
//获取证书库
InputStream key =ResourceAsStream("/cn/edu/ldu/keystore/server.keystore");//私钥库
InputStream tkey =ResourceAsStream("/cn/edu/ldu/keystore/tserver.keystore");//公钥库
String SERVER_KEY_STORE_PASSWORD = "123456"; //server.keystore密码
String SERVER_TRUST_KEY_STORE_PASSWORD = "123456";//tserver.keystore密码
SSLContext ctx = Instance("SSL");//SSL上下文
KeyManagerFactory kmf = Instance("SunX509");
TrustManagerFactory tmf = Instance("SunX509");
KeyStore ks = Instance("JKS");
KeyStore tks = Instance("JKS");
//加载私钥证书库
ks.load(key, SERVER_KEY_CharArray());
//加载公钥证书库
tks.load(tkey, SERVER_TRUST_KEY_CharArray());
kmf.init(ks, SERVER_KEY_CharArray());
tmf.init(tks);
ctx.KeyManagers(), TrustManagers(), null);
//服务器侦听安全连接
SSLServerSocket sslListenSocket = (SSLServerSocket) ServerSocketFactory().createServerSocket(hostPort);
int Runtime().availableProcessors();//CPU数
ExecutorService wFixedThreadPool(processors*2);//创建固定大小线程池
while (true) { //处理所有客户机连接
SSLSocket fileSocket=(SSLSocket)sslListenSocket.accept();//如果无连接,则阻塞,否则接受连接并创建新的会话套接字
//文件接收线程为SwingWorker类型的后台工作线程
SwingWorker<Integer,Object> recver=new RecvFile(fileSocket,ServerUI.this,tks,ks); //创建客户线程
ute(recver); //用线程池调度客户线程运行
}//end while
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, ex.getMessage(), "错误提示", JOptionPane.ERROR_MESSAGE);
}//end try catch
}//end run()
}).start();