HTTPS 中的加密算法相关概念

密码学在计算机科学中使用非常广泛,HTTPS 就是建立在密码学基础之上的一种安全的通信协议。HTTPS 早在 1994 年由网景公司首次提出,而如今在众多互联网厂商的推广之下 HTTPS 已经被广泛使用在各种大小网站中。在完全理解 HTTPS 之前,有必要弄清楚一些密码学相关的概念,比如:明文、密文、密码、密钥、对称加密、非对称加密、摘要、数字签名、数字证书。

密码cipher

密码学中的密码cipher和我们日常生活中所说的密码不太一样,计算机术语『密码cipher』是一种用于加密或者解密的算法,而我们日常所使用的『密码password』是一种口令,它是用于认证用途的一组文本字符串。这里我们要讨论的是前者:cipher。

密钥key

密钥是一种参数,它是在使用密码cipher算法过程中输入的参数。同一个明文在相同的密码算法和不同的密钥计算下会产生不同的密文。很多知名的密码算法都是公开的,密钥才是决定密文是否安全的重要参数,通常密钥越长,破解的难度越大,比如一个 8 位的密钥最多有 256 种情况,使用穷举法,能非常轻易的破解。知名的 DES 算法使用 56 位的密钥,目前已经不是一种安全的加密算法了,主要还是因为 56 位的密钥太短,在数小时内就可以被破解。密钥分为对称密钥与非对称密钥。

明文/密文

明文plaintext是加密之前的原始数据,密文是通过密码cipher运算后得到的结果成为密文ciphertext。

cipher

对称密钥

对称密钥Symmetric-key algorithm又称为共享密钥加密,对称密钥在加密和解密的过程中使用的密钥是相同的,常见的对称加密算法有DES、3DES、AES、RC5、RC6。对称密钥的优点是计算速度快,但是它也有缺点,密钥需要在通讯的两端共享,让彼此知道密钥是什么对方才能正确解密,如果所有客户端都共享同一个密钥,那么这个密钥就像万能钥匙一样,可以凭借一个密钥破解所有人的密文了,如果每个客户端与服务端单独维护一个密钥,那么服务端需要管理的密钥将是成千上万,这会给服务端带来噩梦。下面就是一个简单的对称加密,将明文加密成 ASCII。


  1. # 加密的方式:在ASCII的基础上 + 密钥的值
  2. def encipher(plain_text, key):
  3. # 加密
  4. cipher_text = []
  5. for c in plain_text:
  6. cipher_text.append(str(ord(c) + key))
  7. return ' '.join(cipher_text)
  8. def decipher(cipher_text, key):
  9. # 解密
  10. plain_text = []
  11. for c in cipher_text.split(" "):
  12. plain_text.append(chr(int(c)+key))
  13. return "".join(plain_text)
  14. if __name__ == '__main__':
  15. print "cipher_text:", encipher("abcdef", 0)
  16. print "plain_text:", decipher("97 98 99 100 101 102", 0)

非对称密钥

非对称密钥public-key cryptography,又称为公开密钥加密。服务端会生成一对密钥,一个私钥保存在服务端,仅自己知道,另一个是公钥,公钥可以自由发布供任何人使用。客户端的明文通过公钥加密后的密文需要用私钥解密。非对称密钥在加密和解密的过程的使用的密钥是不同的密钥,加密和解密是不对称的,所以称之为非对称加密。与对称密钥加密相比,非对称加密无需在客户端和服务端之间共享密钥,只要私钥不发给任何用户,即使公钥在网上被截获,也无法被解密,仅有被窃取的公钥是没有任何用处的。常见的非对称加密有 RSA,非对称加解密的过程:

  1. 服务端生成配对的公钥和私钥
  2. 私钥保存在服务端,公钥发送给客户端
  3. 客户端使用公钥加密明文传输给服务端
  4. 服务端使用私钥解密密文得到明文

数字签名Digital Signature

