`

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
分享到:
评论

相关推荐

    用JSSE定制SSL连接.docx

    通过本篇文章的学习,我们可以了解到JSSE是如何帮助开发者构建安全的网络应用的。从创建KeyStore和TrustStore文件,到编写客户端/服务器程序,每一个步骤都至关重要。希望读者能够掌握这些基础知识,并将其应用于...

    jsse-samples-guides.zip

    Java Secure Socket Extension (JSSE) 是Java平台中用于实现安全套接层(SSL)和传输层安全(TLS)协议的框架。本指南将深入探讨JSSE提供的功能、...同时,学习如何管理和配置SSL/TLS证书,以满足不同场景的安全要求。

    java的28个学习目标

    熟悉各种安全/认证API,如JAAS(Java Authentication and Authorization Service)、JCE(Java Cryptography Extension)、JSSE(Java Secure Socket Extension)、JGSS(Java General Security Service)。...

    学习java要达到的30个目标

    - **掌握安全相关的API和服务**:如JAAS(Java Authentication and Authorization Service)、JCE(Java Cryptography Extension)、JSSE(Java Secure Socket Extension)、JGSS(Java General Security Service)...

    学习JAVA的30个目标.doc

    了解JAAS、JCE、JSSE和JGSS等安全认证API。 7. **Servlets、JSP与Web框架**:掌握Servlet和JSP的生命周期,学习JSTL和其他第三方标签库。熟悉主流的Web框架,如JSF、Struts、Tapestry、Cocoon和WebWork,理解MVC...

    Java安全性.docx

    本教程讨论了 Java 平台的基本语言和库扩展对安全编程的支持,包括 Java 密码术扩展(Java Cryptography Extension,JCE)和 Java 安全套接字扩展(Java Secure Sockets Extension,JSSE)。 Java 安全性编程的基本...

    学习java的30个目标

    7. 安全性:学习Java的安全模型,包括类加载器、字节码验证、安全管理器、策略和权限、代码签名、数字签名、加密以及相关的安全API(JAAS, JCE, JSSE, JGSS)。 8. Web开发:掌握Servlets、JSP、JSTL和第三方标签库...

    学习java的30个步骤

    7. **安全与认证**:学习Java的安全模型,包括类加载器、字节码验证、策略和权限、代码签名、数字签名、加密、证书和Kerberos等,以及相关的API,如JAAS、JCE、JSSE和JGSS。 8. **Servlets、JSP与JSTL**:学习这些...

    java的30个学习目标

    学习Java的沙盒安全模型,包括类加载器、字节码验证、权限管理等,以及JAAS、JCE、JSSE、JGSS等安全认证API,对于保护应用程序免受攻击具有重要意义。 #### 九、Web开发技术栈 掌握Servlets、JSP、JSTL等Web开发...

    Java学习的30个目标

    学习Java安全性模型,包括类加载安全、字节码验证、安全管理策略、代码签名、数字签名、密码学、认证等,以及JAAS、JCE、JSSE等安全API的使用。 #### 8. Web应用开发:Servlets、JSP与JSTL 精通Servlets、JSP页面...

    个人学习Java安全的笔记.zip

    6. **Java Secure Socket Extension (JSSE)**:JSSE提供了实现安全网络通信的API,包括SSL/TLS协议,用于创建安全的HTTPS连接,保护数据的隐私。 7. **Java Cryptography Architecture (JCA)**:JCA是Java的加密...

    java网络程序设计学习实例

    - **JSSE(Java Secure Socket Extension)**:Java提供的安全套接层API,用于实现HTTPS和其他安全协议。 6. **Web服务器开发**: - **Servlet**:Java Web开发中的核心组件,用于处理HTTP请求并生成响应。 - **...

    学习Java语言的30个参考,让你坐拥别人之上的30个擦考

    - **安全服务**:熟悉JAAS、JCE、JSSE、JGSS等API,实现身份验证、授权、加密通信等功能。 ### 8. Web应用开发 - **Servlet技术**:了解Servlet生命周期、配置方法等。 - **JSP与JSTL**:学习使用JSP开发动态网页,...

    学习java的30个目标.txt

    - **API应用**:JAAS、JCE、JSSE、JGSS等API的使用。 #### 目标8:掌握Servlets、JSP及JSTL - **技术要点**:了解Servlet的工作原理,掌握JSP页面开发技巧,熟悉标准标签库(JSTL)的使用。 - **扩展应用**:学习...

    Java网络编程学习资料汇总

    此外,如果涉及到安全性,HTTPS(安全超文本传输协议)则是HTTP的安全版本,使用SSL/TLS协议加密数据传输,Java的JSSE(Java Secure Socket Extension)提供了支持。 在Java网络编程中,多线程也是必不可少的知识点...

    java学习中的一点忠告

    熟悉Java的安全模型,包括安全管理器、策略和权限、代码签名、数字签名、加密算法、证书验证、Kerberos等,以及Java的认证和授权服务(JAAS)、Java加密扩展(JCE)、Java安全套接字扩展(JSSE)和Java通用安全服务...

    Java学习的30个目标.txt

    - **加密技术**:熟悉Java提供的加密功能,如密码学扩展JCE、安全套接层JSSE等。 - **身份验证与授权服务**:了解Java Authentication and Authorization Service (JAAS) 的工作原理,掌握基于角色的访问控制(RBAC)...

    java学习目标

    学习Java安全模型,包括类加载器、字节码验证、策略和权限、代码签名、数字签名、加密算法、认证服务等,以及JAAS、JCE、JSSE、JGSS等API的使用,可以增强应用程序的安全防护能力。 #### 7. Web开发技术 深入学习...

Global site tag (gtag.js) - Google Analytics