默认
打赏 发表评论 6
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
传输层安全协议SSL/TLS的Java平台实现简介和Demo演示
阅读(86821) | 评论(6 收藏3 淘帖1 1
微信扫一扫关注!

前言


通信安全是互联网应用首要考虑的问题,有别于传统PC应用,随着移动互联网时代的到来,移动端的通信安全性要同时权衡:安全、性能、体验、数据流量等等方面。即时通讯应用作为深刻改变互联网使用者生活的重要技术形态之一,通信安全显的尤为重要,SSL/TLS作为主流的即时通讯传输层安全方案,值得相关开发者学习和掌握。本文将简要介绍Java平台的SSL/TLS实现并以Demo示例的方式予以讲解。

另外,基于TLS 1.3的微信新一代通信安全协议mmtls的实现思路详见《微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解》。更多即时通讯开发安全性方面的资料,请见:http://www.52im.net/forum.php?mod=collection&action=view&ctid=6

前言


在人类建立了通信系统之后,如何保证通信的安全始终是一个重要的问题。伴随着现代化通信系统的建立,人们利用数学理论找到了一些行之有效的方法来保证数字通信的安全。简单来说就是把两方通信的过程进行保密处理,比如对双方通信的内容进行加密,这样就可以有效防止偷听者轻易截获通信的内容。

目前 SSL(Secure Sockets Layer) 及其后续版本 TLS(Transport Layer Security)是比较成熟的通信加密协议,它们常被用于在客户端和服务器之间建立加密通信通道。各种开发语言都给出 SSL/TLS 协议的具体实现,Java 也不例外。

在 JDK 中有一个 JSSE(javax.net.ssl)包,提供了对 SSL 和 TLS 的支持。通过其所提供的一系列 API,开发者可以像使用普通 Socket 一样使用基于 SSL 或 TLS 的安全套接字,而不用关心 SSL 和 TLS 协议的细节,例如握手的流程等等。这使得利用 Java 开发安全的 SSL/TLS 服务器或客户端非常容易,本文将通过具体的例子来说明如何用 Java 语言来开发 SSL/TLS 应用。

SSL/TLS 协议的介绍


1基本介绍


SSL/TLS 协议(RFC2246 RFC4346)处于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。

从协议内部的功能层面上来看,SSL/TLS 协议可分为两层:

  • SSL/TLS 记录协议(SSL/TLS Record Protocol):它建立在可靠的传输层协议(如 TCP)之上,为上层协议提供数据封装、压缩、加密等基本功能。
  • SSL/TLS 握手协议(SSL/TLS Handshake Protocol):它建立在 SSL/TLS 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等初始化协商功能。

从协议使用方式来看,又可以分成两种类型:

  • SSL/TLS 单向认证:就是用户到服务器之间只存在单方面的认证,即客户端会认证服务器端身份,而服务器端不会去对客户端身份进行验证。首先,客户端发起握手请求,服务器收到握手请求后,会选择适合双方的协议版本和加密方式。然后,再将协商的结果和服务器端的公钥一起发送给客户端。客户端利用服务器端的公钥,对要发送的数据进行加密,并发送给服务器端。服务器端收到后,会用本地私钥对收到的客户端加密数据进行解密。然后,通讯双方都会使用这些数据来产生双方之间通讯的加密密钥。接下来,双方就可以开始安全通讯过程了。
  • SSL/TLS 双向认证:就是双方都会互相认证,也就是两者之间将会交换证书。基本的过程和单向认证完全一样,只是在协商阶段多了几个步骤。在服务器端将协商的结果和服务器端的公钥一起发送给客户端后,会请求客户端的证书,客户端则会将证书发送给服务器端。然后,在客户端给服务器端发送加密数据后,客户端会将私钥生成的数字签名发送给服务器端。而服务器端则会用客户端证书中的公钥来验证数字签名的合法性。建立握手之后过程则和单向通讯完全保持一致。

2交互流程


SSL/TLS 协议建立通讯的基本流程如下图所示:

传输层安全协议SSL/TLS的Java平台实现简介和Demo演示_image001.png

流程说明:

  • 步骤 1:ClientHello – 客户端发送所支持的 SSL/TLS 最高协议版本号和所支持的加密算法集合及压缩方法集合等信息给服务器端。
  • 步骤 2:ServerHello – 服务器端收到客户端信息后,选定双方都能够支持的 SSL/TLS 协议版本和加密方法及压缩方法,返回给客户端。
  • (可选)步骤 3:SendCertificate – 服务器端发送服务端证书给客户端。
  • (可选)步骤 4:RequestCertificate – 如果选择双向验证,服务器端向客户端请求客户端证书。
  • 步骤 5:ServerHelloDone – 服务器端通知客户端初始协商结束。
  • (可选)步骤 6:ResponseCertificate – 如果选择双向验证,客户端向服务器端发送客户端证书。
  • 步骤 7:ClientKeyExchange – 客户端使用服务器端的公钥,对客户端公钥和密钥种子进行加密,再发送给服务器端。
  • (可选)步骤 8:CertificateVerify – 如果选择双向验证,客户端用本地私钥生成数字签名,并发送给服务器端,让其通过收到的客户端公钥进行身份验证。
  • 步骤 9:CreateSecretKey – 通讯双方基于密钥种子等信息生成通讯密钥。
  • 步骤 10:ChangeCipherSpec – 客户端通知服务器端已将通讯方式切换到加密模式。
  • 步骤 11:Finished – 客户端做好加密通讯的准备。
  • 步骤 12:ChangeCipherSpec – 服务器端通知客户端已将通讯方式切换到加密模式。
  • 步骤 13:Finished – 服务器做好加密通讯的准备。
  • 步骤 14:Encrypted/DecryptedData – 双方使用客户端密钥,通过对称加密算法对通讯内容进行加密。
  • 步骤 15:ClosedConnection – 通讯结束后,任何一方发出断开 SSL 连接的消息。

3其它概念


除了以上的基本流程,SSL/TLS 协议本身还有一些概念需要在此解释说明一下。

Key:
Key 是一个比特(bit)字符串,用来加密解密数据的,就像是一把开锁的钥匙。

对称算法(symmetric cryptography):
就是需要双方使用一样的 key 来加密解密消息算法,常用密钥算法有 Data Encryption Standard(DES)、triple-strength DES(3DES)、Rivest Cipher 2 (RC2)和 Rivest Cipher 4(RC4)。因为对称算法效率相对较高,因此 SSL 会话中的敏感数据都用通过密钥算法加密。

非对称算法(asymmetric cryptography):
就是 key 的组成是公钥私钥对 (key-pair),公钥传递给对方私钥自己保留。公钥私钥算法是互逆的,一个用来加密,另一个可以解密。常用的算法有 Rivest Shamir Adleman(RSA)、Diffie-Hellman(DH)。非对称算法计算量大比较慢,因此仅适用于少量数据加密,如对密钥加密,而不适合大量数据的通讯加密。

公钥证书(public key certificate):
公钥证书类似数字护照,由受信机构颁发。受信组织的公钥证书就是 certificate authority(CA)。多证书可以连接成证书串,第一个是发送人,下一个是给其颁发证书实体,往上到根证书是世界范围受信组织,包括 VeriSign, Entrust, 和 GTE CyberTrust。公钥证书让非对称算法的公钥传递更安全,可以避免身份伪造,比如 C 创建了公钥私钥,对并冒充 A 将公钥传递给 B,这样 C 与 B 之间进行的通讯会让 B 误认是 A 与 B 之间通讯。

加密哈希功能(Cryptographic Hash Functions):
加密哈希功能与 checksum 功能相似。不同之处在于,checksum 用来侦测意外的数据变化而前者用来侦测故意的数据篡改。数据被哈希后产生一小串比特字符串,微小的数据改变将导致哈希串的变化。发送加密数据时,SSL 会使用加密哈希功能来确保数据一致性,用来阻止第三方破坏通讯数据完整性。SSL 常用的哈希算法有 Message Digest 5(MD5)和 Secure Hash Algorithm(SHA)。

消息认证码(Message Authentication Code):
消息认证码与加密哈希功能相似,除了它需要基于密钥。密钥信息与加密哈希功能产生的数据结合就是哈希消息认证码(HMAC)。如果 A 要确保给 B 发的消息不被 C 篡改,他要按如下步骤做 --A 首先要计算出一个 HMAC 值,将其添加到原始消息后面。用 A 与 B 之间通讯的密钥加密消息体,然后发送给 B。B 收到消息后用密钥解密,然后重新计算出一个 HMAC,来判断消息是否在传输中被篡改。SSL 用 HMAC 来保证数据传输的安全。

数字签名(Digital Signature):
一个消息的加密哈希被创建后,哈希值用发送者的私钥加密,加密的结果就是叫做数字签名。

JSSE(Java Secure Socket Extension)使用介绍


1理论基本


在 Java SDK 中有一个叫 JSSE(javax.net.ssl)包,这个包中提供了一些类来建立 SSL/TLS 连接。通过这些类,开发者就可以忽略复杂的协议建立流程,较为简单地在网络上建成安全的通讯通道。

JSSE 包中主要包括以下一些部分:

  • 安全套接字(secure socket)和安全服务器端套接字
  • 非阻塞式 SSL/TLS 数据处理引擎(SSLEngine)
  • 套接字创建工厂 , 用来产生 SSL 套接字和服务器端套接字
  • 套接字上下文 , 用来保存用于创建和数据引擎处理过程中的信息
  • 符合 X.509 规范密码匙和安全管理接口。

2Demo示例


下面将通过一个简单的例子来展示如何通过 JSSE,在客户端和服务器端建立一个 SSL/TLS 连接。设计两个类 SSLClient 和 SSLServer,分别来表示客户端和服务器端。客户端将会向服务器端发起连接请求,在通过服务器端验证建立 SSL 连接后,服务器端将会向客户端发送一串内容,客户端将会把收到的内容打印出来。

SSLClient Source code:
package example.ssl.codes; 

 import java.io.*; 
 import javax.net.ssl.SSLSocket; 
 import javax.net.ssl.SSLSocketFactory; 

 class SSLClient { 

 private SSLSocket socket = null; 

 public SSLClient() throws IOException { 
     // 通过套接字工厂,获取一个客户端套接字
     SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
     socket = (SSLSocket) socketFactory.createSocket("localhost", 7070); 
 } 

 public void connect() { 
         try { 
                 // 获取客户端套接字输出流
                 PrintWriter output = new PrintWriter( new OutputStreamWriter(socket.getOutputStream())); 
                  // 将用户名和密码通过输出流发送到服务器端
                 String userName = "principal"; 
                 output.println(userName); 
                 String password = "credential"; 
                 output.println(password); 
                 output.flush(); 
                
                 // 获取客户端套接字输入流
                 BufferedReader input = new BufferedReader( new InputStreamReader(socket.getInputStream())); 
                 // 从输入流中读取服务器端传送的数据内容,并打印出来
                 String response = input.readLine(); 
                 response += "\n " + input.readLine(); 
                 System.out.println(response); 
        
                 // 关闭流资源和套接字资源
                 output.close(); 
                 input.close(); 
                 socket.close(); 
         } catch (IOException ioException) { 
                 ioException.printStackTrace(); 
         } finally { 
                 System.exit(0); 
         } 
 } 

 public static void main(String args[]) throws IOException { 
         new SSLClient().connect(); 
 } 
 }

SSLServer Source code:
package example.ssl.codes; 

 import java.io.*; 
 import javax.net.ssl.SSLServerSocket; 
 import javax.net.ssl.SSLServerSocketFactory; 
 import javax.net.ssl.SSLSocket; 

 class SSLServer { 

 // 服务器端授权的用户名和密码
 private static final String USER_NAME = "principal"; 
 private static final String PASSWORD = "credential"; 
 // 服务器端保密内容
 private static final String SECRET_CONTENT = "This is confidential content from server X, for your eye!"; 

 private SSLServerSocket serverSocket = null; 

 public SSLServer() throws Exception { 
         // 通过套接字工厂,获取一个服务器端套接字
         SSLServerSocketFactory socketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); 
         serverSocket = (SSLServerSocket)socketFactory.createServerSocket(7070); 
 } 

 private void runServer() { 
         while (true) { 
                 try { 
                         System.out.println("Waiting for connection..."); 
                         // 服务器端套接字进入阻塞状态,等待来自客户端的连接请求
                         SSLSocket socket = (SSLSocket) serverSocket.accept(); 
                        
                         // 获取服务器端套接字输入流
                         BufferedReader input = new BufferedReader( new InputStreamReader(socket.getInputStream())); 
                         // 从输入流中读取客户端用户名和密码
                         String userName = input.readLine(); 
                         String password = input.readLine(); 
                        
                         // 获取服务器端套接字输出流
                         PrintWriter output = new PrintWriter( new OutputStreamWriter(socket.getOutputStream())); 

                         // 对请求进行认证,如果通过则将保密内容发送给客户端
                         if (userName.equals(USER_NAME) && password.equals(PASSWORD)) { 
                                 output.println("Welcome, " + userName); 
                                 output.println(SECRET_CONTENT); 
                         } else { 
                                 output.println("Authentication failed, you have no access to server X..."); 
                         } 
                
                         // 关闭流资源和套接字资源
                         output.close(); 
                         input.close(); 
                         socket.close(); 

                 } catch (IOException ioException) { 
                         ioException.printStackTrace(); 
                 } 
         } 
 } 

 public static void main(String args[]) throws Exception { 
         SSLServer server = new SSLServer(); 
         server.runServer(); 
 } 
 }

