80端口:80端口是为HTTP(HyperText Transport Protocol)即超文本传输协议开放的默认端口。
443端口:443端口即网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP。是https的默认端口。
小结:访问网页如不加端口号,使用http协议访问网页,是请求的服务器的80端口;使用https协议请求的是服务器的443端口。
SSL(Secure Sockets Layer 安全套接层):位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport LayerSecurity,传输层安全协议):用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
**TLS记录协议:**是一种分层协议,,这种协议被用来封装几种高层协议(如HTTP,SMTP等)。使用有TLS握手协议产生的安全参数,它首先将上层被传输的数据分片成便于管理的块,然后对数据有选择性地压缩,计算出消息认证码MAC(如MD5或SHA),加密(如NULL,DES,3DES等),最后将结果送出。接收到的数据经过解密,校验,解压缩,重组后被传输到上层客户端。TLS记录协议位于TLS握手协议的下面,在可靠的传输协议(如TCP/IP)上面。其负责识别不同的消息类型,以及每条消息的完整性、安全性验证。
**小结:**两个协议都是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。SSL协议的发展历史比较早,第一版由于漏洞比较多,1994年公布了第二个版本。1996年5月, TLS工作组成立,开始将SSL从Netscape迁移至IETF。SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。 SSL 3.0和TLS 1.0有轻微差别,但两种规范其实大致相同。
网景公司(Netscape)在1994年推出首版网页浏览器,网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布第一版TLS标准文件。随后又公布RFC 5246 (2008年8月)与 RFC 6176 (2011年3月)。在浏览器、电子邮件、即时通信、VoIP、网络传真等应用程序中,广泛支持这个协议。
X.509: 是密码学里公钥证书的格式标准。 X.509 证书己应用在包括TLS/SSL在内的众多 Intenet协议里.同时它也用在很多非在线应用场景里,比如电子签名服务。X.509证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。对于一份经由可信的证书签发机构签名或者可以通过其它方式验证的证书,证书的拥有者就可以用证书及相应的私钥来创建安全的通信,对文档进行数字签名.
**OpenSSL:**OpenSSL是一个开源项目,包括密码库和SSL/TLS工具集。 OpenSSL项目是安全套接字层(secure sockets layer, SSL)和传输层安全(transport layer security, TLS)协议的一个实现,是大家共同努力开发出的代码可靠、功能齐全、商业级别的开源工具集。 可以使用该项目生成数字证书。
HTTPS:超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS、HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。它其实就是HTTP+加密+身份认证+完整性保护
开放系统互联(open systems interconnection, OSI):网络通信的理论模型,简单来说,所有的功能都被映射到七个层上。最底层是最接近物理通信链路的层,后面的层依次建立在其他层之上,提供更高级别的抽象。最顶层就是应用层,携带着应用数据
层号 | OSI层 | 描述 | 协议示例 |
7 | 应用层 | 应用数据 | HTTP、 SMTP、 IMAP |
6 | 表示层 | 数据表示、转换和加密 | SSL/ TLS |
5 | 会话层 | 多连接管理 | |
4 | 传输层 | 包或流的可靠传输 | TCP、 UDP |
3 | 网络层 | 网络节点间的路由与数据分发 | IP、 IPSec |
2 | 数据链路层 | 可靠的本地数据连接( LAN) | 以太网 |
1 | 物理层 | 直接物理数据连接(电缆) | CAT5 |
现实中的协议并非总能与OSI模型完全对应。比如SPDY和HTTP/2因为要对连接进行管理,所以被归入会话层协议,但它们却在数据加密以后生效。第五层及更高层的划分经常是模糊的。
<center>OSI参考模型 和 TCP/IP协议群</center>
一般遵从X.509格式规范的证书,会有以下的内容,它们以字段的方式表示:
向证书机构申领签发电子证书的进程
数字证书一般由数字证书认证机构签发,简单的程序如下:
主条目:公开密钥加密 § 加密过程
电子证书可以二进制或Base64形式存储,常见的二进制文件扩展名有 .cer、.crt、.der,Base64的文件扩展名则通常是 .pem。如果把证书和私钥一起存储,则可以使用PKCS#12(.p12)格式。
HTTPS是利用SSL/TLS来加密数据包的。本结通过TLS 1.2 的宏观概述,来理解HTTPS的工作原理。
TLS协议由两层组成:TLS记录协议和TLS握手协议。
每一个TLS连接都会以握手开始。 尽管可以选择对任意一端进行身份验证,但人们几乎都启用了对服务器的身份验证。完整的握手如图所示
客户端发起TLS握手请求
struct {
ProtocolVersion client_version;
Random random;
SessionID session_id;
CipherSuite cipher_suites<2..2^16-2>;
CompressionMethod compression_methods<1..2^8-1>;
select (extensions_present) {
case false:
struct {};
case true:
Extension extensions<0..2^16-1>;
};
} ClientHello;
数据包括内容:
ProtocolVersion/协议版本(客户端期望支持的握手协议版本)
Random/安全随机数(MasterSecret生成用到,协议文档里面说是28个字节,但是实际抓包看到是32个字节,这里怀疑是各个协议文档版本不同,还有使用加密套件的不同,导致的差异,具体博主就没有在继续深究了,如果有朋友知道可以留言给我)
SessionID/会话ID
CipherSuite/加密套件(客户端支持的加密套件列表)
如果sessionid不为空,可以不传这个值,服务端可以从上一次会话中恢复这个值。
每个加密组件(Cipher Suite)都包括了下面5类算法
TLS Cipher Suite Registry
,图中百度使用的是就是
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
这个加密套件:
RSA
AEAD_AES_128_GCM
SHA256
ECDHE
CompressionMethod/压缩方法
Extension/扩展数据(session ticket在扩展里面,可见下图)
服务端回应Client Hello请求
struct {
ProtocolVersion server_version;
Random random;
SessionID session_id;
CipherSuite cipher_suite;
CompressionMethod compression_method;
select (extensions_present) {
case false:
struct {
};
case true:
Extension extensions<0..2^16-1>;
};
} ServerHello;
主要发送数据内容:
消息如下面所示:
公钥
和私钥
,公钥会做到证书里面,私钥则会给到网站方。网站方的信息
和网站方的公钥
、签名算法
等信息(就是Wireshark Packet 20中的数据,除了“签名值”),计算一个hash值(图中hash算法是SHA256),然后CA再用自己私钥做加密(图中公开密钥算法是RSA),最后的这个密文就是“数字签名”(也就是我们在图中看到“encrypted”签名值)。* 浏览器通常也会内置大多数主流权威CA的根证书。
* 如果查找不到对应的可信CA,则判断这个证书是伪造的,不可信的。(浏览器则会提醒该证书不是可信任机构颁发的,并询问是否要继续访问)
CA机构证书
里面的公钥
信息,将网站方证书
中的签名值
(也就是数字签名)做解密,得到网站证书
信息的hash摘要A。网站证书
中的信息,做hash得到摘要B,比对摘要A和摘要B是否一致。如果不一致,说明网站证书
中的信息被修改了。(浏览器则会提醒该证书不是可信任机构颁发的,并询问是否要继续访问)公钥
,用于后面的握手签名。证书
公钥对签名值解密,获得摘要A。并将这次数据明文做SHA512的hash,获得摘要B,做比对。(这里对协商算法做签名校验,目的可能是防止中间人对协商算法方式做篡改,虽然DH算法不担心公钥在不安全的网络中传输,但是其他算法可能需要考虑被篡改的情况。所以猜测服务端密钥协商时做签名是这个目的,因为服务端这时已经确定是DH算法了,所以客户端协商时就不需要做签名了,DH算法不需要考虑这个安全问题)服务端密钥协商的公钥以及自己的公钥
EC Diffie-Hellman
密钥协商协议为例,来看看客户端、服务端是怎么协商出相同的密钥的(这里协商出来的是PreMasterSecret,不是最终的对称加密用到的密钥)。struct {
opaque verify_data[verify_data_length];
} Finished;
verify_data
PRF(master_secret, finished_label,Hash(handshake_messages))
[0..verify_data_length-1];
verify_data = PRF(master_secret, finished_label, Hash(handshake_messages))
PRF是伪随机函数(pseudorandom function,PRF)
master_secret是密钥协商时,计算出来的
finished_label:对客户端发的Finished消息来说,固定是字符串 “client finished”. 对服务器发的Finished消息来说,固定是字符串 “server finished”.
handshake_messages,是各端握手过程中发送的所有消息的,类型如下:
struct {
HandshakeType msg_type; /* handshake type */
uint24 length; /* bytes in message */
select (HandshakeType) {
case hello_request: HelloRequest; //HelloRequest是服务端在任何时候都可以发出的,告诉客户端需要重新进行握手协议,客户端随即发送新的ClientHello
case client_hello: ClientHello;
case server_hello: ServerHello;
case certificate: Certificate;//服务端或客户端发送自己证书给客户端。
case server_key_exchange: ServerKeyExchange;
case certificate_request: CertificateRequest;//服务端请求,客户端发送自己的客户端证书,给服务端做校验。这个步骤在博文中没有提到,看以后有需要再了解。
case server_hello_done: ServerHelloDone;
case certificate_verify: CertificateVerify;//客户端发出,从client hello开始,一直到CertificateVerify之前的所有消息的hash加上客户端证书对应私钥的加密结果。
case client_key_exchange: ClientKeyExchange;
case finished: Finished;
} body;
} Handshake;
但不包括ChangeCipherSpec、alerts之类的消息。并且最后一个发送Finished的一方,需要把前一个发送Finished的内容包括进去。
注意这里每个端发送自己的握手消息就可以,比如Client发送内容包括ClientHello、Certificate(有发送的话)、CertificateVerify(如果有发送的话)、ClientKeyExchange、Finished(如果是最后一方需要包含)。服务端同理。
如果服务端想使用Ticket方式存储session状态,在Server Change Cipher Spec之前就需要发送New Session Ticket消息。
New Session Ticket方式与Session ID方式对比:
SessionID方式,客户端在ClientHello的时候带着上一次SessionID过来,服务端从自己内存中查找SessionID对应的session状态,并读取session状态快速恢复。
SessionTicket方式,则是将session状态加密后,发送给客户端存储。客户端在ClientHello时将SessionTicket带上,服务端就将其解密,读取出里面存储的session状态信息,SessionTicket存储的信息如下:
struct {
ProtocolVersion protocol_version; //协议版本
CipherSuite cipher_suite; //加密套件类型
CompressionMethod compression_method; //压缩方法
opaque master_secret[48]; //对称密钥
ClientIdentity client_identity; //客户端ID
uint32 timestamp;//ticket有效期
} StatePlaintext;
伪随机数函数:
PRF 是一个“伪随机数函数”,这个函数很聪明,在规约中也有定义。它使用基于哈希的消息验证码(HMAC)的MD5和SHA-1两种哈希函数将密钥,ASCII 字符以及我们给的种子结合起来。对每个哈希函数发送一半的输入。说它聪明的原因是即使面对MD5和 SHA-1 的弱点,它的防攻击能力还很强。这个过程可以自我反馈并不停地循环,而且我们要多少字节就能生成多少。
依照这个过程,我们获得以下 48 字节的“master secret”:
4C AF 20 30 8F 4C AA C5 66 4A 02 90 F2 AC 10 00 39 DB 1D E0 1F CB E0 E0 9D D7 E6 BE 62 A4 6C 18 06 AD 79 21 DB 82 1D 53 84 DB 35 A7 1F C1 01 19
多个密钥的生成
现在双方都有了“master secrets”,规约描述了我们如何生成会话所需的所有的密钥,我们需要使用 PRF 函数来创建一个“key block”,然后从这个块中提取所需的密钥:
key_block = PRF(SecurityParameters.master_secret, “key expansion”, SecurityParameters.server_random + SecurityParameters.client_random);
“key_block”被用来提取以下密钥:
client_write_MAC_secret[SecurityParameters.hash_size]
server_write_MAC_secret[SecurityParameters.hash_size]
client_write_key[SecurityParameters.key_material_length]
server_write_key[SecurityParameters.key_material_length]
client_write_IV[SecurityParameters.IV_size]
server_write_IV[SecurityParameters.IV_size]
1 – client_write_MAC_secret 客户端MAC密钥,生成消息的认证码,对方用其验证消息
2 – server_write_MAC_secret 服务器MAC密钥,生成消息的认证码,对方用其验证消息
3 – client_write_key 客户端加密密钥,加密客户端发送的消息,对方用其解密
4 – server_write_key 服务器加密密钥,服务器加密发送的消息,对方用其解密
5 – client_write_IV 客户端IV,与客户端加密密钥配合使用(分组密码算法)
6 – server_write_IV 服务器IV,与服务器加密密钥配合使用(分组密码算法)
由于这里使用的是序列密码而非分组密码(如高级加密标准AES),所以不需要初始向量(Initialization Vectors IV),而只是双方各需要一个 16 字节(128 比特)的消息验证码(Message Authentication Code MAC),这是因为指定的 MD5 哈希摘要大小是 16 字节。另外,RC4 加密算法使用的 16 字节的密码也是双方都需要的。最后,我们需要 key block 中的 216 + 216 = 64 个字节:
运行 PRF,我们得到:
client_write_MAC_secret = 80 B8 F6 09 51 74 EA DB 29 28 EF 6F 9A B8 81 B0
server_write_MAC_secret = 67 7C 96 7B 70 C5 BC 62 9D 1D 1F 4A A6 79 81 61
client_write_key = 32 13 2C DD 1B 39 36 40 84 4A DE E5 6C 52 46 72
server_write_key = 58 36 C4 0D 8C 7C 74 DA 6D B7 34 0A 91 B6 8F A7
准备加密!
上面的实例描述了TLS握手协议的流程,内容比较多。其中有几处关键的加密过程这里再总结一下。
**公钥和私钥:**加密算法分为两种,对称加密和非对称加密。
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。
使用公钥和私钥的加密方式是非对称加密。公钥和私钥的名称区别是已秘钥提供者来做区分的。不管服务器还是客户端,向申请者提供的密钥都是公钥,自己保存的私钥。也就是说服务器和客户端都是可以充当密钥提供方的角色的,私钥只能保存在秘钥提供方的手里,而公钥是可以公开的。如果需要和密钥提供方进行交互,就需要使用对应的密钥提供发提供的公钥对数据加密,加密后的数据只有密钥提供方来使用自己的私钥来解密。总结来说就是:公钥加密,私钥解密;客户端和服务器都可能有自己对应的公钥和私钥。
**三个随机数:**握手过程中产生了三个随机数
第一个随机数是客户端发送Client Hello请求时,在客户端生成,发送给服务器的。
第二个随机数是服务器发送Server Hello请求时,在服务器生成,发送给客户端的。
第三个随机数是客户端校验证书通过后,在客户端生成的。这个随机数会通过证书里面的公钥进行加密,然后再发给服务器,这个随机数称为PreMasterSecret。(这是使用RSA算法实现的,其他的密钥交换算法还有DHE_RSA、ECDHE_RSA和ECDHE_ECDSA 后面的这三种算法实现起来都RSA复杂,如果不是做这方面的业务或者数学功底比较强的,建议不要去研究)。
三个随机数用来生成MasterSecret
《HTTPS权威指南》
为什么80%的码农都做不了架构师?>>> ...
最近在用python写遗传算法时,发现需要将十进制的整数转换成二进制数,那么怎么来转换呢?当然如果你学过进制转换的有关计算方法,你可以手动编写一些函数来实现,不过总体来说还是比较麻烦的,这里介绍python内置的两个函数bin()和int(),利用这两个函数可以轻轻松松完成转换。一、十进制整数转换成二进制数代码如下:num = 8numb = bin(num)print(numb)这段代码的输出结..._10进制转7进制代码python
关于poi、jxl和esayExcel的介绍自行百度。jxl最多支持03版excel,所以单个sheet页面最多只能导出65536条数据。我直接将excel导入到浏览器并打开,以下统计导出时长指将数据从数据库查询,并写入到excel的过程。不包括打开excel所消耗的时间为了接近真实场景,我建了一个表,一共有32个字段,其中2个id:一个自增长、一个UUID,10个int型字段,10个String..._apache poi jxl easyexcel的对比
os : debian 8.2 pgbouncer: 1.5.4 libevent: 2.0.21 libevent-dev: 2.0.21本次采用的时 apt-get 方式安装安装 libevent# apt-get install libevent-2.0-5正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 ...
页面的最上方加上:date_default_timezone_set(PRC); /*把时间调到北京时间,php5默认为格林威治标准时间*/date ()a: "am"或是"pm"A: "AM"或是"PM"d: 几日,两位数字,若不足则补零;从"01"至"31"D: 星期几,3个英文字母,如:"Fri"F: 月份,英文全名,如:"January"h: 12小时制的..._php date('w')
安装步骤:1、使用root账户登录2、在标题栏,选择安装VMware Tools工具3、双击桌面光驱图标,选择复制VMwareTools-10.2.5-8068393.tar.gz4、进去桌面主文件夹,点击其他位置,在点击计算机,进去目录后通过右键新建一个文件夹tools。5、把VMwareTools-10.2.5-8068393.tar.gz复制到tools里并解压。..._卸载vmware tools
目录1、输入框只能输入数字、字母和中文,不能输入特殊字符、表情和不包括空格;2、控制输入的字符数量,例如只能输入11个字符3、仅控制不能输入表情4、金额的输入框限制只能输入一位小数点,小数点后保留2位小数,控制最多输入12位数字1、输入框只能输入数字、字母和中文,不能输入特殊字符、表情和不包括空格;思路:在输入的过程中,判断当前输入的文字是不是数字、字母和中文,因为特殊字符的范围很大,所以只控制输入的是满足条件的即可。代码:在String的extension中添加下面方法._ios swift 输入框禁止中文
核心代码来自互联网,为了更容易测试,我做了个简单的界面。 Code: import java.awt.Color; import java.awt.Font; import java.awt.Insets; import java.awt.event.ActionE_java 统计汉字笔画
<template> <div id="Dynamic" :style="{width:fullWidth+'px',height:fullHeight+'px'}"> <!-- 轮播图区域 --> <div class="banner_div"> <el-carousel :interval="interval" trigger="click" :height="bannerHeight+'px'"> ...
有个题目,要求按照下图格式显示 ASCII 码、16 进制形式和 10 进制的形式。原题链接:http://zhidao.baidu.com/question/510082443.html做而论道编写的程序如下:ASSUME CS:CODE, DS:DATA;-------------------------------------------DATA SEGMENT HHH DW ? _80x86语言显示图片
CS50 2017 Week 0 笔记
对于一个web工程的filter过滤器注解方式配置后的优先级问题,很多教程写到按filter名字排序的顺序来进行过滤,最近发现了个小问题,分享一下。我是用的tomcat发布工程, 对于注解配置的filter**分系统**(猜的):在Windows本地tomcat服务器上,优先级只参考filer名字的第一个字母在字母表的顺序,靠前的优先级高,不区分大小写。如名为A、b、C、DD四个fil..._filter优先级参数