数据在浏览器和服务器之间传输时,有可能在传输过程中被冒充的盗贼把内容替换了,那么如何保证数据是真实服务器发送的而不被调包呢,同时如何保证传输的数据没有被人篡改呢?要解决这两个问题就必须用到数字签名,数字签名就如同日常生活的中的签名一样,一旦在合同书上落下了你的大名,从法律意义上就确定是你本人签的字儿,这是任何人都没法仿造的,因为这是你专有的手迹,任何人是造不出来的。那么在计算机中的数字签名怎么回事呢?数字签名就是用于验证传输的内容是不是真实服务器发送的数据,发送的数据有没有被篡改过,它就干这两件事,是非对称加密的一种应用场景。不过他是反过来用私钥来加密,通过与之配对的公钥来解密。

第一步:服务端把报文经过 Hash 处理后生成摘要信息Digest,摘要信息使用私钥private-key加密之后就生成签名,服务器把签名连同报文一起发送给客户端。 

signature1

第二步:客户端接收到数据后,把签名提取出来用公钥public-key解密,如果能正常的解密出来 Digest2,那么就能确认是对方发的。 
第三步:客户端把报文 Tex t提取出来做同样的 Hash 处理,得到的摘要信息 Digest1,再与之前解密出来的 Digist2 对比,如果两者相等,就表示内容没有被篡改,否则内容就是被人改过了。因为只要文本内容哪怕有任何一点点改动都会 Hash 出一个完全不一样的摘要信息出来。

signature2

数字证书Certificate Authority

数字证书简称 CA,它由权威机构给某网站颁发的一种认可凭证,这个凭证是被大家(浏览器)所认可的。为什么需要用数字证书呢,难道有了数字签名还不够安全吗?有这样一种情况,就是浏览器无法确定所有的真实服务器是不是真的是真实的,举一个简单的例子:

A 厂家给你们家安装锁,同时把钥匙也交给你,只要钥匙能打开锁,你就可以确定钥匙和锁是配对的,如果有人把钥匙换了或者把锁换了,你是打不开门的,你就知道肯定被窃取了,但是如果有人把锁和钥匙替换成另一套表面看起来差不多的,但质量差很多的,虽然钥匙和锁配套,但是你却不能确定这是否真的是 A 厂家给你的,那么这时候,你可以找质检部门来检验一下,这套锁是不是真的来自于 A 厂家,质检部门是权威机构,他说的话是可以被公众认可的(呵呵)。

同样的, 因为如果有人(张三)用自己的公钥把真实服务器发送给浏览器的公钥替换了,于是张三用自己的私钥执行相同的步骤对文本 Hash、数字签名,最后得到的结果都没什么问题,但事实上浏览器看到的东西却不是真实服务器给的,而是被张三从里到外(公钥到私钥)换了一通。

那么如何保证你现在使用的公钥就是真实服务器发给你的呢?我们就用数字证书来解决这个问题。数字证书一般由数字证书认证机构Certificate Authority颁发,证书里面包含了真实服务器的公钥和网站的一些其他信息,数字证书机构用自己的私钥加密后发给浏览器,浏览器使用数字证书机构的公钥解密后得到真实服务器的公钥。这个过程是建立在被大家所认可的证书机构之上得到的公钥,所以这是一种安全的方式。

原文发布时间为:2017-11-15

本文来自合作伙伴“Linux中国”

时间: 2024-08-30 17:33:55

HTTPS 中的加密算法相关概念的相关文章

HTTPS中的加密算法相关概念

密码学在计算机科学中使用非常广泛,HTTPS 就是建立在密码学基础之上的一种安全的通信协议.HTTPS 早在 1994 年由网景公司首次提出,而如今在众多互联网厂商的推广之下 HTTPS 已经被广泛使用在各种大小网站中.在完全理解 HTTPS 之前,有必要弄清楚一些密码学相关的概念,比如:明文.密文.密码.密钥.对称加密.非对称加密.摘要.数字签名.数字证书. 密码(cipher) 密码学中的密码(cipher)和我们日常生活中所说的密码不太一样,计算机术语『密码 (cipher)』是一种用于加

iOS中MD5加密算法的介绍和使用_IOS