SSL 样例程序运行方法:
java -cp ./build/classes example.ssl.codes.SSLServer 
 java -cp ./build/classes example.ssl.codes.SSLClient

执行结果如下:
- 服务器端输出:
 Waiting for connection... 
 javax.net.ssl.SSLHandshakeException: no cipher suites in common 
 Waiting for connection... 
         at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
         at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1836) 
         at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276) 
         at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:266)

- 客户端输出:
javax.net.ssl.SSLException: Connection has been shutdown: 
     javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
         at sun.security.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1426) 
         at sun.security.ssl.AppInputStream.read(AppInputStream.java:92) 
         at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 
         at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 
         at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 
         at java.io.InputStreamReader.read(InputStreamReader.java:184) 
         at java.io.BufferedReader.fill(BufferedReader.java:154) 
         at java.io.BufferedReader.readLine(BufferedReader.java:317) 
         at java.io.BufferedReader.readLine(BufferedReader.java:382) 
         at example.ssl.codes.SSLClient.connect(SSLClient.java:29) 
         at example.ssl.codes.SSLClient.main(SSLClient.java:44) 
 Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
         at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
         at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 
         at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1911) 
         at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1027) 
         at sun.security.ssl.SSLSocketImpl.performInitialHandshake 
         (SSLSocketImpl.java:1262) 
         at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:680) 
         at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:85) 
         at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) 
         at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291) 
         at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295) 
         at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141) 
         at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229) 
         at java.io.PrintWriter.flush(PrintWriter.java:320) 
         at example.ssl.codes.SSLClient.connect(SSLClient.java:25) 
         ... 1 more

