本文分为以下4个部分
- 1.密码学相关概念
- 2.http
- 3.SSL/TLS
- 4.https
1.密码学概念
要想区分http和https,首先要对密码学有一定的了解。
建议先找本书,例如 《网络安全基础应用与标准》,图书馆可以找到这种书籍,或者通过在网上找pdf文档。
首先可以通过在线网站,进行简单的加密解密实践。
下图是使用AES算法和秘钥1简单加密数据111后得到的数据。得到数据后,把111删掉,再点击解密就可以得到111了。
https://www.sojson.com/encrypt.html
//以下大部分文字出自网络安全基础应用与标准第四版
1.1 对称加密。
对称加密 :如果 发送者和接收者都使用同一密钥,该体制就是对称、单钥、私钥或者说传统加密 。
加密方案的组成与模型图具体如下。
一个 对称加密方案 由5 部分组成(图2.1):
1.明文( plaintext): 这是原始消息或数据,作为算法的输入。
2.加密算法(encryption algorithm): 加密算法对明文进行各种替换和转换。
3.秘密密钥(secret key): 秘密密钥也是算法的输入。算法进行的具体替换和转换取决于这个密钥。
4.密文(ciphertext) : 这是产生的已被打乱的消息输出。它取决千明文和秘密密钥。对千一个给定的消息,两个不同的密钥会产生两个不同的密文。
5.解密算法(decryption algorithm) : 本质上是加密算法的反向执行。它使用密文和同一密钥产生原始明文。
1.2 公钥加密
公钥加密 :如果 发送者和接收者使用不同的密钥,体制就是不对称、双钥或者说公钥加密。
加密方案的组成与模型图具体如下。
公钥加密方案由6 个部分组成(图 3.9(a)):
1.明文: 它是可读的消息或数据,用作算法的输入。
- 加密算法:加密算法对明文进行各种形式的变换。
3和4. 公钥和私钥: 它们是被选择的了对密钥, 如果一个密钥用于加密,则另一个密钥就用于解密。加密算法所执行的具体变换取决于输入端提供的公钥或私钥。
5.密文: 它是输出的混乱的消息,取决于明文和密钥。对千给定的消息, 两个不同的密钥将产生两个不同的密文。
6.解密算法:该算法接收密文和匹配的密钥, 生成原始的明文。
顾名思义,密钥对中的公钥是公开供其他人使用的, 而只有自已知道私钥。通常的公钥加密算法根据一个密钥进行加密,根据另一个不同但相关的密钥进行解密。
基本步骤如下:
(l) 每个用户都生成一对密钥用来对消息进行加密和解密。
(2) 每个用户把两个密钥中的一个放在公共寄存器或其他可访问的文件里,这个密钥便是公钥,另一个密钥自己保存。每个用户都收藏别人的公钥。
(3) 如果Bob 希望给Alice 发送私人消息,则他用Alice 的公钥加密消息。
( 4 ) 当Alice 收到这条消息,她用私钥进行解密。因为只有Alice 知道她自己的私钥,其他收到消息的人无法解密消息。
用这种方法,任何参与者都可以获得公钥。由千私钥由每一个参与者在本地产生,故不需要分发。只要能够保护好他或她的私钥,以后的通信就会安全。在任何时候,用户都能够改变私钥且发布相应的公钥代替旧公钥。
传统加密算法中使用的密钥被特别地称为密钥。用千公钥加密的两个密钥被称为公钥和私钥。私钥总是保密的,但仍然被称作为私钥而不是密钥,这是为了避免与传统加密混淆。
1.2.1 公钥密码系统的应用
公钥系统的特征就是使用具有两个密钥的加密算法,其中一个密钥为私人所有, 另一个密钥是公共可用的。根据应用,发送者要么使用发送者的私钥,要么使用接收者的公钥,或者两个都使用, 从而实现某种类型的加密函数。在广义上可以把公钥加密系统分为如下三类。
1.加密/解密:发送者用接收者的公钥加密消息。
2.数字签名: 发送者用自己的私钥”签名“消息。把加密算法作用于消息或者消息函数的一小块数据,这样就完成了对消息的签名。
3.密钥交换:双方联合操作来交换会话密钥。这可以使用几种不同的方法,且需要用到单方或双方的私钥。
1.3 数字签名
如图3 .9(b)所示,公钥加密还可以按另一种方式使用。假设Bob 想给Alice 发送消息。虽然这条消息的保密性并不重要,但是他想Alice 能够确定这条消息确实是来自于他。当Alice 收到密文时,她发现能够用Bob 的公钥进行解密,从而证明这条消息确实是Bob 加密的。因为没有其他人拥有Bob 的私钥,所以其他任何人都不能创建由Bob 的公钥能够解密的密文。因此,整个加密的消息就成为一个数字签名( digital signature) 。此外, 由于没有Bob 的私钥就不可能篡改消息,所以数字签名不仅认证了消息源,它还保证了数据的完整性。
发送的消息对千篡改是安全的, 但对于窃听却不安全。这对千签名只基千消息的一部分的情况是明显的,因为消息的剩余部分以明文形式发送。即使是在完全加密的情况下,也不能保证保密性, 因为任何观察者都可以使用发送者的公钥解密消息。
1.4 密钥分配
密钥分配 有2种 :基千对称加密的密钥分配 和 基干非对称加密的密钥分配 。
1.4.1 基千对称加密的密钥分配
对千对称加密,加密双方必须共享同一密钥,而且必须保护密钥不被他人读取。此外,常常需要频繁地改变密钥来减少某个攻击者可能知道密钥带来的数据泄露。因此,任何密码系统的强度取决千密钥分发技术。密钥分发技术这个词指的是传递密钥给希望交换数据的双方,且不允许其他人看见密钥的方法。
1.4.2 基干非对称加密的密钥分配
公钥加密的一个重要作用就是处理密钥的分发问题。在这方面, 使用公钥加密实际上存在两个不同的方面。
1.公钥的分发。
2.使用公钥加密分发私钥。
1.4.2.1 公钥的分发
从字面理解,公钥加密的意思就是公钥是公开的。所以,如果有某种广泛接受的公钥算法, 如RSA , 任何参与者都可以给其他参与者发送他的或她的公钥,或向群体广播自己的公钥。虽然这种方法非常方便, 但是它也有个很大的缺点。任何人都可以伪造公共通告。
即某用户可以伪装用户A 向其他参与者发送公钥或者广播公钥。直到一段时间后用户A 发觉了伪造并且警告其他参与者,伪装者在此之前都可以读到试图发送给A 的加密消息, 并且使用假的公钥进行认证。
解决这种问题的方法是使用公钥证书。实际上,公钥证书由公钥加上公钥所有者的用户ID 以及可信的第三方签名的整个数据块组成。通常,第三方就是用户团体所信任的认证中心(CA ), 如政府机构或金融机构。用户可通过安全渠道把他或她的公钥提交给这个CA,获取证书。然后用户就可以发布这个证书。任何需要该用户公钥的人都可以获取这个证书,并且通过所附的可信签名验证其有效性。图4.3 描述了这个过程。
人们广泛接受的公钥证书格式是X.509 标准。
1.4.2.2 使用公钥加密分发私钥
使用传统加密时,双方能够安全通信的基本要求就是他们能共享密钥。假设Bob 想建立一个消息申请,使他能够与对方安全地交换电子邮件,这里的”对方“是指任何能够访问Internet 或者与Bob 共享其他网络的人。假定Bob 要用传统密码来做这件事。使用传统加密时, Bob 和他的通信者(如Alice) 必须构建一个通道来共享任何其他人都不知道的唯一密钥。他们是如何实现的呢?如果Alice 在Bob 的隔壁房间里, Bob 可以生成密钥,把它写在纸上或存储在磁盘上,然后交给Alice 。但是如果Alice 在欧洲或世界的另一边,Bob该怎么办呢? 他可以用传统的加密方法加密密钥, 并且将它以电子邮件方式发送给Alice 。但是这意味着Bob 和Alice 必须共享一个密钥来加密这个新的密钥。此外, Bob 和任何其他使用这种新电子邮件包的人都与他们的潜在通信者之间面临着相同的问题:任何一对通信者之间都必须共享一个唯一的密钥。
该问题的解决方案就是使用公钥证书。
当Bob 想要与Alice 通信时,他按下面的步骤操作:
( I) 准备消息。
(2) 利用一次性传统会话密钥, 使用传统加密方法加密消息。
(3) 利用Alice 的公钥,使用公钥加密的方法加密会话密钥。
( 4) 把加密的会话密钥附在消息上, 并且把它发送给Alice 。
只有Alice 能够解密会话密钥进而恢复原始消息。如果Bob 通过Alice 的公钥证书获得Alice 的公钥,则Bob 能够确认它是有效的密钥。
密码学小节总结:
这一部分的需要理解的名词如下:
- 秘密秘钥 公钥 私钥
- 数字签名
- 公钥证书
后续思考:
其实这部分还有一个大问题没有去深究,那就是这些加密算法的原理是什么?这个是数据是如何算出来的?由于这一部分我的基础实在薄弱,因此留到以后去探究。
2.http
首先,花了大概几个小时快速、粗略地看了一遍《图解http》这本书,这部分全是理论知识,不太适合看太久。对http有了一定的理解,然后通过实践加深了一点点理解。http相关的知识点还是需要找书去看,看那些博客的话都是提炼后的知识点,个人掌握知识的情况跟学习过程中的侧重点都不一样并不一定适合。
具体实践如下: 使用tomcat 简单搭建服务器,实现get和post等简单功能,并使用抓包工具Wireshark简单查看数据(Wireshark抓的信息真的很全但是太全了我抓不到重点,所以就简单看了下而已),了解基本信息。
实践部分记录写在这篇文章里面:
简单测试get和post请求
https://www.jianshu.com/p/37e0daa57dd4
3.SSL/TLS
在对密码学有了一定的理解后,就可以来看SSL/TLS了。
通常,HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披SSL 协议这层外壳的 HTTP。
在采用 SSL 后,HTTP 就拥有了 HTTPS 的加密、证书和完整性保护这些功能。
SSL/TLS 使用对称加密提供消息的机密性服务,使用消息认证码提供消息的完整性服务。
SSL 是独立于 HTTP 的协议,所以不光是 HTTP 协议,其他运行在应用层的 SMTP 和 Telnet 等协议均可配合 SSL 协议使用。可以说 SSL 是当今世界上应用最为广泛的网络安全技术。
SSL 不是单个协议,它由两层协议组成,如图5.2 所示。
SSL 中定义的三个较高层协议分别是:握手协议、密码变更规格协议和报警协议。
ssl协议栈中最复杂是握手协议。
//网络安全基础应用与标准 中SSL握手相关流程
SSL握手
第一阶段:客户端发起建立连接请求。
第二阶段:服务器认证和密钥交换。
第三阶段:客户端认证和密钥交换。
第四阶段:完成。
简单来说就是
- 客户端发起建立连接请求
- 服务器响应,向客户端发送消息,内容包括一个X.509 证书或一个X.509 证书链,此时,如果有必要,将发送—个server_key_exchange (服务器密钥交换)消息。
- 客户端验证服务器提供的证书是否有效,如果有效,接下来发送是client_key_exchange (客户端密钥交换)消息。消息内容密钥交换类型决定,如果是RSA的话,客户端产生一个48 字节的pre-master_secret (预备主密钥),),并用从服务器证书中得到的公钥或者用从server_key_ exchange 消息中得到的RSA 临时密钥进行加密。
-
服务器使用自己的私钥解密以得到pre_master_ secret (预备主密钥)。双方计算主密钥。
客户端发送一个change_cipher_ spec(密码变更规格)消息, 并把未定的密码规格复制到当前密码规格中。值得注意的是,该消息不是握手协议的一部分, 而是使用密码变更规格协议发送的。客户端在新算法、新密钥和新秘密值下立即发送finished (结束)消息。fini shed 消息用千验证密钥交换和认证过程
是否成功。
作为对客户发送的这两条消息的响应,服务器发送自己的change_cipher_ spec_ message(密码变更规格消息),把未定的密码规格转变为当前的密码规格并发送其finished 消息。到此为止握手过程已经完成, 客户端与服务器可以开始交换应用层数据。
可以结合这篇文章去理解,这个比喻很形象。
ssl协商与秘钥交换
密钥协商的形象化比喻:如果上面的说明不够清晰,这里我们用个形象的比喻,我们假设A与B通信,A是SSL客户端,B是SSL服务器端,加密后的消息放在方括号[]里,以突出明文消息的区别。双方的处理动作的说明用圆括号()括起。
A:我想和你安全的通话,我这里的对称加密算法有DES,RC5,密钥交换算法有RSA和DH,摘要算法有MD5和SHA。
B:我们用DES-RSA-SHA这对组合好了。这是我的证书,里面有我的名字和公钥,你拿去验证一下我的身份(把证书发给A)。目前没有别的可说的了。A:(查看证书上B的名字是否无误,并通过手头早已有的CA的证书验证了B的证书的真实性,如果其中一项有误,发出警告并断开连接,这一步保证了B的公钥的真实性)(产生一份秘密消息,这份秘密消息处理后将用作加密密钥,加密初始化向量和hmac的密钥。将这份秘密消息-协议中称为per_master_secret-用B的公钥加密,封装成称作ClientKeyExchange的消息。由于用了B的公钥,保证了第三方无法窃听)我生成了一份秘密消息,并用你的公钥加密了,给你(把ClientKeyExchange发给B)注意,下面我就要用加密的办法给你发消息了!(将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥)[我说完了]
B:(用自己的私钥将ClientKeyExchange中的秘密消息解密出来,然后将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥,这时双方已经安全的协商出一套加密办法了)注意,我也要开始用加密的办法给你发消息了![我说完了]
A: [我的秘密是...]
B: [其它人不会听到的...]
更加抽象的解释可以看下面。
//HTTP权威指南中SSL握手相关流程
SSL握手
• 交换协议版本号;
• 选择一个两端都了解的密码;
• 对两端的身份进行认证;
• 生成临时的会话密钥,以便加密信道。
SSL和TLS的区别与历史可以参考这篇文章。
HTTPS与HTTP区别 -- TLS/SSL
Android 8.0禁用了SSL,ssl在逐渐退出历史舞台。
本小节我的学习侧重点就是ssl握手协议流程。
4.https
HTTPS 是指用HTTP 和SSL 的结合来实现网络浏览器和服务器之间的安全通信。
添加了加密及认证机制的 HTTP 称为 HTTPS(HTTP
Secure)。
下面是我之前做过的一个简单搭建https的例子,与另一篇搭建http的例子相比,其实就是多了一点配置ssl和证书相关的部分。
tomcat+eclipse+servlet在chrome上实现 https 双向认证简单记录
参考链接:
HTTPS从原理到应用(一):加密(Encrypt)与哈希(Hash)
HTTPS理论基础及其在Android中的最佳实践
关于公钥和私钥的区别