陈志军

物来顺应,未来不迎,当时不杂,既过不恋


  • 首页

  • 分类

  • 归档

  • 标签

  • 搜索

HTTPS 到底是什么?CA 证书又是指什么?

发表于 2021-06-16 | 分类于 HTTPS | 阅读次数

HTTPS 到底是什么?CA 证书又是指什么?

https 相信很多人已经不陌生了,那么 https 到底是怎么一回事?我们通常说用 https 就要证书,那么证书和 CA 又是什么关系了?

HTTPS 出现的背景

我们通常习惯于使用 http 进行数据通信,可以说如果这个世界是个和谐的世界,那么应该就没 http 的事了。不过林子大了,什么鸟都会有。我们在使用 http 的时候镜像面对的一个问题就是安全性。http 的报文传送都是已明文的方式传送,那么问题来了?我怎么知道这个到底是不是原始数据?如果有个中间人截获了然后篡改消息怎么办?基于这个问题,Netscape(开发 Firefox 的公司)搞了一个 SSL 协议。后来 SSL 发展到 v3 版本时,被标准化,这个时候就改名了,叫 TLS。于是乎,在 http 上 加了 SSL/TLS 就变成了我们都知道的 HTTPS。

HTTPS 优势和劣势是什么?

HTTPS 出现了之后,安全协议在 OSI 的分层中属于在 HTTP 之下,传输层之上。

HTTPS 带来的的优势有下面几点:

  1. 数据加密与安全保护;
  2. 认证用户和服务器,可以确保数据正确发送到 客户机和服务器;
  3. SEO 倾斜;

HTTPS 的劣势也比较明显:

  1. HTTPS协议握手阶段比较费时,会使页面的加载时间延长
  2. 加解密会在服务端增加 CPU 的消耗
  3. 证书费用
  4. 相对意义上的安全(拥有 CA 根证书,也是可以攻击的)

这个技术适用的场景

https 适用于所有的网站。但是如果在一些不需要特别注意安全性,又需要快速访问的话,比如博客网站,静态资源这些,我们可以直接使用 http 而不用 https。在下面的一些场景中,最好还是使用 https:

  1. 企业应用
  2. 政务信息
  3. 支付应用
  4. API接口

这个技术的组成部分和关键点(核心思想,核心组件)

https 的关键在于对信息的加密。在传统的 http 的过程我们 AB 两点间的通信是这样的。

2020-06-16-23-11-08

A 直接发送数据给 B。好了。这个时候有个 C 出来了搞事情了:

2020-06-16-23-16-06

看原来好好的一个打招呼,变成了一个莫名其妙~~

那 AB 之间假设要防止 C 的截获并且篡改消息,怎么办?生活中也有这种场景,比如谍战片里面,卧底和接头人约定一个密码串,然后 A 用密码串加密,B 用密码串解密。

2020-06-16-23-24-38

这样只要 AB 都有一个密码本,那就可以加解密了。这也就是我们常说的“对称加密”。但是假如你们之间的这个密码本被 C 获取了呢? C 获取了你们的密码本,它也不告诉 AB,那就跟我们上图一样了。它先解密 A 的数据,然后再篡改数据加密后再发给 B。你看这就危险了吧。

那这个时候我们又要想办法了。B 说这样不安全,这样吧,我用两个密码本,一个公开给你(公钥),一个我自己单独留着(私钥)。你发过来的消息用我的公钥加下密码,我用我的私钥解下密。A 说好,拿着 B 的公钥加密数据后发给了 B。这样一看,嗯,很不错,A 发给 B 的消息再也不会泄漏了。因为就算 C 获取了消息,它没有私钥也没法解密消息啊。A 也这样想,也是,但是你回给我的消息还是可能被截取到,那我这个 A 也搞个公钥和私钥,你发给我的消息,用我的公钥加密下。这样一看,很不错啊。A B 之间发送的消息再也不用担心被第三方知道了,因为 C 无法界面消息啊!

2020-06-16-23-45-49

如果 C 是个好人,那就到此了。可是如果 C 不甘心了?C 想,既然 A 的实际数据我不知道,那我就假装 B 来跟 A 套取数据。比如下面,毕竟 A 是无法判断到底谁是 B 的。如果想不明白,想想谍战片,你说你是好人,你就是好人吗?怎么证明?:

2020-06-16-23-50-39

那好吧。大家一看,不行啊。这的搞个中间人来确认 A 是 A,B 是 B,就像确认你是你妈的儿子一样!!那怎么搞了?你想想,你想要知道你们市的公安局合不合法,那肯定是省公安局说了算。你想要知道省公安局合不合法,那肯定是是国家公安局说了算。所以你只要信任国家公安局,那就可以信任国家公安局认可的下一级公安局,那就可以认可它下面的工具认可的下面的公安局… 中间人也一样,不过我们在通信中引入了一个专用术语 CA(Certificate Authority)证书认证机构。