通过程序的错误输出,我们能够发现 SSL 建立失败了,在握手阶段双方没有能够协商出加密方法等信息。这是因为默认情况下,java 虚拟机没有与 SSL 相关的配置,需要开发者自己按照文档进行一些配置。
具体方法详见下一节。

3SSL/TLS正常运行需的安全配置


在 JDK 中提供了一个安全钥匙与证书的管理工具 Keytool。Keytool 把钥匙,证书以及和与它们相关联的证书链储存到一个 keystore 中,默任的实现 keystore 的是一个文件,它本身有一个访问密码来保护存储在其中的内容。就本样例程序而言,只需要配置客户端和服务器端双方信任就可以了。

可以按照如下几步来完成:

1. 进入本地的 java 安装位置的 bin 目录中 cd /java/bin;

2. 创建一个客户端 keystore 文件,如下图所示:
keytool -genkey -alias sslclient -keystore sslclientkeys
传输层安全协议SSL/TLS的Java平台实现简介和Demo演示_1.png

3. 将客户端 keystore 文件导出成证书格式:
keytool -export -alias sslclient -keystore sslclientkeys -file sslclient.cer

4. 创建一个服务器端 keystore 文件:
keytool -genkey -alias sslserver -keystore sslserverkeys

5. 将服务器端 keystore 文件导出成证书格式:
keytool -export -alias sslserver -keystore sslserverkeys -file sslserver.cer

