`

JSSE学习

阅读更多
JSSE封装了底层复杂的安全通信细节,使得开发人员方便的利用它来开发网络应用程序。

JSSE 包括以下4个包

javax.net.ssl:包括进行安全通信的类  如 SSLServerSocket SSLSocket
javax.net    :包括安全套接字的工厂类,如 SSLServerSocketFactory
javax.security.cert包 :包括处理安全证书的类,如X509certificate
com.sun.net.ssl 包括sun公司制定的jsse的实现类。

加密套件包括一组加密参数,这些参数制定了加密算法和密钥的长度等信息。
加密套件的名字包括4个部分 : 协议 ,密钥交换算法 加密算法 校验和。

创建socket 代码 如下:
  String host = "";
       int port = 443 ;

       SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();

        try {
            SSLSocket socket =  (SSLSocket)factory.createSocket(host, port);

        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }



KeyStore ,KeyManager 与 TrustManager
在进行安全通信时 , 要求客户端与服务端都支持SSL或TCP协议。客户端与服务端可能都需要设置用户证实自己身份的安全证书 ,还要设置信任对方的安全证书。更常见的是:服务端之需要设置用于证实自身身份的安全证书。而客户端只需要设置用于证实自身身份的安全证书。
KeyStore主要用于存放安全证书:
 KeyStore ks = KeyStore.getInstance(ksType);
 ks.load(cert, password.toCharArray());

// Get a KeyManager and initialize it 选择用户证实自身身份的安全证书,把它发给对方
KeyManagerFactory kmf = KeyManagerFactory.getInstance(ksAlgorithm);
 kmf.init(ks, password.toCharArray());

// Get a TrustManagerFactory and init with KeyStore 决定是否信任对方的安全证书
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(ksAlgorithm);
            tmf.init(ks);

// Get the SSLContext to help create SSLSocketFactory
SSLContext sslc = SSLContext.getInstance("TLS");
sslc.init(kmf.getKeyManagers(), null, null);


SSLContext类负责设置与安全通信有关的各种信息 ,比如使用的协议 SSL或者TLS,自身的证书以及对方的安全证书。
以下的代码创建并初始化了一个SSLContext对象,然后由它创建了一个SSLServerSocketFactory对象
SSLContext sslCtx = SSLContext.getInstance("TLS"); //采用TLS协议
sslCtx.init(kmf.getkeyManagers(),tmf.getTrustManagers(),null);
SSLServerSocketFactory ssf = sslCtx.getServerSocketFactory():


管理SSL会话:
一个客户程序可能会向一个服务器的同一个端口打开多个安全套接字,如果对于每一个安全连接都进行SSL握手,这个会大大降低通信效率。

之所以说这个是因为用到了苹果推送的数据结构 如下:





说明:
数据字节顺序(big endian和little endian)
到字节顺序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?

     其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。

     用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

Big Endian

   低地址                                            高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     12     |      34    |     56      |     78    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

   低地址                                            高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     78     |      56    |     34      |     12    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

     从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。而little endian,!@#$%^&*,见鬼去吧 -_-|||

     为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。

     无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。

               big endian:最高字节在地址最低位,最低字节在地址最高位,依次排列。
               little endian:最低字节在最低位,最高字节在最高位,反序排列。

     一个例子:
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
                big-endian     little-endian
0x0000     0x12              0xcd
0x0001     0x34              0xab
0x0002     0xab              0x34
0x0003     0xcd              0x12

     处理字符串的时候,涉及编码问题。我们常用的unicode的UCS2中就有big-endian和little-endian区分。此编码方式规定了字符串在内存的字节序。因此,在C++代码和Java代码处理字符串的时候,对于已经规定了字节序的字符串就不用处理了,只要都按照字符串的字节序解析就可以正确处理字符串。

      ANSI规定的编码,如GB2312字符集的DBCS编码中,GB内码的存储格式始终是big endian,即高位在前。还有UTF-8编码,根据遇到第一个字节的1的个数可以判断后面是否有字节属于当前字符编码,也解决了字节序问题。

    因此,对于字符串的处理,具体字节序由编码已经规定了,不同编码字节序有所不同,使用的时候只要根据字节序编码规则就可以正确的处理字符串了。


  • 大小: 75.5 KB
分享到:
评论

相关推荐

    java keytool安全证书学习

    JSSE(Java Security Socket Extension) 是Sun为了解决在Internet上的实现安全信息传输的解决方案。它实现了SSL和TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过...

    Java Web Service 程序例子

    Java Web Service 学习例子,里面有大量用来开发web services的Java程序示例,非常值得学习。 使用到的技术及工具如下: Apache: www.apache.org and xml.apache.org -- Ant 1.4.1 -- SOAP 2.2 -- Tomcat 3.2...

    java网络编程

    本书展示了如何使用JSSE编写安全的网络应用程序,解释了如何使用NIO API编写超高性能的服务器。它还涵盖了Java对网络代理、Web cookie和URL缓存的支持。 《Java网络编程》不仅仅是对API的解释:它还展示了如何使用...

    网络编程经典书籍

    本书展示了如何使用JSSE编写安全的网络应用程序,解释了如何使用NIO API编写超高性能的服务器,它还涵盖了Java对网络代理、Web cookie和URL缓存的支持。 《Java网络编程》不仅仅是对API的解释:它还展示了如何使用...

    Java Network Programming 网络编程

    本书展示了如何使用JSSE编写安全的网络应用程序,解释了如何使用NIO API编写超高性能的服务器。它还涵盖了Java对网络代理、Web cookie和URL缓存的支持。 《Java网络编程》不仅仅是对API的解释:它还展示了如何使用...

    Java网络编程(第三版)中文版.part01.rar

    本书展示了如何使用jsse编写安全的网络应用程序,解释了如何使用nio api编写超高性能的服务器。它还涵盖了java对网络代理、web cookie和url缓存的支持。  《java网络编程》不仅仅是对api的解释:它还展示了如何使用...

    Java网络编程(第3版) 中文版

    本书展示了如何使用JSSE编写安全的网络应用程序,解释了如何使用NIO API编写超高性能的服务器。它还涵盖了Java对网络代理、Web cookie和URL缓存的支持。 《Java网络编程》不仅仅是对API的解释:它还展示了如何使用...

    Java网络编程(第3版) 中文版 文件2

    本书展示了如何使用JSSE编写安全的网络应用程序,解释了如何使用NIO API编写超高性能的服务器。它还涵盖了Java对网络代理、Web cookie和URL缓存的支持。 《Java网络编程》不仅仅是对API的解释:它还展示了如何使用...

    Java网络编程(第三版)中文版.part11.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

    Java网络编程(第三版)高清中文版.part01.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

    Java网络编程(第三版)中文版.part06.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

    Java网络编程(第三版)中文版.part07.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

    Java网络编程(第三版)中文版.part09.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

    Java网络编程(第三版)中文版.part03.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

    Java网络编程(第三版)中文版.part04.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

    Java网络编程(第三版)中文版.part02.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

    Java网络编程(第三版)中文版.part05.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

    Java网络编程(第三版)中文版.part10.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

    Java网络编程(第三版)中文版.part13.rar

    无论是希望编写特殊用途的web服务器、安全的在线订单接收程序、简单的组播代理还是电子邮件客户端,都会找到可供学习和借用的代码。 本书适合熟悉Java语言的读者的编程人员和计算机专业的学生阅读。 前言 1 第一章...

Global site tag (gtag.js) - Google Analytics