这个技术的底层原理和关键实现

已有的实现和它之间的对比

自己用 Java 写一个阻塞队列(二)

发表于 2021-06-03 | 分类于 Java | 阅读次数

自己用 Java 写一个阻塞队列(二)

上一章 自己用 Java 写一个阻塞队列 我们写了一个初始阻塞队列。过了几天再回头看。嗯,好像看出哪里不对劲了。尝试改了一下。

原先队列实现的问题

我们说是队列,但是队列的特点是什么?先进先出!在上一个版本中,我们在出队列的时候用的是size值,也就是最后一个位置值。那么想想,我们这算队列么?这是栈啊。这是问题一。
另外我们知道 arraylist 其实其底层实现还是数组,那为啥我不直接用数组了?我基本上也不用 list 的功能啊。那这个地方就是第二个可以优化的地方了。
在第一个版本中为了运行正常,我把 size 的初始值定为 -1,我有点受不了,不行,这个地方我也要优化。
嗯,就优化这三个地方吧。

优化问题 ArrayList

其实际很简单,把 ArrayList 改为数组 Object[]。原先 add 和 get 的地方直接使用 Object[idx] 代替即可。

1
2
3
Object[] objects = new Object[10];
objects[size] = t;
t = objects.[size];

优化入队和出队

队列的本质应该是先进先出的数据结构。这里用两个 idx 来代替,一个是入队索引,一个是出队索引。

1
2
int enqIdx = 0;//入队的索引号
int deqIdx = 0;//出队的索引号

这里有个问题,就是当索引到了我们的数组大小的时候,要把索引重新开始计数。

1
2
3
4
5
6
if((enqIdx+1)==objects.length){
enqIdx=0;
}
if((deqIdx+1)==objects.length){
deqIdx=0;
}

开始代码

阅读全文 »

自己用 Java 写一个阻塞队列

发表于 2021-05-27 | 阅读次数

自己用 Java 写一个阻塞队列

Java 内置了很多数据结构,阻塞队列也有。最近在看 Java 中的并发包:Lock&Condition。然后看到了有人说可以用他们实现阻塞队列,然后我想着,那我是不是也可以写一个阻塞队列?

阻塞队列的特点

想着就想着先写一个,阻塞队列的特点:

  1. 一个有限的存数据的队列;
  2. 入队的时候要判断队列是否已满;已满的时候,入队的线程要阻塞等待,直到队列有空位,被唤醒继续入队;
  3. 出队的时候要判断队列是否为空;为空的时候,获取队列数据的线程阻塞等待,直到队列有新数据的时候被唤醒继续执行;
阅读全文 »

Linux 日志管理工具 - Logrotate

发表于 2021-05-20 | 分类于 Linux | 阅读次数

Linux 日志管理工具 - Logrotate

最近在使用 openresty(nginx) 作为容器平台 kubernetes 的入口路由服务;流程大致为前端新建一个路由规则的时候,获取到 svc 的 endpoint 然后将其作为 nginx 的后端服务。实时监听 svc 的状态然后更新 ep 到 nginx;这里遇到一个问题,nginx 本身没有做到日志切割,在上线一段时间之后,nginx 的 vhost_access.log 日志文件竟然达到了 50G ,导致出现系统磁盘告警。google 一下没发现 nginx 有自带的日志轮转的功能(其实也有,只是要装插件和重新编译);在线上最好的方式是什么了?最后采用了 Logrotate 来做日志切割。

阅读全文 »

查漏补缺 Java 系列 - JVM 垃圾回收

发表于 2021-04-05 | 分类于 Java | 阅读次数

查漏补缺 Java 系列 - JVM 垃圾回收

正如一间房子,房子的主人肯定需要在客人来的时候进行一些收拾,让家里显得更加的大,而让客人有更好的体验。JVM 也是一样,你想想,JVM 是不是也要不定时的清理下内存区域空间以便能让更多的线程有更好的执行体验?那主人在进行清理的时候,至少要知道要对哪个区域进行清理吧?要知道在哪个区域清理哪些垃圾吧?清理的过程是用拖把还是用扫把,要有个选择吧?你想想 JVM 是不是也应该是类似的?

JVM 应该回收哪个区域的垃圾?

上一篇,我们介绍了 jvm 中一些基础概念,包括运行时内存区域。其中我们知道 jvm 规范中规定了5个运行时区域,一器两栈一堆一区。程序计数器,Java 虚拟机栈,本地方法栈,堆,方法区【运行时常量池(方法区内部)】;

JVM 这些区域里面我们可以分两类,一类需要重点关注 GC,一点可以不需要 GC。根据它们的生命周期可以看到虚拟机栈、本地方法栈、程序计数器这三个线程私有的区域,他们的生命周期跟线程的生命周期保持一样,他们的内存分配和回收时间是可以确定的,所以基本上用不上 GC;而方法区,堆他们需要在程序实际运行时才能知道需要创建哪些对象分配多大的空间,所以这部分是重点要关注的 GC 区域;