前言 软件开发过程中,对数据进行加密是保证数据安全的重要手段,常见的加密有Base64加密和MD5加密.Base64加密是可逆的,MD5加密目前来说一般是不可逆的. MD5生成的是固定的128bit,即128个0和1的二进制位,而在实际应用开发中,通常是以16进制输出的,所以正好就是32位的16进制,说白了也就是32个16进制的数字. MD5主要特点是 不可逆,相同数据的MD5值肯定一样,不同数据的MD5值不一样(也不是绝对的,但基本是不能一样的). MD5算法还具有以下性质:       1.

HTTPS背后的加密算法(转)

当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信.InfoQ的这篇文章对此有非常详细的描述.这些复杂的步骤的第一步,就是浏览器与服务器之间协商一个在后续通信中使用的密钥算法.这个过程简单来说是这样的: 浏览器把自身支持的一系列Cipher Suite(密钥算法套件,后文简称Cipher)[C1,C2,C3, -]发给服务器: 服务器接收到浏览器的所有Cipher后,与自己支持的套件作对比,如果找到双方都支持的Cipher,则告知浏览器: 浏

HTTPS 背后的加密算法

当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信.InfoQ的这篇文章对此有非常详细的描述.这些复杂的步骤的第一步,就是浏览器与服务器之间协商一个在后续通信中使用的密钥算法.这个过程简单来说是这样的: 浏览器把自身支持的一系列Cipher Suite(密钥算法套件,后文简称Cipher)[C1,C2,C3, -]发给服务器: 服务器接收到浏览器的所有Cipher后,与自己支持的套件作对比,如果找到双方都支持的Cipher,则告知浏览器: 浏

揭秘HTTPS中S的另一面

就在我们刚刚弄清楚浏览器地址栏中"HTTPS"的重要性时,垃圾邮件发送者和恶意攻击者早就已经知道应该怎么将系统玩弄于股掌之间了. 1.png Let's Encrypt Let's Encrypt是一款自动化服务,它可以利用证书来帮助用户将此前未加密的URL地址转换成经过加密且安全系数更高的HTTPS地址.这就非常棒了,尤其是在这个证书价格贵过黄金的年代,很多永和根本负担不起这样的开销.所以由此不难看出,Let's Encrypt在提升网络安全性和用户体验度方面毫无疑问地做出了巨大的贡

详解.NET中的加密算法总结(自定义加密Helper类续)_实用技巧

1.1.1 摘要 相信许多人都使用过.NET提供的加密算法,而且在使用的过程我们必须了解每种加密算法的特点(对称或非对称,密钥长度和初始化向量等等).我也看到过很多人写过.NET中加密算法总结,但我发现个别存在一些问题,很多人喜欢罗列每种加密算法的具体实现,假设我们要求实现AES和Triple DES加密算法,的确可以很多地分别给出它们的具体实现.  那我们真的有必要给出每个加密算法的具体实现吗?而且这样的设计不符合OOP设计思想,最重要的是我们要维护多个加密算法啊!OK接下来让我们实行一个可扩

PHP中的命名空间相关概念浅析_php技巧

1. PHP中的命名空间是什么? 什么是命名空间?"从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色.具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件.另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /

Delphi中的加密算法(MD5,MD4,MD3...)

在Delphi自带的Indy控件中其实是提供了MD2,MD4,MD5对象的,我们可以直接使用它们来完成MD5的签名算法.而不需要再去找其它的DLL或是Pas了.在Uses单元中引用 IdHashMessageDigest 单元,再写如下代码即可以达到MD5的实现. 示例代码 procedure TForm1.Button1Click(Sender: TObject);var  MyMD5: TIdHashMessageDigest5;  Digest: T4x4LongWordRecord;be

自制Https证书并在Spring Boot和Nginx中使用(转)

白话Https一文中, 介绍了Https存在的目的和工作原理,但多是偏向于原理性的介绍,本文介绍如何一步一步自制一个能够通过浏览器认证的Https证书,并讲解在Spring Boot环境和Nginx环境中服务器端的配置. 如果你还没有读过白话Https,我强烈建议你先去读一下.按照白话Https中的介绍,Https协议涉及到的主体主要有三个:客户端.服务端.以及CA机构.如下图所示: 在白话Https一文中,曾介绍一个服务要申请使用Https的流程.本文所介绍的流程,针对自制Https证书,更多