精华内容
下载资源
问答
  • Netty数据传输

    千次阅读 2016-06-12 10:55:40
    网络应用程序一个很重要的工作是传输数据传输数据的过程不一样取决是使用哪种交通工具,但是传输的方式是一样的:都是以字节码传输。Java 开发网络程序传输数据的过程和方式是被抽象了的,我们不需要关注底层...

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。

    网络应用程序一个很重要的工作是传输数据。传输数据的过程不一样取决是使用哪种交通工具,但是传输的方式是一样的:都是以字节码传输。Java 开发网络程序传输数据的过程和方式是被抽象了的,我们不需要关注底层接口,只需要使用 Java API 或其他网络框架如 Netty 就能达到传输数据的目的。发送数据和接收数据都是字节码。Nothingmore,nothing less。

    Netty传输API
    传输 API 的核心是 Channel 接口,它用于所有出站的操作。Channel 接口的类层次结构如下:
    这里写图片描述

    如上图所示,每个 Channel 都会分配一个 ChannelPipeline 和 ChannelConfig。
    ChannelConfig 负责设置并存储配置,并允许在运行期间更新它们。传输一般有特定的配置设置,只作用于传输,没有其他的实现。ChannelPipeline 容纳了使用的 ChannelHandler实例,这些 ChannelHandler 将处理通道传递的“入站”和“出站”数据。
    ChannelHandler 的实现允许你改变数据状态和传输数据,ChannelHandler 是 Netty 的重点概念。

    现在我们可以使用 ChannelHandler 做下面一些事情:

    • 传输数据时,将数据从一种格式转换到另一种格式
    • 异常通知
    • Channel 变为有效或无效时获得通知
    • Channel 被注册或从 EventLoop 中注销时获得通知
    • 通知用户特定事件

    这些 ChannelHandler 实例添加到 ChannelPipeline 中,在 ChannelPipeline 中按顺序逐个执行。它类似于一个链条。
    ChannelPipeline 实现了拦截过滤器模式, 这意味着我们连接不同的 ChannelHandler来拦截并处理经过 ChannelPipeline 的数据或事件。可以把 ChannelPipeline 想象成 UNIX管道,它允许不同的命令链(ChannelHandler 相当于命令)。你还可以在运行时根据需要添加 ChannelHandler 实例到 ChannelPipeline 或从 ChannelPipeline 中删除,这能帮助我们构建高度灵活的 Netty 程序。此外,访问指定的 ChannelPipeline 和 ChannelConfig,你能在 Channel 自身上进行操作。Channel 提供了很多方法,如下列表:

    • eventLoop(),返回分配给 Channel 的 EventLoop
    • pipeline(),返回分配给 Channel 的 ChannelPipeline
    • isActive(),返回 Channel 是否激活,已激活说明与远程连接对等
    • localAddress(),返回已绑定的本地 SocketAddress
    • remoteAddress(),返回已绑定的远程 SocketAddress
    • write(),写数据到远程客户端,数据通过 ChannelPipeline 传输过去

    Netty 包含的传输实现

    Netty 自带了一些传输协议的实现,虽然没有支持所有的传输协议,但是其自带的已足够我们来使用。Netty 应用程序的传输协议依赖于底层协议,本节我们将学习 Netty 中的传输协议。

    Netty 中的传输方式有如下几种:

    • NIO,io.netty.channel.socket.nio,基于 java.nio.channels
      的工具包,使用选择器作为基础的方法。
    • OIO,io.netty.channel.socket.oio,基于 java.net 的工具包,使用阻塞流。
    • Local,io.netty.channel.local,用来在虚拟机之间本地通信。
    • Embedded,io.netty.channel.embedded,嵌入传输,它允许在没有真正网络的运输中使用 ChannelHandler,可以非常有用的来测试 ChannelHandler 的实现。

    NIO - Nonblocking I/O

    NIO 传输是目前最常用的方式, 它通过使用选择器提供了完全异步的方式操作所有的I/O,NIO 从 Java 1.4 才被提供。NIO 中,我们可以注册一个通道或获得某个通道的改变的状态,通道状态有下面几种改变:

    • 一个新的 Channel 被接受并已准备好
    • Channel 连接完成
    • Channel 中有数据并已准备好读取
    • Channel 发送数据出去

    处理完改变的状态后需重新设置他们的状态,用一个线程来检查是否有已准备好的Channel,如果有则执行相关事件。在这里可能只同时一个注册的事件而忽略其他的。选择器所支持的操作在 SelectionKey 中定义,具体如下:

    • OP_ACCEPT,有新连接时得到通知
    • OP_CONNECT,连接完成后得到通知
    • OP_READ,准备好读取数据时得到通知
    • OP_WRITE,写入数据到通道时得到通知

    Netty 中的 NIO 传输就是基于这样的模型来接收和发送数据,通过封装将自己的接口提供给用户使用,这完全隐藏了内部实现。如前面所说,Netty 隐藏内部的实现细节,将抽象出来的 API 暴露出来供使用,下面是处理流程图:
    这里写图片描述
    NIO 在处理过程也会有一定的延迟,若连接数不大的话,延迟一般在毫秒级,但是其吞吐量依然比 OIO 模式的要高。Netty 中的 NIO 传输是“zero-file-copy”,也就是零文件复制,这种机制可以让程序速度更快, 更高效的从文件系统中传输内容, 零复制就是我们的应用程序不会将发送的数据先复制到 JVM 堆栈在进行处理,而是直接从内核空间操作。接下来我
    们将讨论 OIO 传输,它是阻塞的。

    OIO - Old blocking I/O

    OIO 就是 java 中提供的 Socket 接口,java 最开始只提供了阻塞的 Socket,阻塞会导致程序性能低。下面是 OIO的处理流程图

    Local - In VM transport

    Netty 包含了本地传输,这个传输实现使用相同的 API 用于虚拟机之间的通信,传输是完全异步的。 每个 Channel 使用唯一的 SocketAddress, 客户端通过使用 SocketAddress进行连接,在服务器会被注册为长期运行,一旦通道关闭,它会自动注销,客户端无法再使用它。 连接到本地传输服务器的行为与其他的传输实现几乎是相同的, 需要注意的一个重点是只能在本地的服务器和客户端上使用它们。Local 未绑定任何 Socket,值提供 JVM 进程之间的通信。

    Embedded transport

    Netty 还包括嵌入传输, 与之前讲述的其他传输实现比较, 它是不是一个真的传输呢?若不是一个真的传输,我们用它可以做什么呢?Embedded transport 允许更容易的使用不同的 ChannelHandler 之间的交互,这也更容易嵌入到其他的 ChannelHandler 实例并像一个辅助类一样使用它们。它一般用来测试特定的 ChannelHandler 实现,也可以在ChannelHandler 中重新使用一些 ChannelHandler 来进行扩展,为了实现这样的目的,它 自带了一个具体的 Channel 实现,即:EmbeddedChannel。

    每种传输的使用时机

    • OIO,在低连接数、需要低延迟时、阻塞时使用
    • NIO,在高连接数时使用
    • Local,在同一个 JVM 内通信时使用
    • Embedded,测试 ChannelHandler 时使用
    展开全文
  • 蓝牙之数据传输问题

    万次阅读 2017-01-13 16:43:08
    蓝牙数据传输问题对于蓝牙来说google已经封装好了很多api所以使用起来并不会很难,但是实际开发中蓝牙开发最头疼的问题不是如何去调用api,而是数据的交互方面,如长连接,数据续传,硬件接受速率等问题.打开蓝牙有几种...

    蓝牙数据传输问题

    对于蓝牙来说google已经封装好了很多api所以使用起来并不会很难,但是实际开发中蓝牙开发最头疼的问题不是如何去调用api,而是数据的交互方面,如长连接,数据续传,硬件接受速率等问题.

    打开蓝牙有几种方式?

    首先我们先了解下几种常用的打开方式.

    • 第一种方法相对简单,直接调用系统对话框启动蓝牙:
      在AndroidManifest文件中添加需要的权限,高版本也不需要动态授权:
    <uses-permission android:name="android.permission.BLUETOOTH" />
    //处理回调对话框
    startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1);
    • 第二种方法,静默开启,不会有方法一的对话框:
      在AndroidManifest文件中添加需要的权限:
      • 在AndroidManifest中配置需要的权限.
      • 对于6.0的运行时权限进行适配,在java中动态授权.
      • 最后直接调api开启
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    mBluetoothAdapter.enable(); //开启
    //mBluetoothAdapter.disable(); //关闭

    如何搜索蓝牙设备?

    搜索分为:主动搜索和被动搜索。

    • 主动搜索
      • 创建BluetoothAdapter对象
      • 配对的蓝牙设备列表
      • 定义发送接收广播

    蓝牙的UUID是什么?有什么用?

    UUID(Universally Unique Identifier) 统一表示定义.
    蓝牙是通过串口发送AT命令,蓝牙默认是在数据模式的,要配置为AT命令模式,对其进行设置,不过UUID在出厂前是设置过的.
    对于蓝牙设备,每个服务都有一个与它对应的UUID(唯一的).
    如:
    信息同步服务:00001104-0000-1000-8000-00805F9B34FB
    文件传输服务:00001106-0000-1000-8000-00805F9B34FB

    如何使用蓝牙进行数据传输?

    蓝牙模块通信最重要的地方就是数据的发送和接收,其传输数据与Socket类似。

    • 在网络中使用Socket和ServerSocket控制客户端和服务端的数据读写。
    • 而蓝牙通讯也由客户端和服务端Socket来完成。蓝牙客户端Socket是BluetoothSocket,蓝牙服务端Socket是BluetoothServerSocket。这两个类都在android.bluetooth包中。
    • 无论是BluetoothSocket,还是BluetoothServerSocket,都需要一个UUID(全局唯一标识符,Universally Unique Identifier),UUID相当于Socket的端口,而蓝牙地址相当于Socket的IP。

    实际开发中需要注意的地方.

    需要注意的
    1. 因为涉及涉及到I/O编程,所以需要注意两端的编码’utf-8’要一致.
    2. 客户端与服务端的UUID也要相同.
    3. 蓝牙属于底层数据传输,所以实际开发更多发送的是16进制数据.
    4. 因为涉及到了I/O编程,所以对线程控制这块(同步,锁机制)需要注意使用.
    5. 对于一些大容量字节数组的发送需要注意的地方.
    6. 为了用户更好的体检避免流量的过度浪费,使用阻塞式的InputStream读取.

    1. 因为涉及涉及到I/O编程,所以需要注意两端的编码’utf-8’要一致.

    os.write("datas....".getBytes("utf-8"));

    2. 客户端与服务端的UUID也要相同.

    //客户端Socket
    device.createRfcommSocketToServiceRecord(MY_UUID);
    //服务端Socket
    mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);

    3. 蓝牙属于底层数据传输,所以实际开发更多发送的是16进制数据.

    public static String bytesToHexString(byte[] bytes) {
            String result = "";
            for (int i = 0; i < bytes.length; i++) {
                String hexString = Integer.toHexString(bytes[i] & 0xFF);
                if (hexString.length() == 1) {
                    hexString = '0' + hexString;
                }
                result += hexString.toUpperCase();
            }
            return result;
        }

    5. 对于一些大容量字节数组的发送需要注意的地方.

    我们需要发送64个字节的数组,如果一次性发送过去,单片机那里可能无法及时处理以致没有任何回应,因为单片机那里是设置了数据接收的延时时间。要想畅通的与蓝牙模块通信,考虑这个时间差非常重要。调整字节的发送速率,就成为非常关键的一步。值得注意的是,数据的发送是非常快的,就是因为这样才会导致单片机那里无法及时处理,所以,每次发送后的延时是非常重要的。我们单片机那里的延时是10毫秒,所以我们选择发送完每个字节后就延时10毫秒再发下个字节。

     for (byte b : bytes) {
         out.write(b);
         Thread.sleep(10);
     }

    6.为了用户更好的体检避免流量的过度浪费,使用阻塞式的InputStream读取.

    在使用InputStream的时候,必须注意,InputStream的读取是阻塞的。这点在一般的情况下是不会影响到我们的程序,但是记住这个情况对于代码的设计是非常重要的,尤其是在考虑用户体验的时候。
    无参数的read()是每次只从流中读取一个字节,这种做法效率非常低,但是简单,像是读取整数值这种情况,使用read()就非常好,但如果是16进制字符串呢?使用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,这样一次就能读取多个字节。
    如果是读取多个字节,我们常常使用InputStream.available()方法来获取数据流中可读字节的个数。读取本地数据的时候,该方法发挥得非常好,但如果是读取非本地数据,就可能出现字节遗漏的问题,像是要读取100个字节,可能就是90个,甚至是0个。
    出现0个的情况就是单片机那边没有响应或者字节还没发送过来,这时我们就需要一个循环来保证我们能够拿到数据:

      int count = 0;
      while (count == 0) {
       count = in.available();
      }
      byte[] bytes = new byte[count];
      in.read(bytes);
          但像是上面的90个字节的情况就是字节遗漏。对于这种情况,解决方法也很简单:
      byte[] bytes = new byte[count];
      int readCount = 0; // 已经成功读取的字节的个数
      while (readCount < count) {
       readCount += in.read(bytes, readCount, count - readCount);
      }

    部分内容参考链接

    展开全文
  • GDPR中的三大主体:用户,数据所有者,以及数据传输
    不知道发生了神马,一夜之间之前随笔写的GDPR介绍文字竟然多出来了1000+的阅读量,不知道是CSDN坏掉了,还是这个topic突然火了。So,总之,还是继续写点什么吧

    GDPR法规主要面向了三个主体,用户(Individual),数据所有者(Data Controller)以及数据传输者(Data Processor)。

    首先对于用户,GDPR在法律层面上赋予了其很多权利,主要包括:

    • 知情权:主要指数据所有者(Data Controller)必须明确告知用户其收集个人信息的原因,用途,以及保存时效。如果个人信息还将分享给第三方,必须明确通知用户相关情况并让其决定是否同意向第三方发送数据。(license agreement一定要是opt-out的,不能使opt-in哦~)。
    • 访问和更正权:用户有权访问其提供的个人信息,并进行修改。当用户递交访问申请时(可以是口头通知,也可以通过写信的方式),数据所有者必须在一个月内对用户申请作出反馈,并且在绝大多数情况下不能对该访问申请收费。
    • 删除权:又名“the right to be forgotten”。即用户有权要求数据所有者删除其之前提供的个人信息。特别需要注意,如果用户的信息已经被数据所有者透露给第三方,或者在互联网进行了公开发布,那么当用户行使删除权时,数据所有者必须通知所有拥有该用户数据的第三方一并删除,包括互联网上的相应连接以及数据拷贝等。

    相对应的,GDPR对于用户有多少保护权限,就对数据所有者和数据传输者提出了多少要求。在GDPR概念下,数据所有者指的是定义收集个人信息需求的组织或个人。数据传输者指的是代表数据所有者去收集个人信息的组织或个人。

    举个例子,律师事务所会收集很多其当事人的个人资料并保存在微软Office 365中的SharePoint站点当中。这里面律师事务所就是数据所有者,而律师事务所和微软共同成为了数据传输者。(因为当事人的信息是律师收集整理记录的,微软主要是负责数据存储,两者合在一起才组成了完整的数据传输者。)

    图片来自网络,侵,删。

    图片来自网络,侵,删。

    对于数据所有者,其主要责任包括必须证明其是在GDPR规定范围内进行个人信息收集的,即合法,真实,透明,精准,最小限度的做了收集个人信息的工作。同时还需证明其尽了最大努力的对收集到的个人信息进行了保护,包括制定了严格的数据管理方案,数据保护计划,以及危机应对办法等。

    对于数据传输者来说,其必须证明是在数据所有者规定的范围能进数据的收集,传输,存储以及管理等要求。必须按照数据所有者的要求,证明其尽到了数据保护责任。

    总的来说,对于GDPR的合规,绝不是IT部门一个单位的事。相反,管理层制定的各种政策才是保证合规的关键所在。如果作为数据所有者的管理层在收集个人信息的政策上就已违规,那么无论IT部门如何努力,也是无法达到GDPR相关要求的。

    展开全文
  • 数据传输安全

    万次阅读 2018-07-25 22:26:06
    数据传输安全的要求 首先我们先明确我们在数据传输时对于安全到底有什么具体要求: 消息的发送方能够确定消息只有预期的接收方可以解密(不保证第三方无法获得,但保证第三方无法解密)。 消息的接收方可以确定消息...

     项目中遇到了解签解密,之前就曾经遇到过加密的问题,项目中也曾经遇到过这样的需求,但一直都没有系统的了解,正好这次一起把这块东西搞清楚。

    数据传输安全的要求

    首先我们先明确我们在数据传输时对于安全到底有什么具体要求:

    1. 消息的发送方能够确定消息只有预期的接收方可以解密(不保证第三方无法获得,但保证第三方无法解密)。
    2. 消息的接收方可以确定消息是由谁发送的(消息的接收方可以确定消息的发送方)。
    3. 消息的接收方可以确定消息在途中没有被篡改过(必须确认消息的完整性)。

    关于加密

    针对安全三个要求中的第一个要求,我们可以通过加密的方式解决。那么加密大致又分为对称加密和非对称加密,那么什么是对称加密,什么有是非对称加密呢?

    (一)对称加密

    对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信性至关重要。在1976年以前,所有的加密都采用对称加密。

    对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。

    不足之处是,交易双方都使用同样钥匙,安全性得不到保证。

    具体算法:DES算法3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法。

    其中最经典的算法莫过于DES加密算法。DES加密采用的是分组加密的方法,使用56位密钥加密64位明文,最后产生64位密文。流程如下,大致了解即可。

    (二)非对称加密

    在1976年有两位数学家提出了一个崭新的非对加密的概念:

    1.A生成一对两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

    2.B获取乙方的公钥,然后用它对信息加密。

    3.A得到加密后的信息,用私钥解密。

    受这个思路的启发,三位数学家Rivest、Shamir 和 Adleman 设计了一种具体实现上面描述的非对称加密的算法,以他们三个人的名字命名,就是目前在计算机领域应用非常广泛的非对称加密算法RSA加密算法。想深入理解非对称加密解密的原理可以看这里

    主要算法:RSA、Elgamal、背包算法、Rabin、HD,ECC(椭圆曲线加密算法)。

    虽然非对称加密很安全很强大,但是它也有缺点,相对于对称加密它计算量更大,计算时间更长。所以在大规模数据的安全通信场景中,普遍采用非对称加密技术来交换对称加密密钥,之后的通信都采用对称加密技术加密。

    关于签名

    利用加密我们满足了第一个要求,数据只有预期的接受方才能解密,但是在这个过程如何保证数据的完整性,保证数据是发送方发送的数据,而不是被第三方篡改后的数据,也就是第三点的要求,这时候就要用到签名。

    在发送方加密明文之前,给明文取md5值,得到其信息的摘要(注:不能通过信息摘要反推明文)。然后用公钥分别给明文和明文的摘要加密发送到数据的接收方,数据的接收方接收到数据之后,用私钥对密文和摘要进行解密,然后对解密得到的明文取md5摘要,比对解密后的明文摘要和发送过来的摘要是否一致;一致就证明数据是原始的数据没有遭到篡改。

    下面是图解过程:

    关于认证模式

    讲到这里,其实非对称加密算法中信息的发送方和接收方都分别有两个密钥,其中分别为私钥和公钥(各自的私钥和彼此的公钥),私钥为数据的发送方持有,公钥可以公开。其中涉及到两种模式,它们分别为加密模式和认证模式。

    在认证模式中,发送方用私钥加密数据,给接收方发送数据,接收方用公钥解密,因为私钥是唯一的,所以只要数据解析成功就可以知道数据发送方是谁。

    这样第二点的要求也达成了。

    总结

    结合以上,我们再来整理一下发送方和接收方所做的事情。

    发送方:

    1. 将消息进行散列运算,得到消息摘要。
    2. 使用自己的私钥对消息摘要加密(认证模式:确保了接收方能够确认自己)。
    3. 使用接收方的公钥对消息进行加密(加密模式:确保了消息只能由期望的接收方解密)。
    4. 发送消息和消息摘要。

    接收方:

    1. 使用发送方的公钥对消息摘要进行解密(确认了消息是由谁发送的)。
    2. 使用自己的私钥对消息进行解密(安全地获得了实际应获得的信息)。
    3. 将消息进行散列运算,获得消息摘要。
    4. 将上一步获得的消息摘要 和 第一步解密的消息摘要进行对比(确认了消息是否被篡改)。

    证书机制

    与数字签名相关的一个概念就是证书机制了,证书是用来做什么呢?在上面的各种模式中,我们一直使用了这样一个假设,就是接收方或者发送方所持有的、对方的公钥总是正确的(确实是对方公布的)。而实际上除非对方手把手将公钥交给我们,否则如果不采取措施,双方在网络中传递公钥时,一样有可能被篡改。那么怎样解决这个问题呢?这时就需要证书机制了:可以引入一个公正的第三方,当某一方想要发布公钥时,它将自身的身份信息及公钥提交给这个第三方,第三方对其身份进行证实,如果没有问题,则将其信息和公钥打包成为证书(Certificate)。而这个公正的第三方,就是常说的证书颁发机构(Certificate Authority)。当我们需要获取公钥时,只需要获得其证书,然后从中提取出公钥就可以了。

    SSH SSL与HTTPS

    谈完数据传输安全,不得不提到这几个具体应用的协议了。

    (一)SSH

    Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定;SSH为一项创建在应用层传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。
    传统的网络服务程序,如rshFTPPOPTelnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。
    而SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
    SSH之另一项优点为其传输的数据可以是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。

    而ssh的数据传输就用到了非对称加密,但是仍存在一个问题,假设A与B之间通信,利用非对称机密,B生成了一对公钥私钥,但在B将公钥传输给A的过程中,出现了C,C假冒了B生成了一堆公钥私钥,然后把公钥传给A,和A建立了加密通道,获取了所有A要发送给B的信息。这就是著名的“中间人”攻击。

    为解决这个问题,SSH协议采用由人工判断公钥的fingerprint是否可信的方式。当使用ssh命令连接服务器时,命令行会提示如下信息:

    The authenticity of host '168.30.9.213 (<no hostip for proxy command>)' can't be established.
    RSA key fingerprint is 23:42:c1:e4:3f:d2:cc:37:1d:89:cb:e7:5d:be:5d:53.
    Are you sure you want to continue connecting (yes/no)?
    

    输入yes之后才会连接到远程服务器,同时这个信息会存储到用户的.ssh/known_hosts文件中,下次再登录的时候,会检查known_host文件,如果存在相同的公钥信息,就不在提示用户确认了。

    这种认证方式假设想登陆服务器的用户已经知道服务器公钥(作为服务器的用户他自然有渠道得知服务器公钥)。fingerprint其实就代表公钥,可以看成是公钥的一个压缩版。有了这个步骤,如果有中间人想冒充服务器B发送公钥给A,它不可能生成一对和B生成的一样的公私密钥,他发送给A的公钥必然与B服务器的不同,所以用户就可以根据printfinger判断所连接的服务器是否可信,有没有被中间人冒充。

    具体的实现细节可参看SSH原理简介

    (二)SSL与TLS

    SSH其实是专门为shell设计的一种通信协议,它垮了两个网络层(传输层和应用层)。通俗点讲就是只有SSH客户端,和SSH服务器端之间的通信才能使用这个协议,其他软件服务无法使用它。但是其实我们非常需要一个通用的,建立在应用层之下的一个传输层安全协议,它的目标是建立一种对上层应用协议透明的,不管是HTTP、FTP、还是电子邮件协议或其他任何应用层协议都可以依赖的底层的可安全通信的传输层协议。

    网景公司于1994年为解决上面的问题,设计了SSL(Secure Sockets Layer)协议的1.0版本,但并未发布,直到1996年发布SSL3.0之后,开始大规模应用于互联网服务。

    跟SSH相比SSL所面临的问题要更复杂一些,上面我们提到,SSH协议通过人工鉴别Public Key的printfinger来判断与之通信的服务器是否可信(不是伪装的中间人)。可是SSL是为了整个互联网上的所有客户端与服务器之间通信而设计的,他们彼此之间不可能自己判断通信的对方是否可信。那么如何解决这个问题呢?

    这时候就要用到上述提到的证书机制,证书主要包含了

    • 对象的公开密钥
    • 数字

    如下图所示:

    因此,利用证书机制就完美了解决了信任问题。

    (三)HTTPS

    读完上面内容,理解HTTPS就简单了,它的全称是 Hypertext Transfer Protocol Secure,也称为HTTP over SSL,其实就客户端与服务系之间的HTTP通信基于SSL协议。

    对于HTTP协议和SSL协议本身没有任何特殊定制,因为SSL本身对HTTP协议就是透明的,HTTP在SSL上运作也不需要任何特殊处理。

    base64

    这边还要提下base64,起初以为这也是一种加密算法,其实不是,百度百科中对Base64有一个很好的解释:“Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法”。也就是说,它其实只是一种编码格式。

    Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。什么是可打印字符?在ASCII码中规定,0~31、128这33个字符属于控制字符,32~127这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64。

    也就是说,如果将索引转换为对应的二进制数据的话需要至多6个Bit。然而ASCII码需要8个Bit来表示,那么怎么使用6个Bit来表示8个Bit的数据呢?6个Bit当然不能存储8个Bit的数据,但是4*6个Bit可以存储3*8个Bit的数据啊!如下表所示:

    可以看到“Son”通过Base64编码转换成了“U29u”。这是刚刚好的情况,3个ASCII字符刚好转换成对应的4个Base64字符。但是,当需要转换的字符数不是3的倍数的情况下该怎么办呢?Base64规定,当需要转换的字符不是3的倍数时,一律采用补0的方式凑足3的倍数,具体如下表所示:

    每6个Bit为一组,第一组转换后为字符“U”,第二组末尾补4个0转换后为字符“w”。剩下的使用“=”替代。即字符“S”通过Base64编码后为“Uw==”。这就是Base64的编码过程。

    参考文献

    SSH、SSL与HTTPS

    签名、加密、证书的基本原理和理解

    什么是Base64?

    展开全文
  • Android蓝牙语音传输,数据传输

    万次阅读 热门讨论 2016-11-18 18:45:05
    也有单独数据传输的部分。 在网上找了很多,没有找到一个合适的demo,弄了几天终于弄出来了!下面把这个过程分享一下,希望帮助到有需要的朋友! 一 既然是在手机上开发,那第一步就应该是获取手机的本机蓝牙设备,...
  • 4G网络数据传输流程 一

    万次阅读 多人点赞 2019-05-30 16:22:28
    本系列5篇文章将围绕4G速率做系统介绍,包括数据传输流程、终端等级、速率计算、如何达到1Gbps。本文是第一篇,讲述用户数据在空口的传输流程。 2009年1月,瑞典运营商TeliaSonera宣布商用4G LTE网络,建成全球首...
  • HTTPS是如何保证数据传输的安全

    千次阅读 2018-09-07 17:12:39
    HTTP是明文传输的,也就意味着,介于发送端、接收端中间的任意节点都可以知道你们传输的内容是什么。这些节点可能是路由器、代理等。 举个最常见的例子,用户登陆。用户输入账号,密码,采用HTTP的话,只要在代理...
  • https是如何保证数据传输的安全

    万次阅读 2016-03-26 09:09:39
    HTTP是明文传输的,也就意味着,介于发送端、接收端中间的任意节点都可以知道你们传输的内容是什么。这些节点可能是路由器、代理等。 举个最常见的例子,用户登陆。用户输入账号,密码,采用HTTP的话,只要在代理...
  • 数据传输安全性保证

    千次阅读 2018-07-07 17:43:42
    数据传输过程中,安全性十分重要,尤其是对于一些敏感的用户信息,其安全性保证更应当被重视。 现代软件开发中,无论是基于敏捷式的软件开发,或者基于前后端分离的软件开发,都离不开提供对外接口,而请求这些接口...
  • 一个UDP用户数据数据字段为8192字节,在数据链路层要使用以太网来传输,试问应当划分为几个IP数据报片?说明每一个IP数据报字段长度和片偏移字段的值 答:6个数据字段的长度:前5个是1480字节,最后一个是800字节...
  • 微信小程序中data-key属性:数据传输

    万次阅读 多人点赞 2019-10-15 20:20:49
    总结来说,data-key="{{...}}" 是往data中传数据(有后端的话是要给后端的),而data-key="..." 是从data(有后端的话是从后端先传给data接收)传到wxml页面中 怎么接收data-*的值 如下: <view bindtap="SetD...
  • 在一般的项目开发过程中,往往需要两块或以上单片机进行通信完成数据传输,例如四旋翼无人机在飞行过程中无线传输数据回到地面站,治疗仪器需要实时将患者和机器运转情况传回上位机平台,粮仓温控装置需将各种传感器...
  • ZigBee之原语、数据传输模式

    千次阅读 2016-08-19 17:16:00
    原语 ZigBee每一层的服务可以通过简历它下层的服务上的功能,来为它上层,或者子层里的用户来提供服务的。下图说明了原语的感念,它描述了服务层次的关系,以及两个通信的N层用户和它们相连的N层(子层)对等协议...
  • 网络中数据传输的过程

    万次阅读 多人点赞 2018-05-23 18:17:56
    1. 数据传输的背景(1) 现在互联网中使用的是基于OSI七层模型的TCP/IP模型。TCP/IP模型包括五层,即物理层,数据链路层,网络层,传输层,应用层;其中数据链路层又可以分为两个子层,即LLC(逻辑链路控制层)和MAC...
  • 网络数据传输的封装

    千次阅读 2016-03-31 15:43:20
    数据封装(Data Encapsulation)是指将协议数据单元(PDU)封装在一组协议头和尾中的过程。在OSI七层参考模型中,每层主要负责与其它机器...为了帮助用户更清楚的理解数据封装过程,下面通过一个实例说明这个过程。假
  • OpenLayers 3 之 使用地理数据传输格式GeoJSON

    万次阅读 热门讨论 2015-04-01 13:11:41
    用户请求地理数据或者其他数据,服务器要以一定的客户端能够识别的数据格式返回,数据格式是否高效,直接影响用户的体验!首先要求数据格式要是轻量级的,还要求客户端处理数据方便快捷,相较于XML,JSON满足这两个...
  • WebSocket -- 网络数据传输

    千次阅读 2015-02-02 14:44:38
    WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如Chrome,Safari,Firefox,Opera,IE等等,该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协议草案的不断变化,各个...
  • 数据传输加密  在开发应用过程中,客户端与服务端经常需要进行数据传输,涉及到重要隐私信息时,开发者自然会想到其进行加密,即使传输过程中被“有心人”截取,也不会将信息泄露。对于加密算法,相信不少开发者...
  • Web API数据传输加密

    万次阅读 2015-08-18 12:03:12
    这种方式,可以有效识别用户的身份,为用户接口返回用户相关的数据,如包括用户信息维护、密码修改、或者用户联系人等与用户身份相关的数据。 2)一种是使用安全签名进行数据提交。这种方式提交的数据,URL连接的...
  • 数据传输过程详解

    万次阅读 2016-06-16 18:50:19
    一、FTP客户端发送数据到FTP服务器端,详述其工作过程。两台机器的连接情况如下图所示:       详细解答如下   1.1、假设初始设置如下所示: 客户端FTP端口号为:32768 服务器端FTP端口号为:21 设备
  • 使用Java 自带的API开发IO系统时,如果需要对传输的方式进行切换,例如从阻塞传输切换到非阻塞传输, 那么可能会由于两种方式的API不兼容问题需要大面积的修改代码。然而 Netty 则为它所有的传输方式提供了一个通用 ...
  • 基于HTTP的XML数据传输协议

    万次阅读 2018-06-25 10:10:25
    消息包 客户端与服务器之间...客户端和服务器端发送和解析XML数据时要遵循数据传输协议。 每一个请求、响应消息包都是一个XML字符串,包含消息头和消息体两部分,对于不同类型的请求、响应,消息头的格式都相同的...
  • 工业相机常见的数据传输接口方式

    万次阅读 2018-10-11 18:06:17
    GigE设备上加入了图像采集卡功能,因此作为系统来说价格便宜了,但相机的价格却有所提高 与CameraLink接口相机相比,GigE相机的耗电量较高 Camera link标准由美国自动化工业学会 AIA定制、修改发布,...
  • UDP实现可靠数据传输

    千次阅读 2013-09-14 16:20:25
    UDP没有Delievery Garuantee,也没有顺序保证,所以如果你要求你的数据发送与接受既要高效,又要保证有序,收包确认等,你就需要在UDP协议上...下面分别介绍三种使用UDP进行可靠数据传输的协议 RUDP RTP UDT R
  • 计算机网络数据是如何传输的?

    万次阅读 2019-05-28 17:33:29
    而且不同网络体系结构的用户都需要通信,而且要做到在全世界范围的计算机都可以高效进行通信。于是OSI(Open Systems Interconnection Reference Model)协议诞生了。只要遵循OSI标准,一个计算机系统就可以和位于世界...
  • 数据传输加密技术分析

    万次阅读 2015-12-23 21:03:46
    互联网给人们生活带来了极大的便利。然而,人们在享受网络便捷的同时,却往往容易忽视网络暗藏着的安全隐患。...对于企业来说,企业的财政开支状况、项目申请及研发文档等都是非常机密的材料,一些不
  • Android蓝牙实现设备间数据传输

    万次阅读 2017-07-31 21:28:41
    这篇文章总结通过蓝牙实现两台pad间数据传输 文章基于传统蓝牙,而不是BLE。 蓝牙应该是移动设备经常用到的功能模块,Android Bluetooth API 是Android提供的用来实现点到点和多点无线功能。 使用 Bluetooth API,...
  • 数据传输格式xml/json

    千次阅读 2014-11-01 16:44:56
    写在前面:  现在市面上基于Js的前端框架与服务端交互的数据格式都是json.... Ajax全称AsynchronousJavaScriptXML由名称可以看出Ajax设计最初的数据传输格式是xml格式.但是xml格式有着一些缺点.所以现在Aj
  • 客户端与服务器的数据传输

    万次阅读 多人点赞 2018-06-29 15:53:21
    1.Socket网络编程之传递字符类型(图解与编码)2015年05月09日 09:50:42阅读数:1886Java最初是作为网络编程语言出现的,它网络的高度支持,使得客户端和服务器流畅的沟通变成现实。而在网络编程中,使用最多的就是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 584,670
精华内容 233,868
关键字:

对用户来说数据传输是