6. 将客户端证书导入到服务器端受信任的 keystore 中:
keytool -import -alias sslclient -keystore sslservertrust -file sslclient.cer

7. 将服务器端证书导入到客户端受信任的 keystore 中:
keytool -import -alias sslserver -keystore sslclienttrust -file sslserver.cer

X. 以上所有步骤都完成后,还可以通过命令来查看 keystore 文件基本信息,如下图所示:
keytool -list -keystore sslclienttrust
传输层安全协议SSL/TLS的Java平台实现简介和Demo演示_3.png

4重新运行示例


将前面创建的所有 keystore 文件从 java 的 bin 目录中剪切出来,移动到样例程序的执行目录中,通过运行程序时候的系统属性来指定这些文件,重新执行一遍样例程序。
java -cp ./build/classes 
      -Djavax.net.ssl.keyStore=sslserverkeys 
      -Djavax.net.ssl.keyStorePassword=123456 
      -Djavax.net.ssl.trustStore=sslservertrust 
      -Djavax.net.ssl.trustStorePassword=123456 
  example.ssl.codes.SSLServer 
  java -cp ./build/classes 
      -Djavax.net.ssl.keyStore=sslclientkeys 
      -Djavax.net.ssl.keyStorePassword=123456 
      -Djavax.net.ssl.trustStore=sslclienttrust          
      -Djavax.net.ssl.trustStorePassword=123456 
  example.ssl.codes.SSLClient

