https 学习笔记
参考 :
http://www.cnblogs.com/JimmyZhang/archive/2008/10/02/Cryptograph.html
https://blog.csdn.net/Jogger_Ling/article/details/60576625
2 架机器要通信, 信息很容易被窃听或串改, 需要一套加密机制来保证安全.
通信安全需要具备 3 个条件
1. 信息可被拦截,但是不可被解读 (传输中都是乱码)
2. 信息可被串改, 但是接收方可以察觉 (发现被串改了就不处理了)
3. 接收方必须能确认发送方是真实的.
以上就是通信的基本安全. 没办法满足任何一个, 通信就算失败了.
要安全就加密咯,我们来聊聊加密。
这里提到 3 个和加密有关的方法.
1. 对称加密
对称加密很简单.需要这几件东西 :
1. 信息
2. 加密/解密算法 (算法可公开)
3. 密钥 (password) (密钥不可公开)
用程序来表达是这样的
var encrypted_message = encrypt(message, "password");
那解密就是这样
var message = decrypt(encrypted_message , "password");
2. 非对称加密
这个比较特别它有 2 个 password 叫 公钥,私钥
1. 信息
2. 加密/解密算法 (算法可公开)
3. 公钥 (公钥可公开)
4. 私钥 (私钥不可公开)
它的规则比较特别, 如果用公钥来加密,那么解密的时候要用私钥才能解开
var encrypted_message = encrypt(message, "public password");
var message = decrypt(encrypted_message , "private password");
或则反过来, 私钥加密,公钥解密也是可以.
3.散列算法
这个算法不是用来加密解密的, 它只有加密的功能,却没有解密的功能.
1. 信息
2. 算法 (算法可公开)
它的特点是这样的, 不管你的信息量多大, 经过这个算法都会产生出固定长度的字符串.
没有任何一种方法可以把这字符串还原回原本的信息.
另一个特点是, 它生成出来的字符串是唯一的, 如果 "message" 变成 "egassem" 的话,那么你再也找不到任何一个信息能变成 "egassem", 就只有 message 能变成 "egassem".
而且每一次 "message" 就只能变成 "egassem" 不会变成其它的.
你第一次接触的话,可能会很好奇这东西有啥用.
我举个典型的例子. 用户的密码保存.
我们都知道用户在申请的时候回把 username password 告诉网站, 如果网站把 password 直接保存在数据库中是很危险的。
因为如果一不小心数据库被黑掉了, 用户的密码就被公开了,用户虽然使用很多网站但是密码通常都是放一样的,所以一旦密码被公开,那么其所有网站的资料都会变得很危险.
所以一个好的网站是不应该直接把密码存放在数据库中的. 那这时我们就可以使用这种散列算法把密码都变成一堆乱码. 而只要在用户登入的时候把 password 通过算法再次生成出乱码字符串,对比字符串我们依然可以确定用户输入密码的正确性.
p.s 这里只是讲解散列的运用,真正的密码保存除了散列我们还会加入盐 (salt) 的概念,防止彩虹表的攻击, 这里就不展开了.
通信安全就是靠这 3 件法宝来完成的.
发送方先把信息散列化
这时就有 信息 和 散列信息 2 个东西, 等下将一起发送出去.
发送方用接收方的公钥加密信息 (这样信息就只有接收方能解密, 满足了条件 1)
发送方用自己的私钥加密散列信息 (散列信息在传输时可能被拦截者解密, 因为发送方的公钥人人都有,但是它是散列信息, 所以是乱码看不出内容的, 依然满足条件 1)
接收方收到这 2 个信息之后, 先用自己的私钥解密信息, 这时就得到了正确的信息内容. 但是要怎样确定发送人呢 ?
接收方用发送方的公钥去解密 散列信息, 解密之后得到乱码, 这时接收方再拿刚才拿到的正确信息做散列化, 然后对比两个散列信息.
如果内容完全一样,那么我们断定途中没有人串改, 同时也间接证明了刚才接收方用发送方的公钥解密是真确的, 由此我们可以断定发送方的身份, (满足了, 2,3 条件)
所以上面几个关键点就是
1. 散列也能取到保护信息传输的工作, (虽然它不能解密但是可以加密)
2. 散列可以通过对比, 来求证.
3. 公钥私钥很巧妙的让我们可以确认发送方.
那第一种对称加密呢 ? 怎么没派上用场 ?
非对称加密是非常耗时间性能的, 所以 https 只有第一次通信才会使用上面的方式, 而通信的内容就是一个随机的密码.
通信之后只有双方会知道密码,然后之后的通信就用这个密码做对称加密来保护信息.
即使有人拦截串改, 由于不知道密码就伪造不出信息了,拦截者要是随便弄一个信息来,接收方一解密,就会发现解密失败,或则解出来的内容根本是乱码. 因为密码不对嘛
上面说这么多都有一个假设,就是通信的双方都持有对方的公钥.
这个是怎么办到的呢 ? 我的电脑怎么会有某某某网站的公钥 ?
这就是证书的作用了, 有一个很了不起的机构,它有一把私钥,网站管理人员会像这个机构要求它用这个私钥加密一个文件.
然后网站把这个文件放到服务器里头, 这文件就叫证书. 所有的游览器和 os 都拥有这个机构的公钥. 这个是 os 自带的. 这就是电脑为什么会有公钥的由来.
当游览器像某个网站放请求的时候, 网站会返回这个证书和网站自己的公钥. 游览器会用 os 自带的公钥解密证书, 证书如果是用很了不起机构私钥加密的,那么就能解密成功。
这时我们能确定这一次的通信是安全的,我们也就拿到了网站的公钥了. 然后就可以开始上面的步骤了.
大致上是这个概念啦,我是做业务层的,安全这种东西一般上框架都包办了.根本不需要我去担心.
如果你意外读到我的学习笔记,我说的可能很多都是不太正确的哦,自己看着办吧.
p.s 要判断解密是否失败,方式是对比散列, 或则是在解密的过程中通过算法得知(我不确定这是不是可能的, 但对比散列是肯定可以的)
以上.
https 学习笔记的更多相关文章
- https学习笔记三----OpenSSL生成root CA及签发证书
在https学习笔记二,已经弄清了数字证书的概念,组成和在https连接过程中,客户端是如何验证服务器端的证书的.这一章,主要介绍下如何使用openssl库来创建key file,以及生成root C ...
- https学习笔记二----基础密码学知识和python pycrypto库的介绍使用
在更详细的学习HTTPS之前,我也觉得很有必要学习下HTTPS经常用到的加密编码技术的背景知识.密码学是对报文进行编解码的机制和技巧.可以用来加密数据,比如数据加密常用的AES/ECB/PKCS5Pa ...
- HTTPS学习笔记一----HTTPS的基础理论知识
首先推荐一本书,<HTTP权威指南>我就是看这本书入门的,对http协议有了更好的理解,学习https的理论知识我认为需要了解以下几点,需要一步步的深入学习: 1.HTTPS的基本概念? ...
- HTTP/HTTPS 学习笔记
超文本传输协议(HyperText Transfer Protocol) 伴随着计算机网络和浏览器的诞生,HTTP1.0也随之而来,处于计算机网络中的应用层,HTTP是建立在TCP协议之上的. HTT ...
- 《图解http协议》之HTTPs学习笔记
对于IP协议,并不陌生.TP协议是TCP/IP协议簇中的核心协议,也是TCP/IP的载体.所有的TCP,UDP,ICMP及IGMP数据都以IP数据报格式传输.IP提供不可靠的,无连接的数据传送服务.I ...
- https学习笔记
HTTPS协议 HTTPS可以认为是HTTP + TLS.HTTP协议大家耳熟能详了,目前大部分WEB应用和网站都是使用HTTP协议传输的.TLS是传输层加密协议,它的前身是SSL协议,最早由nets ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
随机推荐
- javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 解决方法
在使用hibernate validator进行参数有效性校验的时候,我们有时候会遇到javax.validation.UnexpectedTypeException: HV000030: No va ...
- 理解 neutron
之前大师发个结构图. understanding_neutron.pdf 自己走读了代码: 1. get_extensions_path() # 在/opt/stack/neutron/neutro ...
- bzoj 2753 [SCOI 2012] 滑雪与时间胶囊 - Prim
题目传送门 传送点I 传送点II 题目大意 给定一个有$n$个点$m$条边的图,每个点有一个高度$h_{i}$,能从$u$经过一条边到达$v$,当且仅当存在一条边是$(u, v)$或$(v, u)$, ...
- UVa 12099 The Bookcase - 动态规划
题目大意 给定一些书,每个书有一个高度和宽度,然后将它们放到一个三层的书架里(要求每一层都不为空).定义书架的大小为每层最大的高度和 乘 每层宽度和的最大值.求最小的书架大小. 显然动态规划(直觉,没 ...
- 针对Xcode 9 + iOS11 的修改,及iPhone X的适配
1,UIScrollView的automaticallyAdjustsScrollViewInsets 失效了. automaticallyAdjustsScrollViewInsets,当设置为YE ...
- 关于python hashlib模块的使用
hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法 #!/usr/bin/ ...
- Bootstrap3基础 img-thumbnail 给图片加一个圆角的边框
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- Python SSH爆破以及Python3线程池控制线程数
源自一个朋友的要求,他的要求是只爆破一个ip,结果出来后就停止,如果是爆破多个,完全没必要停止,等他跑完就好 #!usr/bin/env python #!coding=utf-8 __author_ ...
- mysql中创建时间和更新时间的区别
`create_time` ) NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` ) ) COMMENT '更新时间', 而在界 ...
- Docker2之Service
Make sure you have published the friendlyhello image you created by pushing it to a registry. We’ll ...