我们根据分配的时机来确定了需要进行垃圾回收的两个区域:堆,方法区。但是在 jvm 规范中对方法区进行了一个定义,也就是这块区域逻辑上属于堆,但是它可以不用 GC(上篇文章我有说到)。因此我们将重点放到堆(Heap)的回收中。

好了,我们现在知道哪个区域需要进行 GC 了,那么 JVM 又如何知道哪些是垃圾需要清理,哪些不是垃圾不需要清理了?因为堆主要是用来存放对象的,我们也可以当做,jvm 应该怎么判读一个对象是不是应该被回收?

阅读全文 »

查漏补缺 Java 系列 - JVM 基础概念

发表于 2021-04-04 | 分类于 Java | 阅读次数

查漏补缺 Java 系列 - JVM

你知道 JVM 吗?作为Java开发人员,我想你肯定听过吧?那么你了解为什么需要 JVM 吗?它的作用是什么?给我带来了什么好处,又给我们带来了什么缺点了?接下来我们一起看看吧。

JVM 的基础概念

什么是 JVM ?

JVM(Java Virtual Machine) 中文名称为 Java 虚拟机。它的作用是为 Java 提供跨平台运行的基础,也就是那句”一次编译,到处运行”的底层保证。

我想你肯定在 windows,Linux,MacOS 上都有运行过 Java 程序,那么你想一想,在一台裸机上面(指新买的机器装上一个纯的干净的系统 OS),你直接编写一个 Main。java 能运行起来么?运行一个 Main。java,我想你肯定经过这几个步骤:安装 jdk(jre) -> 编写 Main。java -> javac Main。java生成main。claas文件 -> java Main;那你想过吗?为什么你要安装一个 jkd(jre),为什么你要先用javac命令,生成一个claas文件,然后才能执行了?

你肯定有疑问。是的。我想跟你说的是其实 jvm 根本不知道你写的 java 文件里面的内容,一点都不知道。但是它认识你按照它的规范生成的 class 文件。然后它再将 class 文件翻译成机器识别的机器码。这样才能真正的运行你的程序了。也许这就是为什么很多人会说它是解释器吧。

阅读全文 »

Java HashMap

发表于 2021-03-25 | 分类于 Java | 阅读次数

HashMap 介绍

这个该怎么写了?其实网上好多博客说了这个,其实我看了之后,甚至看了源码之后我也不知道怎么写,源码中Hashmap的介绍大致如下:

1
2
3
4
5
6
7
8
Hashmap 大致是等于hashtable的,除了非同步和允许null值之外;
不保证数据的顺序;
常数级别的get和put;
最重要性能的两个属性: capacity , loadfactor
0.75的加载因子数是一种空间和时间上的tradeoff(平衡)
相同的hashcode()会降低它的性能
hashmap的实现是非同步的;
iterator fail-fast ConcurrentModificationException.

首先我们介绍下它的内部数据结构吧。

HashMap的内部结构

阅读全文 »

查漏补缺 Java 系列 - String,StringBuffer,StringBuilder有什么区别

发表于 2021-03-18 | 分类于 Java | 阅读次数

查漏补缺 Java 系列 - String,StringBuffer,StringBuilder有什么区别

String,StringBuffer,StringBuilder 他们三者的优势和劣势?

一般来说,Java中String是用来对字符串进行操作的类,是一个 Immutable 类,它是被声明为final class,所有的属性也是final的;String中的所有跟字符串修改的方法都是新建了一个String,就会产生很多额外的String对象;

StringBuffer是一个线程安全的类,它的所有方法都加上了synchronized; StringBuffer还有个优点就是它在执行append的操作的时候将新的字符串插入到原来的串中,可能是末尾,也可能是中间位置;

StringBuilder 是 Java 1.5 中新增的,它可以看成是StringBuffer的非线程安全实现版本。

阅读全文 »

shell-operation

发表于 2019-12-18 | 阅读次数

nginx-http-1.1

发表于 2019-12-18 | 阅读次数

Nginx Http 1.1 Host规范

最近发现一个异常问题。一个web服务挂载在nginx后端,然后client通过socket连接后,构建成http-post请求,发现最后nginx会直接返回499,发现其实是客户端断链接,其实应该不对。http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort

之后的是http1.1的规范。https://tools.ietf.org/html/rfc2616#section-14.23 http1.1中,如果Host为空会直接返回400的状态码

1234…18

180 日志
41 分类
70 标签
RSS
GitHub GitEE
推荐阅读
  • 陈志军的个人站
© 2017 - 2023 陈志军
由 Hexo 强力驱动
主题 - NexT.Muse