执行结果如下:
- 客户端输出
Welcome, principal 
This is confidential content from server X, for your eye!
客户端与服务器端成功建立起 SSL 的连接,然后服务器端成功将字符串发送给客户端,客户端将其打印出来。

参考资料


[1] TLS 维基百科:关于 TLS 协议的描述。
[2] JSSE 技术介绍:关于 java 安全技术的基本介绍。
[3] JSSE 使用说明:关于 JSSE 使用的介绍。

全站即时通讯技术资料分类


[1] 网络编程基础资料:
TCP/IP详解 - 第11章·UDP:用户数据报协议
TCP/IP详解 - 第17章·TCP:传输控制协议
TCP/IP详解 - 第18章·TCP连接的建立与终止
TCP/IP详解 - 第21章·TCP的超时与重传
理论经典:TCP协议的3次握手与4次挥手过程详解
理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程
计算机网络通讯协议关系图(中文珍藏版)
NAT详解:基本原理、穿越技术(P2P打洞)、端口老化等
UDP中一个包的大小最大能多大?
Java新一代网络编程模型AIO原理及Linux系统AIO介绍
NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
>> 更多同类文章 ……

[2] 有关IM/推送的通信格式、协议的选择:
为什么QQ用的是UDP协议而不是TCP协议?
移动端即时通讯协议选择:UDP还是TCP?
如何选择即时通讯应用的数据传输格式
强列建议将Protobuf作为你的即时通讯应用数据传输格式
移动端IM开发需要面对的技术问题(含通信协议选择)
简述移动端IM开发的那些坑:架构设计、通信协议和客户端
理论联系实际:一套典型的IM通信协议设计详解
58到家实时消息系统的协议设计等技术实践分享
>> 更多同类文章 ……

[3] 有关IM/推送的心跳保活处理:
Android进程保活详解:一篇文章解决你的所有疑问
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
为何基于TCP协议的移动端IM仍然需要心跳保活机制?
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)
微信团队原创分享:Android版微信后台保活实战分享(网络保活篇)
移动端IM实践:实现Android版微信的智能心跳机制
移动端IM实践:WhatsApp、Line、微信的心跳策略分析
>> 更多同类文章 ……

[4] 有关WEB端即时通讯开发:
新手入门贴:史上最全Web端即时通讯技术原理详解
Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
SSE技术详解:一种全新的HTML5服务器推送事件技术
Comet技术详解:基于HTTP长连接的Web端实时通信技术
WebSocket详解(一):初步认识WebSocket技术
socket.io实现消息推送的一点实践及思路
>> 更多同类文章 ……

[5] 有关IM架构设计:
浅谈IM系统的架构设计
简述移动端IM开发的那些坑:架构设计、通信协议和客户端
一套原创分布式即时通讯(IM)系统理论架构方案
从零到卓越:京东客服即时通讯系统的技术架构演进历程
蘑菇街即时通讯/IM服务器开发之架构选择
腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT
微信技术总监谈架构:微信之道——大道至简(演讲全文)
如何解读《微信技术总监谈架构:微信之道——大道至简》
快速裂变:见证微信强大后台架构从0到1的演进历程(一)
17年的实践:腾讯海量产品的技术方法论
>> 更多同类文章 ……

[6] 有关IM安全的文章:
即时通讯安全篇(一):正确地理解和使用Android端加密算法
即时通讯安全篇(二):探讨组合加密算法在IM中的应用
即时通讯安全篇(三):常用加解密算法与通讯安全讲解
即时通讯安全篇(四):实例分析Android中密钥硬编码的风险
传输层安全协议SSL/TLS的Java平台实现简介和Demo演示
理论联系实际:一套典型的IM通信协议设计详解(含安全层设计)
微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解
来自阿里OpenIM:打造安全可靠即时通讯服务的技术实践分享
>> 更多同类文章 ……

