当前位置: 首页 > news >正文

黄石商城网站建设玛酷机器人少儿编程加盟

黄石商城网站建设,玛酷机器人少儿编程加盟,公司注册网上核名通不过,全文搜索引擎有哪些目录 基础理论入门HTTPS对称加密非对称加密证书TLS握手过程握手总结 TLS 定义(记录层/握手层)HTTPS HTTP over TLS加密记录层分片 (Fragmentation)记录压缩和解压缩 (Record compression and decompression)空或标准流加密 (Null or standard stream cipher)CBC 块加密 (分组加… 目录 基础理论入门HTTPS对称加密非对称加密证书TLS握手过程握手总结 TLS 定义(记录层/握手层)HTTPS HTTP over TLS加密记录层分片 (Fragmentation)记录压缩和解压缩 (Record compression and decompression)空或标准流加密 (Null or standard stream cipher)CBC 块加密 (分组加密)记录有效载荷保护 (Record payload protection)密钥计算 (Key calculation) 握手层完整握手ClientHelloServerHelloCertificateServerKeyExchangeServerHelloDoneverify certificateClientKeyExchangeChangeCipherSpecFinished (Encrypted Handshake Message)Serverchange_cipher_specFinished (Encrypted Handshake Message)握手结束加密通信 密钥交换和签名算法常用的密钥交换和签名算法RSA 密钥交换和 DH 密钥交换的区别 客户端身份验证CertificateRequestCertificateVerify 会话恢复 参考https://juejin.cn/post/6844903667577929742 参考https://zhuanlan.zhihu.com/p/594278172 基础理论入门 参考https://www.bilibili.com/video/BV1KY411x7Jp/?spm_id_from333.788vd_sourcecc0e43b449de7e8663ca1f89dd5fea7d HTTPS 如上图所示http请求和响应的报文都是明文的只要有点http基础的人都能看得懂报文里面的内容所以需要给http增加安全性也就是https。https并不是一个单独的协议只不过在http的基础上用TLS/SSL进行加密。 SSL是TLS的前身他们都是加密安全协议。现在绝大部分浏览器都不支持SSL而是支持TLS不过SSL的名声很大(openSSL库都是以SSL命名的)所以很多人会把这连个名字混用TLS/SSL两者关系就像是王老吉和加多宝。 对称加密 加密和解密使用同样的规则算法(钥匙)这就是对称加密如果第三方知道加密的规则后就很同意破解了。 非对称加密 如上图所示最终混出来的“便便色”只有小青和小红知道他们就可以用这个“便便色”秘钥给数据进行加密了这就是非对称加密的核心所在。用两个秘钥来进行加密和解密公开秘钥是所有人都知道的秘钥私有秘钥仅仅是持有方才有的秘钥。 一般来说私钥就放在服务器里数据经过公钥加密就只能被私钥解密数据经过私钥加密就只能被公钥解密。 如果用到客户端和服务端的话就是服务端拥有自己成对的私钥和公钥然后公布自己的公钥让客户端知道客户端用公钥把自己的数据进行加密加密后用公钥反而无法解密这段数据一定要用服务端的私钥才能解密这样的非对称加密其实也叫公钥加密因为不同于对称加密中只使用一把私钥性加密。对称加密和非对称加密TLS都有用上后面介绍。 证书 虽然我们现在可以对数据进行加密但是我们还是不知道和我沟通的是否是自己想要沟通的对象比如B站的域名www.bilibili.com很多人容易输入错误比如www.bi1ibili.com这样就可能会有不法分子伪装B站域名让你来访问。还好HTTPS解决了这个问题因为服务端需要申请SSL证书来证明这个域名就是大家所熟知的B站。 SSL证书其实就是保存在源服务器的数据文件要让SSL证书生效就需要向CA申请也就是Certificate Authority证书授权中心这是第三方的机构这样大家都来信任这个机构颁发的证书这个证书表明域名是属于谁的日期等信息以外重要的是这个证书里还包括了特定的公钥和私钥。简单来说服务器安装了SSL证书以后用户就可以通过HTTPS来访问服务器了浏览器也会把HTTP默认的端口80改成HTTPS默认的443。 那现在浏览器通过HTTPS访问服务器具体会有哪些变化呢根据不同的TLS版本会有不同的变化这里就以TLS1.2为例子进行讲解。 TLS握手过程 首先正常的TCP三次握手是不变的。三次握手后客户端发送了一个Client Hello给服务端客户端就会告诉服务端支持的TLS 1.2版本和支持的加密套件这里16个加密套件可以理解为不同的加密算法组合然后生成一个随机数发给服务端随机数的作用等会告诉大家。 服务端收到客户端打招呼当然也要和客户端打招呼所以接下来就是Server Hello发给客户端在响应报文里面会告诉客户端服务端确认支持的TLS版本以及选择的加密套件并且服务器也生成一个随机数发给客户端随机数的作用等会介绍。 接下来服务器会再发送一个响应来出示服务器自己的证书这样浏览器就可以根据对照自己的证书信任列表来确认这个服务器是否可信。 发了证书当然少不了公钥了于是下一步Server Key Exchange这里服务器就把公钥发送给了客户端注意不会傻傻的把私钥发出去。如果服务器也想要客户端的证书也会在这里发出请求比如登录网银就可能需要这个步骤了。 服务器一下发了这么多响应最后还要告诉客户端发送完了于是就是Server Hello Done。 打个招呼花了这么久而且截止到目前这些请求和响应依旧还未进行加密。现在就轮到客户端来处理这些响应了。Client Key Exchange这一步是个重点也是难点客户端会生成第三个随机数也叫预主秘钥。这第三个随机数会用刚刚收到的公钥进行加密并且把这个加密后的随机数发送给服务器正是这里的Pubkey显示的随机数。 接下来就是Change Cipher Spec这一步就是告诉服务器往后的数据就用商议好的算法和秘钥来加密了。最后Encrypted Handshake Message表示客户端这边的TLS协商已经没有问题了加密开始。 同样的后面服务器也发来了Encrypted Handshake Message表示服务器这边准备好了这里也表示着TLS的握手已经成功了可以给数据加密进行交换了。 握手总结 1、客户端向服务端打招呼并且把自己支持的TLS版本加密套件发给服务端同时还生成了一个随机数给服务端这里就称为第一个随机数。 2、服务端打招呼服务端确认支持的TLS版本以及选择的加密套件并且服务器也生成一个随机数发给客户端这里就称为第二个随机数。 3、4、5、接着服务端把证书和公钥发送给客户端都发送完毕就告知客户端。 6、现在客户端这边生成随机数我们称为第三个随机数——预主秘钥这个预主秘钥不会直接发送出去而是用刚刚收到的公钥进行加密后再发送出去然后客户端这边的TLS协商已经没问题了加密开始。 服务端收到加密后的预主秘钥以后会用自己的私钥进行解密这样服务器就知道预主秘钥了而且只有客户端和服务端知道预主秘钥因为没有直接传输没有其他人知道这预主秘钥是什么除非私钥被泄露了。 7、最后客户度用预主秘钥第一随机数和第二随机数计算出会话秘钥服务端也用预主秘钥第一随机数和第二随机数计算出会话秘钥各自得到的会话秘钥是相同的这里的道理和前面说的“便便色”是同样的道理。 也就是说前面的步骤都是非对称加密为了得到这个会话秘钥会面的会话大家都只使用这个会话秘钥对数据进行加密也就是后面使用的对称加密大家都使用同一个私钥。后面不使用非对称加密是因为大家都能看到消耗资源非常大。而且得到会话秘钥以后就没人知道秘钥是什么了因此后面对称加密。如果与其他服务器沟通就是建立新的会话会话秘钥也不相同会话秘钥只应用在当前会话更加提高了安全性。 TLS 定义(记录层/握手层) SSL(Secure Sockets Layer) 安全套接层是一种安全协议经历了 SSL 1.0、2.0、3.0 版本后发展成了标准安全协议 - TLS(Transport Layer Security) 传输层安全性协议。TLS 有 1.0 (RFC 2246)、1.1(RFC 4346)、1.2(RFC 5246)、1.3(RFC 8446) 版本。 TLS 在实现上分为 记录层 和 握手层 两层其中握手层又含四个子协议: 握手协议 (handshake protocol)、更改加密规范协议 (change cipher spec protocol)、应用数据协议 (application data protocol) 和警告协议 (alert protocol) HTTPS HTTP over TLS 只需配置浏览器和服务器相关设置开启 TLS即可实现 HTTPS。TLS 高度解耦可装可卸与上层高级应用层协议相互协作又相互独立。 加密 TLS/SSL 的功能实现主要依赖于三类基本算法散列函数 Hash、对称加密、非对称加密。利用非对称加密实现身份认证和密钥协商对称加密算法采用协商的密钥对数据加密基于散列函数验证信息的完整性。 TLS 的基本工作方式是客户端使用非对称加密与服务器进行通信实现身份验证并协商对称加密使用的密钥然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信不同的节点之间采用的对称密钥不同从而可以保证信息只能通信双方获取。 例如在 HTTPS 协议中客户端发出请求服务端会将公钥发给客户端客户端验证过后生成一个密钥再用公钥加密后发送给服务端非对称加密双方会在 TLS 握手过程中生成一个协商密钥对称密钥成功后建立加密连接。通信过程中客户端将请求数据用协商密钥加密后发送服务端也用协商密钥解密响应也用相同的协商密钥。后续的通信使用对称加密是因为对称加解密快而握手过程中非对称加密可以保证加密的有效性但是过程复杂计算量相对来说也大。 记录层 记录协议负责在传输连接上交换的所有底层消息并且可以配置加密。每一条 TLS 记录以一个短标头开始。标头包含记录内容的类型 (或子协议)、协议版本和长度。原始消息经过分段 (或者合并)、压缩、添加认证码、加密转为 TLS 记录的数据部分。 分片 (Fragmentation) 记录层将信息块分割成携带 2^14 字节 (16KB) 或更小块的数据的 TLSPlaintext 记录。 记录协议传输由其他协议层提交给它的不透明数据缓冲区。如果缓冲区超过记录的长度限制2^14记录协议会将其切分成更小的片段。反过来也是可能的属于同一个子协议的小缓冲区也可以组合成一个单独的记录。 struct {uint8 major, minor; } ProtocolVersion;enum {change_cipher_spec(20),alert(21),handshake(22),application_data(23), (255) } ContentType;struct {ContentType type; // 用于处理封闭片段的较高级协议ProtocolVersion version; // 使用的安全协议版本uint16 length; // TLSPlaintext.fragment 的长度以字节为单位不超过 2^14opaque fragment[TLSPlaintext.length]; // 透明的应用数据被视为独立的块由类型字段指定的较高级协议处理 } TLSPlaintext;记录压缩和解压缩 (Record compression and decompression) 压缩算法将 TLSPlaintext 结构转换为 TLSCompressed 结构。如果定义 CompressionMethod 为 null 表示不压缩。 struct {ContentType type; // same as TLSPlaintext.typeProtocolVersion version; // same as TLSPlaintext.versionuint16 length; // TLSCompressed.fragment 的长度不超过 2^14 1024opaque fragment[TLSCompressed.length]; } TLSCompressed;空或标准流加密 (Null or standard stream cipher) 流加密BulkCipherAlgorithm将 TLSCompressed.fragment 结构转换为流 TLSCiphertext.fragment 结构。 stream-ciphered struct {opaque content[TLSCompressed.length];opaque MAC[CipherSpec.hash_size]; } GenericStreamCipher;MAC 产生方法如下 HMAC_hash(MAC_write_secret, seq_num TLSCompressed.type TLSCompressed.version TLSCompressed.length TLSCompressed.fragment));seq_num记录的序列号、hashSecurityParameters.mac_algorithm 指定的哈希算法 MAC(Message authentication code) - 消息认证码 注意MAC 是在加密之前计算的。流加密加密整个块包括 MAC。对于不使用同步向量 (例如 RC4) 的流加密从一个记录结尾处的流加密状态仅用于后续数据包。如果 CipherSuite 是TLS_NULL_WITH_NULL_NULL则加密由身份操作 (数据未加密MAC 大小为零暗示不使用 MAC)组成。TLSCiphertext.length 是 TLSCompressed.length 加上CipherSpec.hash_size。 CBC 块加密 (分组加密) 块加密如 RC2 或 DES将 TLSCompressed.fragment 结构转换为块 TLSCiphertext.fragment 结构。 block-ciphered struct {opaque content[TLSCompressed.length];opaque MAC[CipherSpec.hash_size];uint8 padding[GenericBlockCipher.padding_length];uint8 padding_length; } GenericBlockCipher;padding: 添加的填充将明文长度强制为块密码块长度的整数倍。填充可以是长达 255 字节的任何长度只要满足 TLSCiphertext.length 是块长度的整数倍。长度大于需要的值可以阻止基于分析交换信息长度的协议攻击。填充数据向量中的每个 uint8 必须填入填充长度值 (即 padding_length)。 padding_length: 填充长度应该使得 GenericBlockCipher 结构的总大小是加密块长度的倍数。合法值范围从零到 255含。该长度指定 padding_length 字段本身除外的填充字段的长度加密块的数据长度TLSCiphertext.length是 TLSCompressed.lengthCipherSpec.hash_size 和 padding_length 的总和加一 示例: 如果块长度为 8 字节压缩内容长度TLSCompressed.length为 61 字节MAC 长度为 20 字节则填充前的长度为 82 字节padding_length 占 1 字节。 因此为了使总长度为块长度 (8 字节) 的偶数倍模 8 的填充长度必须等于 6所以填充长度可以为 61422 等。如果填充长度是需要的最小值比如 6填充将为 6 字节每个块都包含值 6。因此块加密之前的 GenericBlockCipher 的最后 8 个八位字节将为 xx 06 06 06 06 06 06 06其中 xx 是 MAC 的最后一个八位字节。 XX - 06 06 06 06 06 06 - 06 MAC - padding[6] - padding_length记录有效载荷保护 (Record payload protection) 加密和 MAC 功能将 TLSCompressed 结构转换为 TLSCiphertext。记录的 MAC 还包括序列号以便可以检测到丢失额外或重复的消息。 struct {ContentType type; // sameProtocolVersion version; // sameuint16 length; // TLSCiphertext.fragment 的长度不超过 2^14 2048select (CipherSpec.cipher_type) {case stream: GenericStreamCipher;case block: GenericBlockCipher;} fragment; // TLSCompressed.fragment 的加密形式带有 MAC } TLSCiphertext;注意 这里提到的都是先 MAC 再加密是基于 RFC 2246 的方案 (TLS 1.0) 写的。但新的方案选择先加密再 MAC这种替代方案中首先对明文和填充进行加密再将结果交给 MAC 算法。这可以保证主动网络攻击者不能操纵任何加密数据。 密钥计算 (Key calculation) 记录协议需要一种算法从握手协议提供的安全性参数生成密钥、IV 和 MAC secret。 主密钥 (Master secret): 在连接中双方共享的一个 48 字节的密钥 客户随机数 (client random): 由客户端提供的 32 字节值 服务器随机数 (server random): 由服务器提供的 32 字节值 握手层 握手协议的职责是生成通信过程所需的共享密钥和进行身份认证。这部分使用无密码套件为防止数据被窃听通过公钥密码或 Diffie-Hellman 密钥交换技术通信。密码规格变更协议用于密码切换的同步是在握手协议之后的协议。握手协议过程中使用的协议是“不加密”这一密码套件握手协议完成后则使用协商好的密码套件。警告协议当发生错误时使用该协议通知通信对方如握手过程中发生异常、消息认证码错误、数据无法解压缩等。应用数据协议通信双方真正进行应用数据传输的协议传送过程通过 TLS 应用数据协议和 TLS 记录协议来进行传输。 握手是 TLS 协议中最精密复杂的部分。在这个过程中通信双方协商连接参数并且完成身份验证。根据使用功能的不同整个过程通常需要交换 6~10 条消息。根据配置和支持的协议扩展的不同交换过程可能有许多变种。在使用中经常可以观察到以下三种流程(1) 完整的握手 对服务器进行身份验证(2) 恢复之前的会话采用的简短握手(3) 对客户端和服务器都进行身份验证的握手。 握手协议消息的标头信息包含消息类型1 字节和长度3 字节余下的信息则取决于消息类型 struct {HandshakeType msg_type;uint24 length;HandshakeMessage message; } Handshake;完整握手 每一个 TLS 连接都会以握手开始。如果客户端此前并未与服务器建立会话那么双方会执行一次完整的握手流程来协商 TLS 会话。握手过程中客户端和服务器将进行以下四个主要步骤: 交换各自支持的功能对需要的连接参数达成一致验证出示的证书或使用其他方式进行身份验证对将用于保护会话的共享主密钥达成一致验证握手消息并未被第三方团体修改 下面介绍最常见的握手规则一种不需要验证客户端身份但需要验证服务器身份的握手: ClientHello 这条消息将客户端的功能和首选项传送给服务器。 Version: 协议版本protocol version指示客户端支持的最佳协议版本。Random: 一个 32 字节数据28 字节是随机生成的 (图中的 Random Bytes)剩余的 4 字节包含额外的信息与客户端时钟有关 (图中使用的是 GMT Unix Time)。在握手时客户端和服务器都会提供随机数客户端的暂记作 random_C (用于后续的密钥的生成)。这种随机性对每次握手都是独一无二的在身份验证中起着举足轻重的作用。它可以防止重放攻击并确认初始数据交换的完整性。Session ID: 在第一次连接时会话 IDsession ID字段是空的这表示客户端并不希望恢复某个已存在的会话。典型的会话 ID 包含 32 字节随机生成的数据一般由服务端生成通过 ServerHello 返回给客户端。Cipher Suites: 密码套件cipher suite块是由客户端支持的所有密码套件组成的列表该列表是按优先级顺序排列的。Compression: 客户端可以提交一个或多个支持压缩的方法。默认的压缩方法是 null代表没有压缩Extensions: 扩展extension块由任意数量的扩展组成。这些扩展会携带额外数据 ServerHello 是将服务器选择的连接参数传回客户端。 这个消息的结构与 ClientHello 类似只是每个字段只包含一个选项其中包含服务端的 random_S 参数 (用于后续的密钥协商)。服务器无需支持客户端支持的最佳版本。如果服务器不支持与客户端相同的版本可以提供某个其他版本以期待客户端能够接受图中的 Cipher Suite 是后续密钥协商和身份验证要用的加密套件此处选择的密钥交换与签名算法是 ECDHE_RSA对称加密算法是 AES-GCM后面会讲到这个。还有一点默认情况下 TLS 压缩都是关闭的因为 CRIME 攻击会利用 TLS 压缩恢复加密认证 cookie实现会话劫持而且一般配置 gzip 等内容压缩后再压缩 TLS 分片效益不大又额外占用资源所以一般都关闭 TLS 压缩。 Certificate 典型的 Certificate 消息用于携带服务器 X.509 证书链。 服务器必须保证它发送的证书与选择的算法套件一致。比方说公钥算法与套件中使用的必须匹配。除此以外一些密钥交换算法依赖嵌入证书的特定数据而且要求证书必须以客户端支持的算法签名。所有这些都表明服务器需要配置多个证书每个证书可能会配备不同的证书链。 Certificate 消息是可选的因为并非所有套件都使用身份验证也并非所有身份验证方法都需要证书。更进一步说虽然消息默认使用 X.509 证书但是也可以携带其他形式的标志一些套件就依赖 PGP 密钥。 ServerKeyExchange 携带密钥交换需要的额外数据。ServerKeyExchange 是可选的消息内容对于不同的协商算法套件会存在差异。部分场景下比如使用 RSA 算法时服务器不需要发送此消息(下面秘钥交换算法里有讲)。 ServerKeyExchange 仅在服务器证书消息也就是上述 Certificate 消息不包含足够的数据以允许客户端交换预主密钥premaster secret时才由服务器发送。 比如基于 DH 算法的握手过程中需要单独发送一条 ServerKeyExchange 消息带上 DH 参数。 ServerHelloDone 表明服务器已经将所有预计的握手消息发送完毕。在此之后服务器会等待客户端发送消息。 verify certificate 客户端验证证书的合法性如果验证通过才会进行后续通信否则根据错误情况不同做出提示和操作合法性验证内容包括如下: 证书链的可信性 trusted certificate path;证书是否吊销 revocation有两类方式 - 离线 CRL 与在线 OCSP不同的客户端行为会不同;有效期 expiry date证书是否在有效时间范围;域名 domain核查证书域名是否与当前的访问域名匹配; 由 PKI 体系 的内容可知对端发来的证书签名是 CA 私钥加密的接收到证书后先读取证书中的相关的明文信息采用相同的散列函数计算得到信息摘要然后利用对应 CA 的公钥解密签名数据对比证书的信息摘要如果一致则可以确认证书的合法性然后去查询证书的吊销情况等。 ClientKeyExchange 合法性验证通过之后客户端计算产生随机数字的预主密钥Pre-master并用证书公钥加密发送给服务器并携带客户端为密钥交换提供的所有信息。这个消息受协商的密码套件的影响内容随着不同的协商密码套件而不同。 此时客户端已经获取全部的计算协商密钥需要的信息: 两个明文随机数 random_C 和 random_S 与自己计算产生的 Pre-master然后得到协商密钥(用于之后的消息加密)。 enc_key PRF(Pre_master, master secret, random_C random_S)图中使用的是 ECDHE 算法ClientKeyExchange 传递的是 DH 算法的客户端参数如果使用的是 RSA 算法则此处应该传递加密的预主密钥。 ChangeCipherSpec 通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信。 注意 ChangeCipherSpec 不属于握手消息它是另一种协议只有一条消息作为它的子协议进行实现。 Finished (Encrypted Handshake Message) Finished 消息意味着握手已经完成。消息内容将加密以便双方可以安全地交换验证整个握手完整性所需的数据。 这个消息包含 verify_data 字段它的值是握手过程中所有消息的散列值。这些消息在连接两端都按照各自所见的顺序排列并以协商得到的主密钥 (enc_key) 计算散列。这个过程是通过一个伪随机函数pseudorandom functionPRF来完成的这个函数可以生成任意数量的伪随机数据。 两端的计算方法一致但会使用不同的标签finished_label客户端使用 client finished而服务器则使用 server finished。 verify_data PRF(master_secret, finished_label, Hash(handshake_messages))因为 Finished 消息是加密的并且它们的完整性由协商 MAC 算法保证所以主动网络攻击者不能改变握手消息并对 vertify_data 的值造假。在 TLS 1.2 版本中Finished 消息的长度默认是 12 字节96 位并且允许密码套件使用更长的长度。在此之前的版本除了 SSL 3 使用 36 字节的定长消息其他版本都使用 12 字节的定长消息。 Server 服务器用私钥解密加密的 Pre-master 数据基于之前交换的两个明文随机数 random_C 和 random_S同样计算得到协商密钥: enc_key PRF(Pre_master, “master secret”, random_C random_S); 同样计算之前所有收发信息的 hash 值然后用协商密钥解密客户端发送的 verify_data_C验证消息正确性; change_cipher_spec 服务端验证通过之后服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信图中多了一步 New Session Ticket此为会话票证会在会话恢复中解释; Finished (Encrypted Handshake Message) 服务器也结合所有当前的通信参数信息生成一段数据 (verify_data_S) 并采用协商密钥 session secret (enc_key) 与算法加密并发送到客户端; 握手结束 客户端计算所有接收信息的 hash 值并采用协商密钥解密 verify_data_S验证服务器发送的数据和密钥验证通过则握手完成; 加密通信 开始使用协商密钥与算法进行加密通信。 密钥交换和签名算法 常用的密钥交换和签名算法 HTTPS 通过 TLS 层和证书机制提供了内容加密、身份认证和数据完整性三大功能。加密过程中需要用到非对称密钥交换和对称内容加密两大算法。 对称内容加密强度非常高加解密速度也很快只是无法安全地生成和保管密钥。在 TLS 协议中最后的应用数据都是经过对称加密后传输的传输中所使用的对称协商密钥(上文中的 enc_key)则是在握手阶段通过非对称密钥交换而来。常见的 AES-GCM、ChaCha20-Poly1305都是对称加密算法。 非对称密钥交换能在不安全的数据通道中产生只有通信双方才知道的对称加密密钥。目前最常用的密钥交换算法有 RSA 和 ECDHE。 RSA 历史悠久支持度好但不支持 完美前向安全 - PFS(Perfect Forward Secrecy)ECDHE 使用了 ECC椭圆曲线的 DHDiffie-Hellman算法计算速度快且支持 PFS。 在 PKI 体系一节中说明了仅有非对称密钥交换还是无法抵御 MITM 攻击的所以需要引入 PKI 体系的证书来进行身份验证其中服务端非对称加密产生的公钥会放在证书中传给客户端。 在 RSA 密钥交换中浏览器使用证书提供的 RSA 公钥加密相关信息如果服务端能解密意味着服务端拥有与公钥对应的私钥同时也能算出对称加密所需密钥。密钥交换和服务端认证合并在一起。 在 ECDH 密钥交换中服务端使用私钥 (RSA 或 ECDSA) 对相关信息进行签名如果浏览器能用证书公钥验证签名就说明服务端确实拥有对应私钥从而完成了服务端认证。密钥交换则是各自发送 DH 参数完成的密钥交换和服务端认证是完全分开的。 可用于 ECDHE 数字签名的算法主要有 RSA 和 ECDSA - 椭圆曲线数字签名算法也就是目前密钥交换 签名有三种主流选择: RSA RSA 密钥交换 无需签名ECDHE_RSAECDHE 密钥交换 RSA 签名ECDHE_ECDSA ECDHE 密钥交换 ECDSA 签名 比如我的网站使用的加密套件是 ECDHE RSA可以看到数字签名算法是 sha256 哈希加 RSA 加密在 PKI 体系一节中讲了签名是服务器信息摘要的哈希值加密生成的。 内置 ECDSA 公钥的证书一般被称之为 ECC 证书内置 RSA 公钥的证书就是 RSA 证书。因为 256 位 ECC Key 在安全性上等同于 3072 位 RSA Key所以 ECC 证书体积比 RSA 证书小而且 ECC 运算速度更快ECDHE 密钥交换 ECDSA 数字签名是目前最好的加密套件。 以上内容来自本文: 开始使用 ECC 证书 关于 ECC 证书的更多细节可见文档: ECC Cipher Suites for TLS - RFC4492 RSA 密钥交换和 DH 密钥交换的区别 使用 RSA 进行密钥交换的握手过程与前面说明的基本一致只是没有 ServerKeyExchange 消息其中协商密钥涉及到三个参数 (客户端随机数 random_C、服务端随机数 random_S、预主密钥Premaster secret)。 其中前两个随机数和协商使用的算法是明文的很容易获取最后一个预主秘钥 Premaster secret 客户端会用服务器提供的公钥加密后传输给服务器 (密钥交换)如果这个预主密钥被截取并破解则协商密钥也可以被破解。 RSA 算法的细节见: wiki 和 RSA算法原理二- 阮一峰 RSA 的算法核心思想是利用了极大整数 因数分解 的计算复杂性 而使用 DH(Diffie-Hellman) 算法 进行密钥交换双方只要交换各自的 DH 参数(在ServerKeyExchange 发送 Server params在 ClientKeyExchange 发送 Client params)不需要传递 Premaster secret就可以各自算出这个预主密钥。 DH 的握手过程如下大致过程与 RSA 类似图中只表达如何生成预主密钥: 服务器通过私钥将客户端随机数 random_C服务端随机数 random_S服务端 DH 参数 Server params 签名生成 signature然后在 ServerKeyExchange 消息中发送服务端 DH 参数和该签名 客户端收到后用服务器给的公钥解密验证签名并在 ClientKeyExchange 消息中发送客户端 DH 参数 Client params 服务端收到后双方都有这两个参数再各自使用这两个参数生成预主密钥 Premaster secret之后的协商密钥等步骤与 RSA 基本一致。 基于 RSA 算法与 DH 算法的握手最大的区别就在于密钥交换与身份认证。 前者客户端使用公钥加密预主密钥并发送给服务端完成密钥交换服务端利用私钥解密完成身份认证。后者利用各自发送的 DH 参数完成密钥交换服务器私钥签名数据客户端公钥验签完成身份认证。 关于 DH 算法如何生成预主密钥推荐看下 Wiki 和 Ephemeral Diffie-Hellman handshake 其核心思想是利用了 离散对数问题 的计算复杂性 原根假设一个整数 g 对于质数 P 来说是原根那么 g^i mod P (1 ≦ i P) 的结果各不相同且其结果按一定顺序排列后是 1 到 P-1 的所有整数例子。 离散对数如果对于一个整数 n 和质数 P 的一个原根 g可以找到一个唯一的指数 i使得 n g^i mod P (0 ≦ i P)那么指数 i 称为 n 的以 g 为基数的模 P 的离散对数 Diffie-Hellman 算法的有效性依赖于计算离散对数的难度其含义是当已知大素数 P 和它的一个原根 g 后对给定的 n要计算 i被认为是很困难的而给定 i 计算 n 却相对容易 算法过程可以抽象成下图: 双方预先商定好了一对 P g 值 (公开的)而 Alice 有一个私密数 a(非公开对应一个私钥)Bob 有一个私密数 b(非公开对应一个私钥) Alice 计算 A g^a mod P并把 A(公开对应一个公钥) 发给 Bob Bob 计算 B g^b mod P并把 B(公开对应一个公钥) 发给 Alice 双方计算出共享密钥K B^a mod P A^b mod P ( g^ab mod P) 对于 Alice 和 Bob 来说通过对方发过来的公钥参数和自己手中的私钥可以得到最终相同的密钥 而第三方最多知道 P g A B想得到私钥和最后的密钥很困难当然前提是 a b P 足够大 (RFC3526 文档中有几个常用的大素数可供使用)否则暴力破解也有可能试出答案至于 g 一般取个较小值就可以 如下几张图是实际 DH 握手发送的内容: 可以看到双方发给对方的参数中携带了一个公钥值对应上述的 A 和 B。 而且实际用的加密套件是 椭圆曲线 DH 密钥交换 (ECDH)利用由椭圆曲线加密建立公钥与私钥对可以更进一步加强 DH 的安全性因为目前解决椭圆曲线离散对数问题要比因式分解困难的多而且 ECC 使用的密钥长度比 RSA 密钥短得多(目前 RSA 密钥需要 2048 位以上才能保证安全而 ECC 密钥 256 位就足够)。 关于 椭圆曲线密码学 - ECC推荐看下 A Primer on Elliptic Curve Cryptography - 原文 - 译文 客户端身份验证 尽管可以选择对任意一端进行身份验证但人们几乎都启用了对服务器的身份验证。如果服务器选择的套件不是匿名的那么就需要在 Certificate 消息中跟上自己的证书。 相比之下服务器通过发送 CertificateRequest 消息请求对客户端进行身份验证。消息中列出所有可接受的客户端证书。作为响应客户端发送自己的 Certificate 消息使用与服务器发送证书相同的格式并附上证书。此后客户端发送 CertificateVerify 消息证明自己拥有对应的私钥。 只有已经过身份验证的服务器才被允许请求客户端身份验证。基于这个原因这个选项也被称为相互身份验证mutual authentication。 CertificateRequest 在 ServerHello 的过程中发出请求对客户端进行身份验证并将其接受的证书的公钥和签名算法传送给客户端。 它也可以选择发送一份自己接受的证书颁发机构列表这些机构都用其可分辨名称来表示: struct {ClientCertificateType certificate_types;SignatureAndHashAlgorithm supported_signature_algorithms;DistinguishedName certificate_authorities; } CertificateRequest;CertificateVerify 在 ClientKeyExchange 的过程中发出证明自己拥有的私钥与之前发送的客户端证书中的公钥匹配。消息中包含一条到这一步为止的所有握手消息的签名 struct {Signature handshake_messages_signature; } CertificateVerify;会话恢复 最初的会话恢复机制是在一次完整协商的连接断开时客户端和服务器都会将会话的安全参数保存一段时间。希望使用会话恢复的服务器为会话指定唯一的标识称为会话 ID(Session ID)。服务器在 ServerHello 消息中将会话 ID 发回客户端。 希望恢复早先会话的客户端将适当的 Session ID 放入 ClientHello 消息然后提交。服务器如果同意恢复会话就将相同的 Session ID 放入 ServerHello 消息返回接着使用之前协商的主密钥生成一套新的密钥再切换到加密模式发送 Finished 消息。 客户端收到会话已恢复的消息以后也进行相同的操作。这样的结果是握手只需要一次网络往返。 Session ID 由服务器端支持协议中的标准字段因此基本所有服务器都支持服务器端保存会话 ID 以及协商的通信信息占用服务器资源较多。 用来替代服务器会话缓存和恢复的方案是使用会话票证Session ticket。使用这种方式除了所有的状态都保存在客户端与 HTTP Cookie 的原理类似之外其消息流与服务器会话缓存是一样的。 其思想是服务器取出它的所有会话数据状态并进行加密 (密钥只有服务器知道)再以票证的方式发回客户端。在接下来的连接中客户端恢复会话时在 ClientHello 的扩展字段 session_ticket 中携带加密信息将票证提交回服务器由服务器检查票证的完整性解密其内容再使用其中的信息恢复会话。 这种方法有可能使扩展服务器集群更为简单因为如果不使用这种方式就需要在服务集群的各个节点之间同步会话。 Session ticket 需要服务器和客户端都支持属于一个扩展字段占用服务器资源很少。 警告 会话票证破坏了 TLS 安全模型。它使用票证密钥加密的会话状态并将其暴露在线路上。有些实现中的票证密钥可能会比连接使用的密码要弱。如果票证密钥被暴露就可以解密连接上的全部数据。因此使用会话票证时票证密钥需要频繁轮换。
http://www.zqtcl.cn/news/370231/

相关文章:

  • 做网站哪个系统最安全长沙简界网络科技有限公司
  • 象山县城乡和住房建设局网站上海公司牌照最新价格
  • 复旦学霸张立勇做的网站开一个公司需要多少钱
  • 专业建设公司网站软件技术培训
  • 网站建设_聊城笑话小网站模板html
  • 智能建造师威海网站优化推广
  • 做网站如何选域名长沙房价2020最新价格
  • seo网站推广济宁一建建设集团有限公司
  • 高端大气网站设计欣赏有意思网站推荐
  • 什么网站做海宁的房产好北控京奥建设有限公司网站
  • 上海网站建设网络推广网页搜索框下记录删不掉
  • 团购网站大全做相册手机网站如何制作免费
  • 承德网站制作方案百度seo关键词排名s
  • 网站建设公司佛山国内网站推广
  • 辽宁网站制作公司潍坊网站建设维护
  • 手机网站图片切换平面图网站
  • 松岗建设网站广州网站定制开发方案
  • 东阳网站建设价格做理财的网站有哪些问题
  • 蓄电池回收网站建设wordpress cp 部署
  • cuteftp 备份网站网站制作课程介绍
  • 杭州网站搭建宁波企业官网建设
  • php免费网站源码网站建设电子书
  • 建设纺织原料网站专业网页制作室
  • 买域名做网站推广都是些什么湘潭什么网站做c1题目
  • 鲜花网站建设图片昆明网站建站平台
  • 密云网站制作案例昆明小程序开发
  • 网站紧急维护商丘手机网站制作
  • 什么专业会制作网站罗湖做网站的公司哪家好
  • 永久免费ppt下载网站有没有跟一起做网店一样的网站
  • 百川网站石家庄物流网站建设