`

Socket实战之五 使用加密协议传输对象

    博客分类:
  • J2SE
阅读更多
http://blog.csdn.net/kongxx/article/details/7259837
前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密传输的数据,此时就需要用到SSLSocket了。

还是一样需要一个实现了java.io.Serializable接口的简单Java对象
[java] view plaincopyprint?
package com.googlecode.garbagecan.test.socket.ssl; 
 
public class User implements java.io.Serializable { 
    private static final long serialVersionUID = 1L; 
    private String name; 
    private String password; 
 
    public User() { 
         
    } 
     
    public User(String name, String password) { 
        this.name = name; 
        this.password = password; 
    } 
     
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    public String getPassword() { 
        return password; 
    } 
 
    public void setPassword(String password) { 
        this.password = password; 
    } 
     

SSL Server类,这里需要用到ServerSocketFactory类来创建SSLServerSocket类实例,然后在通过SSLServerSocket来获取SSLSocket实例,这里考虑到面向对象中的面向接口编程的理念,所以代码中并没有出现SSLServerSocket和SSLSocket,而是用了他们的父类ServerSocket和Socket。在获取到ServerSocket和Socket实例以后,剩下的代码就和不使用加密方式一样了。
[java] view plaincopyprint?
package com.googlecode.garbagecan.test.socket.ssl; 
 
import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
 
import javax.net.ServerSocketFactory; 
import javax.net.ssl.SSLServerSocketFactory; 
 
public class MyServer { 
     
    private final static Logger logger = Logger.getLogger(MyServer.class.getName()); 
     
    public static void main(String[] args) { 
        try { 
            ServerSocketFactory factory = SSLServerSocketFactory.getDefault(); 
            ServerSocket server = factory.createServerSocket(10000); 
             
            while (true) { 
                Socket socket = server.accept(); 
                invoke(socket); 
            } 
        } catch (Exception ex) { 
            ex.printStackTrace(); 
        } 
    } 
     
    private static void invoke(final Socket socket) throws IOException { 
        new Thread(new Runnable() { 
            public void run() { 
                ObjectInputStream is = null; 
                ObjectOutputStream os = null; 
                try { 
                    is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream())); 
                    os = new ObjectOutputStream(socket.getOutputStream()); 
 
                    Object obj = is.readObject(); 
                    User user = (User)obj; 
                    System.out.println("user: " + user.getName() + "/" + user.getPassword()); 
 
                    user.setName(user.getName() + "_new"); 
                    user.setPassword(user.getPassword() + "_new"); 
 
                    os.writeObject(user); 
                    os.flush(); 
                } catch (IOException ex) { 
                    logger.log(Level.SEVERE, null, ex); 
                } catch(ClassNotFoundException ex) { 
                    logger.log(Level.SEVERE, null, ex); 
                } finally { 
                    try { 
                        is.close(); 
                    } catch(Exception ex) {} 
                    try { 
                        os.close(); 
                    } catch(Exception ex) {} 
                    try { 
                        socket.close(); 
                    } catch(Exception ex) {} 
                } 
            } 
        }).start(); 
    } 

SSL Client类和SSL Server类类似,只是将其中获取Socket的方式有所变化,其余的代码也和不使用加密方式一样。
[java] view plaincopyprint?
package com.googlecode.garbagecan.test.socket.ssl; 
 
import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
 
import javax.net.SocketFactory; 
import javax.net.ssl.SSLSocketFactory; 
 
public class MyClient { 
     
private final static Logger logger = Logger.getLogger(MyClient.class.getName()); 
 
    public static void main(String[] args) throws Exception { 
        for (int i = 0; i < 100; i++) { 
            Socket socket = null; 
            ObjectOutputStream os = null; 
            ObjectInputStream is = null; 
             
            try { 
                SocketFactory factory = SSLSocketFactory.getDefault(); 
                socket = factory.createSocket("localhost", 10000); 
     
                os = new ObjectOutputStream(socket.getOutputStream()); 
                User user = new User("user_" + i, "password_" + i); 
                os.writeObject(user); 
                os.flush(); 
                 
                is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream())); 
                Object obj = is.readObject(); 
                if (obj != null) { 
                    user = (User)obj; 
                    System.out.println("user: " + user.getName() + "/" + user.getPassword()); 
                } 
            } catch(IOException ex) { 
                logger.log(Level.SEVERE, null, ex); 
            } finally { 
                try { 
                    is.close(); 
                } catch(Exception ex) {} 
                try { 
                    os.close(); 
                } catch(Exception ex) {} 
                try { 
                    socket.close(); 
                } catch(Exception ex) {} 
            } 
        } 
    } 

代码写完了,下面就需要产生keystore文件了,运行下面的命令
[plain] view plaincopyprint?
keytool -genkey -alias mysocket -keyalg RSA -keystore mysocket.jks 
在提示输入项中,密码项自己给定,其它都不改直接回车,这里我使用的密码是“mysocket”。
运行Server

[plain] view plaincopyprint?
java -Djavax.net.ssl.keyStore=mysocket.jks -Djavax.net.ssl.keyStorePassword=mysocket com.googlecode.garbagecan.test.socket.ssl.MyServer 
运行Client
[plain] view plaincopyprint?
java -Djavax.net.ssl.trustStore=mysocket.jks  -Djavax.net.ssl.trustStorePassword=mysocket com.googlecode.garbagecan.test.socket.ssl.MyClient 
分享到:
评论

相关推荐

    实战SSL加密

    SSL在客户和服务器之间建立一条加密通道,确保所传输的数据不被非法窃取,SSL安全加密机制功能是依靠使用数字证书来实现的。本文以Windows Server 2003(简称Windows 2003)系统为例,介绍如何在IIS6服务器中应用SSL...

    c# 加密和解密相关代码

    现在来了解一下使用“异或”加密或解密的执行过程,数值23 转换为二进制为10111,加密数字的数值15 转换为二进制为1111。对比两个二进制的值,从右向左按位对比,如果两个二进制数的相应位都为1 或两个二 进制数的...

    亮剑.NET深入体验与实战精要3

    7.9.2 采用SSL实现加密传输 302 7.9.3 访问IP限制 315 7.10 Web Service开发中需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1...

    亮剑.NET深入体验与实战精要2

    7.9.2 采用SSL实现加密传输 302 7.9.3 访问IP限制 315 7.10 Web Service开发中需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1...

    python入门到高级全栈工程师培训 第3期 附课件代码

    03 ORM多表操作之一对多查询之对象查询 04 ORM多表操作之一对多查询之双下划线查询 05 ORM多表操作之多对多添加记录 06 ORM多表操作之多对多查询 07 ORM多表操作之F查询与Q查询 08 ORM的querySet集合对象的特性 第...

    寒江独钓-Windows内核安全编程(高清完整版).part1

    1.3.6 实战调试first 14 练习题 16 第2章 内核编程环境及其特殊性 17 2.1 内核编程的环境 18 2.1.1 隔离的应用程序 18 2.1.2 共享的内核空间 19 2.1.3 无处不在的内核模块 20 2.2 数据类型 21 2.2.1 基本数据类型 21...

    寒江独钓-Windows内核安全编程(高清完整版).part7

    1.3.6 实战调试first 14 练习题 16 第2章 内核编程环境及其特殊性 17 2.1 内核编程的环境 18 2.1.1 隔离的应用程序 18 2.1.2 共享的内核空间 19 2.1.3 无处不在的内核模块 20 2.2 数据类型 21 2.2.1 基本数据类型 21...

    寒江独钓-Windows内核安全编程(高清完整版).part2

    1.3.6 实战调试first 14 练习题 16 第2章 内核编程环境及其特殊性 17 2.1 内核编程的环境 18 2.1.1 隔离的应用程序 18 2.1.2 共享的内核空间 19 2.1.3 无处不在的内核模块 20 2.2 数据类型 21 2.2.1 基本数据类型 21...

    寒江独钓-Windows内核安全编程(高清完整版).part4

    1.3.6 实战调试first 14 练习题 16 第2章 内核编程环境及其特殊性 17 2.1 内核编程的环境 18 2.1.1 隔离的应用程序 18 2.1.2 共享的内核空间 19 2.1.3 无处不在的内核模块 20 2.2 数据类型 21 2.2.1 基本数据类型 21...

    寒江独钓-Windows内核安全编程(高清完整版).part6

    1.3.6 实战调试first 14 练习题 16 第2章 内核编程环境及其特殊性 17 2.1 内核编程的环境 18 2.1.1 隔离的应用程序 18 2.1.2 共享的内核空间 19 2.1.3 无处不在的内核模块 20 2.2 数据类型 21 2.2.1 基本数据类型 21...

    寒江独钓-Windows内核安全编程(高清完整版).part5

    1.3.6 实战调试first 14 练习题 16 第2章 内核编程环境及其特殊性 17 2.1 内核编程的环境 18 2.1.1 隔离的应用程序 18 2.1.2 共享的内核空间 19 2.1.3 无处不在的内核模块 20 2.2 数据类型 21 2.2.1 基本数据类型 21...

    寒江独钓-Windows内核安全编程(高清完整版).part3

    1.3.6 实战调试first 14 练习题 16 第2章 内核编程环境及其特殊性 17 2.1 内核编程的环境 18 2.1.1 隔离的应用程序 18 2.1.2 共享的内核空间 19 2.1.3 无处不在的内核模块 20 2.2 数据类型 21 2.2.1 基本数据类型 21...

    Windows内核安全与驱动开发光盘源码

    1.3.6 实战调试first 13 第2章 内核编程环境及其特殊性 16 2.1 内核编程的环境 16 2.1.1 隔离的应用程序 16 2.1.2 共享的内核空间 17 2.1.3 无处不在的内核模块 18 2.2 数据类型 19 2.2.1 基本数据类型 19 ...

    Windows内核安全驱动开发(随书光盘)

    1.3.6 实战调试first 13 第2章 内核编程环境及其特殊性 16 2.1 内核编程的环境 16 2.1.1 隔离的应用程序 16 2.1.2 共享的内核空间 17 2.1.3 无处不在的内核模块 18 2.2 数据类型 19 2.2.1 基本数据类型 19 ...

    Java毕业设计-基于JAVA的网络通讯系统设计与实现(论文+系统).rar

    * 深入分析了Java网络编程的关键技术,如Socket通信、多线程处理等,并通过实例进行了验证。 * 全面介绍了系统的架构设计、功能模块划分以及数据库设计,展现了系统的高度模块化与可扩展性。 * 对系统的实现过程进行...

Global site tag (gtag.js) - Google Analytics