[7] 有关实时音视频开发:
即时通讯音视频开发(一):视频编解码之理论概述
即时通讯音视频开发(二):视频编解码之数字视频介绍
即时通讯音视频开发(三):视频编解码之编码基础
即时通讯音视频开发(四):视频编解码之预测技术介绍
即时通讯音视频开发(五):认识主流视频编码技术H.264
即时通讯音视频开发(六):如何开始音频编解码技术的学习
即时通讯音视频开发(七):音频基础及编码原理入门
即时通讯音视频开发(八):常见的实时语音通讯编码标准
即时通讯音视频开发(九):实时语音通讯的回音及回音消除概述
即时通讯音视频开发(十):实时语音通讯的回音消除技术详解
即时通讯音视频开发(十一):实时语音通讯丢包补偿技术详解
即时通讯音视频开发(十二):多人实时音视频聊天架构探讨
即时通讯音视频开发(十三):实时视频编码H.264的特点与优势
即时通讯音视频开发(十四):实时音视频数据传输协议介绍
即时通讯音视频开发(十五):聊聊P2P与实时音视频的应用情况
即时通讯音视频开发(十六):移动端实时音视频开发的几个建议
即时通讯音视频开发(十七):视频编码H.264、V8的前世今生
简述开源实时音视频技术WebRTC的优缺点
良心分享:WebRTC 零基础开发者教程(中文)
>> 更多同类文章 ……

[8] IM开发综合文章:
移动端IM开发需要面对的技术问题
开发IM是自己设计协议用字节流好还是字符流好?
请问有人知道语音留言聊天的主流实现方式吗?
IM系统中如何保证消息的可靠投递(即QoS机制)
谈谈移动端 IM 开发中登录请求的优化
完全自已开发的IM该如何设计“失败重试”机制?
微信对网络影响的技术试验及分析(论文全文)
即时通讯系统的原理、技术和应用(技术论文)
开源IM工程“蘑菇街TeamTalk”的现状:一场有始无终的开源秀
>> 更多同类文章 ……

[9] 开源移动端IM技术框架资料:
开源移动端IM技术框架MobileIMSDK:快速入门
开源移动端IM技术框架MobileIMSDK:常见问题解答
开源移动端IM技术框架MobileIMSDK:压力测试报告
开源移动端IM技术框架MobileIMSDK:Android版Demo使用帮助
开源移动端IM技术框架MobileIMSDK:Java版Demo使用帮助
开源移动端IM技术框架MobileIMSDK:iOS版Demo使用帮助
开源移动端IM技术框架MobileIMSDK:Android客户端开发指南
开源移动端IM技术框架MobileIMSDK:Java客户端开发指南
开源移动端IM技术框架MobileIMSDK:iOS客户端开发指南
开源移动端IM技术框架MobileIMSDK:Server端开发指南
>> 更多同类文章 ……

[10] 有关推送技术的文章:
iOS的推送服务APNs详解:设计思路、技术原理及缺陷等
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
扫盲贴:认识MQTT通信协议
一个基于MQTT通信协议的完整Android推送Demo
求教android消息推送:GCM、XMPP、MQTT三种方案的优劣
移动端实时消息推送技术浅析
扫盲贴:浅谈iOS和Android后台实时消息推送的原理和区别
绝对干货:基于Netty实现海量接入的推送服务技术要点
移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)
为何微信、QQ这样的IM工具不使用GCM服务推送消息?
>> 更多同类文章 ……

[11] 更多即时通讯技术好文分类:
http://www.52im.net/forum.php?mod=collection&op=all

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:通信安全
上一篇:Java新一代网络编程模型AIO原理及Linux系统AIO介绍下一篇:详解Netty的优雅退出机制和原理

本帖已收录至以下技术专辑

推荐方案
评论 6
我大QQ据说传输层安全协议也都是用的TLS
签名: 国庆长假还没有缓过来,请让我静一静,产品狗死远点...
学习了,受教了
签名: 来看看啊
不错
签名: 心情好
我想问个问题就是在传输层使用了SSL进行数据通道加密 是否还需要在应用层再进行加密呢?
引用:登至必极 发表于 2019-07-17 19:53
我想问个问题就是在传输层使用了SSL进行数据通道加密 是否还需要在应用层再进行加密呢?

应用层再加密,那就叫E2EE(端到端加密了),具体你可以去了解一下。端到端加密,那是用在强安全场合下。telegram据说做到了端到端加密
引用:JackJiang 发表于 2019-07-17 22:05
应用层再加密,那就叫E2EE(端到端加密了),具体你可以去了解一下。端到端加密,那是用在强安全场合下。 ...

嗯嗯 好的
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部