导航:首页 > 源码编译 > 阮一峰算法

阮一峰算法

发布时间:2025-06-30 20:51:37

❶ 矩阵的乘法运算怎么算

矩阵的乘法,首先要判定能不能作乘法,即要求作乘法时,前一个矩阵的列数与后一个矩阵的行数相等。

设矩阵A是m×n的、矩阵B是n×s的,乘法AB后得到矩阵C,则C为m×s的,如下图所示。

其他元素也是同理,分别取A的某行与B的某列,将对应元素相乘求出。

❷ 如何评价阮一峰老师《未来世界的幸存者》这本书

新闻说,今年全国高校毕业生达到空前的756万,又赶上很多传统行业压缩产能,就业压力很大。
很多曾经的“明星专业”,都已经就业困难。我考大学的时候,国际贸易是最热门的专业之一,大家认定这个专业容易赚钱。但是现在这个专业的毕业生,想找一份好工作会很难,上海将它列入10大预警专业,即最难就业的十个专业之一。
但是,并非所有行业都不景气。至少有一个行业的用工需求极其旺盛,到处都是招聘广告,工作岗位是应聘者数量的好几倍,通常你都有好几家公司可以挑。每周都有朋友发来消息,能不能帮忙介绍几个人过来,我们实在是缺人啊。
这个行业就叫做互联网开发。
二、
互联网行业的劳动力需求,可以用“用工荒”来形容。
只要你会做网页,尤其是手机App的页面,或者微信的活动页面,就不愁找不到工作。哪怕你刚刚学会几个月,或者刚从培训班毕业,只要能拿出作品,就会有比其他行业高得多的起薪。等到有了一两年工作经验,工资就可以达到大学教授的水平。
这样的就业行情,怎不令人趋之若骛。尽管每年都有好几万新人加入,互联网公司还是在喊,工程师严重短缺。
我曾经不太理解,为什么网页开发工程师(或称"前端工程师")这么抢手。直到有一天,看到了一组鸡蛋的统计数据,才想通了这个问题。
三、
中国是世界鸡蛋第一大国。据统计,2013年全国产量5750亿枚,一个中国人平均一年要吃掉400多枚鸡蛋。
那么中国需要多少只母鸡,才能达到这样的产量?
据说,普通母鸡一年大概生200~250枚鸡蛋。养鸡场里面最优秀的母鸡,一年可以达到320枚。以250枚计算的话,中国至少需要有23亿只母鸡,才能满足全国人民吃蛋的需求。
四、
如果把鸡蛋换成网页,同样的问题就是,中国一年需要生产多少张网页,才能满足人民消费的需要?
去年,我国手机用户超过13亿,智能手机用户超过6亿。就算其中只有一半人上网,那也是3亿多人。这么多人,每天都有几十分钟或者几个小时,要使用手机上网。全体中国人一年消费的网页和App的数量,是一个天文数字。
鸡蛋是母鸡生出来的,网页从哪里来?归根结底,所有页面都需要工程师做出来。那么多互联网公司,每家公司都需要前端工程师。而全国的前端工程师,目前可能总共有几十万人,对比那么大的内容消费量,肯定是远远不够的(想一想吧,全国的母鸡有23亿只)。这样一想,工程师抢手就不奇怪了。
还有一个很重要的原因,学校不教前端开发,可能会有一些相关课程,但不会系统地教,所有前端工程师都是靠自学的。这也导致了供给偏少。
五、
由于工作好找和工资较高,前端工程师现在成了一个热门职业。很多不是搞计算机的人,也在考虑转行加入。社会上的培训班,每个周末的各种讲座和大会,都已经人满为患。
我经常收到电子邮件,咨询是否应该改行。
“我是一名会计/教师/导游,现在的工作没有任何成就感,感到没有发展空间。如果我拿出一年左右的时间去自学前端类的课程,将来能走上程序员这条路吗?”
这可怎么答复?
六、
前端编程入门,确实不难,可以短期速成。只要你对计算机有基本的理解,哪怕编程零基础,经过三四个月的培训,也能做出网页和App。 如果你确实想改行,我觉得,这基本上是一件好事,你应该选择那些更有前景的职业。但问题是,并非每个人都适合编程。现在那么多人一窝蜂学习互联网开发,肯定有人将来会后悔。
你最好事先知道下面三件事,再考虑加入这个行业。
七、
首先,你应该热爱编程。
职业程序员每天都必须长时间地坐在电脑前面,与机器对话的时间,远超过与人对话。如果不是真心热爱编程,这会很难忍受,简直像是一种惩罚。让一个人在他不喜欢的事情上面,筋疲力尽地干上几年甚至几十年,那是多么痛苦的人生。
其次,编程本身虽然是一种智力活动,但是中国的现实却更像一种体力劳动。
由于运营活动太多,开发是做不完的,App 必须不断地推出新版本。工作量常常是超负荷的,任务排期一个接着一个,中间根本没有喘息时间,同时做多个项目也是家常便饭。每个项目都有截止期,做不完只能加班。这样说吧,制作网页本身是有趣的,但是像流水线一样的“制造”网页是乏味的,好比养鸡场的母鸡不停得下蛋,每周必须完成5个蛋的指标。
最后,这个行业的新陈代谢很快。
快速的技术更新和极大的工作强度,使得年轻人具有天然的优势。等到职业生涯后期,你的开发速度开始慢下来,就是你被更年轻的人取代的时候。一只母鸡一生中,大约总共可以生2000枚鸡蛋,你的一生中可以制作的网页(或者 App),大概也是一个常数。
八、
如果你不喜欢编程,体会不到代码的乐趣和成就感,只是为了一份好的薪水,就跑来干,那就是很糟糕的选择。想一想如果十年前,你听说国际贸易很兴旺,高考志愿就填了国际贸易,今天会怎样呢?
你应该选择,那些让你产生最大兴趣和热情的职业。因为未来所有行业,低端的、低技能的岗位都会被机器取代,只有技能最强、最有创造性的人不会被淘汰。兴趣,也只有兴趣,才会让你产生不倦的热情,钻研下去,变得更优秀。

用户提供的回答2:
把网页比作鸡蛋是偷换概念,一个鸡蛋只能被吃一次,但网页可以被无限次浏览
正确的比喻应该是永远在变的需求
不过我同意绝大部分的前端工作门槛都非常低,我就是中文系毕业的前端码农
用户提供的回答3:
未来的世界
作为一个无所事事的大学生,其实自己的脑子里偶尔会冒出许多的问题,看到阮老师写的文章,自己也有很多的感触,斗胆说出来交流一下。
关于机器与工作
阮老师上来就问了一个哲学上的终极问题-------"世界会走向哪里“,这确实是个难以回答的问题,阮老师提出了机器替代人。现在九歌已举出很多的职业将会会被人工智能和机器替代的实例。那我这里就发一个最近看到的。微软发布万能翻译器 可以充当60个国家的翻译官 考虑到MSRA曾经有沈向洋,轮子哥,叛逆者这样的大神。未来把翻译这个职业干掉也不是什么问题。所以如阮老师所说,越来越多的职业,尤其是白领职业会被机器所替代掉,越来越多的人变得”无用“。正式由于机器的发展使得他们的劳动和机器生产比起来低效。而且在自动化的浪潮中,最重要的就是减少工作岗位,随着技术水平的提升,想想程序员们996就抱怨的不行,一个不受劳动法保护,一周24小时无休,不用付工资和社保,绝对服从,毫无怨言的机器在老板的眼里应该是一个完美的员工吧。
在管理上,理想上公司是不应该依靠员工的,更加流程化,规范化的管理和流程就能降低对于人才的依赖,然而悲惨的是人才只有具有不可替代性才能在人才市场上获得高价,最好公司离开了自己就会倒闭,这样才能有底气和老板谈工资。于此同时,大公司也在极力避免这件事的发生。但现在,越来越科学的管理体制,更加强大的机器,使得优势越来越像资方倾斜也是不争的实施。而且就工资来说也是残酷的,今天老板为工程师付工资并不是因为工程师是人,而是因为他能解决相关方向的问题。是结果导向的,是为你的工作成果付钱,只要合理合法,老板也是不在乎过程的。如果有一天机器能够产出相同甚至是更好的成果,那么我们就失业了。
就拿打车来讲,你在乎的是如何更快更好的从家到飞机场,而不在乎具体到底是那个司机送你。所以无人驾驶的发展,确实会让司机失业。作者用骡子来举例,我认为是非常恰当的。“......(你)只是一个负责实现领导意志的技术工人,职责就是根据规格说明书写出代码,其实与一个挖水沟的工人是一样的,从这头挖到那头,仅此而已,从事的都是机械性的工作。”我承认码农是这样的,那难道设计师,产品经理,甚至各种总监,职业经理人,乃至CEO不是这样的么?没有人能够在这次变革中幸免,昨天干掉了初级码农,今天就将中高级码农扫入垃圾堆,明天把各种总监,架构师踹下去,到最后连CEO都会滚蛋。
那有没有不能被机器人替代的工作呢?作者这里引述了吴晓波的观点,我们一个一个看。
“(1)个性化服务能力。软件都是统一的算法,个性化服务很难做到”
评述:我觉得机器可以做到这一点,虽然算法是统一的并不代表不能做个性化服务,淘宝不是一直在做一些“猜你喜欢”这样的商品推荐么,本质上是对于用户的各种数据和行为进行建模,然后通过一套推荐算法来进行个性化服务。我没做过这个方向,欢迎做机器学习和推荐算法的大牛来进行解答。我觉得个性化服务对于机器人来说也许是个难题,但并不是什么不可能完成的任务。
(2)人格魅力的能力。机器提供的服务,不会有人格魅力,也不会感动人心。
评述:人格,贴一下网络的定义 “人格是一种具有自我意识和自我控制能力,具有感觉,情感,意志等机能的主体。”人格(心理学术语)_网络,讲的是个性和情感,那我就要反问的为啥机器人没情感呢?那我就要讲微软前EVP陆奇发布的情感计算框架了。微软全球执行副总裁陆奇谈人工智能:情感计算框架显EQ“温度”,包括2015build上发布的cortana,就已经让很多宅男发出了要女票何用的感慨(╯‵□′)╯︵┻━┻。有兴趣的人可以去看2015的build。我认为人工智能未来会发展成光环里的Cortana,或者使命召唤13里的伊森。而且我认为他们是有人格的,或许现状是情感这方面做的并不好,但发展起来未来也许并不会比人差吧。囧

❸ 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)

只需配置浏览器和服务器相关设置开启 TLS,即可实现 HTTPS,TLS 高度解耦,可装可卸,与上层高级应用层协议相互协作又相互独立。

TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。

TLS 的基本工作方式是,客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥,然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信,不同的节点之间采用的对称密钥不同,从而可以保证信息只能通信双方获取。

例如,在 HTTPS 协议中,客户端发出请求,服务端会将公钥发给客户端,客户端验证过后生成一个密钥再用公钥加密后发送给服务端(非对称加密),双方会在 TLS 握手过程中生成一个协商密钥(对称密钥),成功后建立加密连接。通信过程中客户端将请求数据用协商密钥加密后发送,服务端也用协商密钥解密,响应也用相同的协商密钥。后续的通信使用对称加密是因为对称加解密快,而握手过程中非对称加密可以保证加密的有效性,但是过程复杂,计算量相对来说也大。

记录协议负责在传输连接上交换的所有底层消息,并且可以配置加密。每一条 TLS 记录以一个短标头开始。标头包含记录内容的类型 (或子协议)、协议版本和长度。原始消息经过分段 (或者合并)、压缩、添加认证码、加密转为 TLS 记录的数据部分。

记录层将信息块分割成携带 2^14 字节 (16KB) 或更小块的数据的 TLSPlaintext 记录。

记录协议传输由其他协议层提交给它的不透明数据缓冲区。如果缓冲区超过记录的长度限制(2^14),记录协议会将其切分成更小的片段。反过来也是可能的,属于同一个子协议的小缓冲区也可以组合成一个单独的记录。

压缩算法将 TLSPlaintext 结构转换为 TLSCompressed 结构。如果定义 CompressionMethod 为 null 表示不压缩

流加密(BulkCipherAlgorithm)将 TLSCompressed.fragment 结构转换为流 TLSCiphertext.fragment 结构

MAC 产生方法如下:

seq_num(记录的序列号)、hash(SecurityParameters.mac_algorithm 指定的哈希算法)

块加密(如 RC2 或 DES),将 TLSCompressed.fragment 结构转换为块 TLSCiphertext.fragment 结构

padding: 添加的填充将明文长度强制为块密码块长度的整数倍。填充可以是长达 255 字节的任何长度,只要满足 TLSCiphertext.length 是块长度的整数倍。长度大于需要的值可以阻止基于分析交换信息长度的协议攻击。填充数据向量中的每个 uint8 必须填入填充长度值 (即 padding_length)。

padding_length: 填充长度应该使得 GenericBlockCipher 结构的总大小是加密块长度的倍数。合法值范围从零到 255(含)。 该长度指定 padding_length 字段本身除外的填充字段的长度

加密块的数据长度(TLSCiphertext.length)是 TLSCompressed.length,CipherSpec.hash_size 和 padding_length 的总和加一

加密和 MAC 功能将 TLSCompressed 结构转换为 TLSCiphertext。记录的 MAC 还包括序列号,以便可以检测到丢失,额外或重复的消息。

记录协议需要一种算法,从握手协议提供的安全性参数生成密钥、 IV 和 MAC secret.

主密钥 (Master secret): 在连接中双方共享的一个 48 字节的密钥
客户随机数 (client random): 由客户端提供的 32 字节值
服务器随机数 (server random): 由服务器提供的 32 字节值

握手是 TLS 协议中最精密复杂的部分。在这个过程中,通信双方协商连接参数,并且完成身 份验证。根据使用的功能的不同,整个过程通常需要交换 6~10 条消息。根据配置和支持的协议扩展的不同,交换过程可能有许多变种。在使用中经常可以观察到以下三种流程:(1) 完整的握手, 对服务器进行身份验证;(2) 恢复之前的会话采用的简短握手;(3) 对客户端和服务器都进行身份验证的握手。

握手协议消息的标头信息包含消息类型(1 字节)和长度(3 字节),余下的信息则取决于消息类型:

每一个 TLS 连接都会以握手开始。如果客户端此前并未与服务器建立会话,那么双方会执行一次完整的握手流程来协商 TLS 会话。握手过程中,客户端和服务器将进行以下四个主要步骤:

下面介绍最常见的握手规则,一种不需要验证客户端身份但需要验证服务器身份的握手:

这条消息将客户端的功能和首选项传送给服务器。

是将服务器选择的连接参数传回客户端。

这个消息的结构与 ClientHello 类似,只是每个字段只包含一个选项,其中包含服务端的 random_S 参数 (用于后续的密钥协商)。服务器无需支持客户端支持的最佳版本。如果服务器不支持与客户端相同的版本,可以提供某个其他版本以期待客户端能够接受

图中的 Cipher Suite 是后续密钥协商和身份验证要用的加密套件,此处选择的密钥交换与签名算法是 ECDHE_RSA,对称加密算法是 AES-GCM,后面会讲到这个

还有一点默认情况下 TLS 压缩都是关闭的,因为 CRIME 攻击会利用 TLS 压缩恢复加密认证 cookie,实现会话劫持,而且一般配置 gzip 等内容压缩后再压缩 TLS 分片效益不大又额外占用资源,所以一般都关闭 TLS 压缩

典型的 Certificate 消息用于携带服务器 X.509 证书链 。
服务器必须保证它发送的证书与选择的算法套件一致。比方说,公钥算法与套件中使用的必须匹配。除此以外,一些密钥交换算法依赖嵌入证书的特定数据,而且要求证书必须以客户端支持的算法签名。所有这些都表明服务器需要配置多个证书(每个证书可能会配备不同的证书链)。

Certificate 消息是可选的,因为并非所有套件都使用身份验证,也并非所有身份验证方法都需要证书。更进一步说,虽然消息默认使用 X.509 证书,但是也可以携带其他形式的标志;一些套件就依赖 PGP 密钥

携带密钥交换需要的额外数据。ServerKeyExchange 是可选的,消息内容对于不同的协商算法套件会存在差异。部分场景下,比如使用 RSA 算法时,服务器不需要发送此消息。

ServerKeyExchange 仅在服务器证书消息(也就是上述 Certificate 消息)不包含足够的数据以允许客户端交换预主密钥(premaster secret)时才由服务器发送。

比如基于 DH 算法的握手过程中,需要单独发送一条 ServerKeyExchange 消息带上 DH 参数:

表明服务器已经将所有预计的握手消息发送完毕。在此之后,服务器会等待客户端发送消息。

客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证内容包括如下:

由 PKI 体系 的内容可知,对端发来的证书签名是 CA 私钥加密的,接收到证书后,先读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性;然后去查询证书的吊销情况等

合法性验证通过之后,客户端计算产生随机数字的预主密钥(Pre-master),并用证书公钥加密,发送给服务器并携带客户端为密钥交换提供的所有信息。这个消息受协商的密码套件的影响,内容随着不同的协商密码套件而不同。

此时客户端已经获取全部的计算协商密钥需要的信息: 两个明文随机数 random_C 和 random_S 与自己计算产生的 Pre-master,然后得到协商密钥(用于之后的消息加密)

图中使用的是 ECDHE 算法,ClientKeyExchange 传递的是 DH 算法的客户端参数,如果使用的是 RSA 算法则此处应该传递加密的预主密钥

通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信

Finished 消息意味着握手已经完成。消息内容将加密,以便双方可以安全地交换验证整个握手完整性所需的数据。

这个消息包含 verify_data 字段,它的值是握手过程中所有消息的散列值。这些消息在连接两端都按照各自所见的顺序排列,并以协商得到的主密钥 (enc_key) 计算散列。这个过程是通过一个伪随机函数(pseudorandom function,PRF)来完成的,这个函数可以生成任意数量的伪随机数据。
两端的计算方法一致,但会使用不同的标签(finished_label):客户端使用 client finished,而服务器则使用 server finished。

因为 Finished 消息是加密的,并且它们的完整性由协商 MAC 算法保证,所以主动网络攻击者不能改变握手消息并对 vertify_data 的值造假。在 TLS 1.2 版本中,Finished 消息的长度默认是 12 字节(96 位),并且允许密码套件使用更长的长度。在此之前的版本,除了 SSL 3 使用 36 字节的定长消息,其他版本都使用 12 字节的定长消息。

服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,同样计算得到协商密钥: enc_key = PRF(Pre_master, "master secret", random_C + random_S) ;

同样计算之前所有收发信息的 hash 值,然后用协商密钥解密客户端发送的 verify_data_C,验证消息正确性;

服务端验证通过之后,服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信(图中多了一步 New Session Ticket,此为会话票证,会在会话恢复中解释);

服务器也结合所有当前的通信参数信息生成一段数据 (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(椭圆曲线)的 DH(Diffie-Hellman)算法,计算速度快,且支持 PFS。

在 PKI 体系 一节中说明了仅有非对称密钥交换还是无法抵御 MITM 攻击的,所以需要引入了 PKI 体系的证书来进行身份验证,其中服务端非对称加密产生的公钥会放在证书中传给客户端。

在 RSA 密钥交换中,浏览器使用证书提供的 RSA 公钥加密相关信息,如果服务端能解密,意味着服务端拥有与公钥对应的私钥,同时也能算出对称加密所需密钥。密钥交换和服务端认证合并在一起。

在 ECDH 密钥交换中,服务端使用私钥 (RSA 或 ECDSA) 对相关信息进行签名,如果浏览器能用证书公钥验证签名,就说明服务端确实拥有对应私钥,从而完成了服务端认证。密钥交换则是各自发送 DH 参数完成的,密钥交换和服务端认证是完全分开的。

可用于 ECDHE 数字签名的算法主要有 RSA 和 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 进行密钥交换的握手过程与前面说明的基本一致,只是没有 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 基本一致。

关于 DH 算法如何生成预主密钥,推荐看下 Wiki 和 Ephemeral Diffie-Hellman handshake

其核心思想是利用了 离散对数问题 的计算复杂性

算法过程可以抽象成下图:

双方预先商定好了一对 P g 值 (公开的),而 Alice 有一个私密数 a(非公开,对应一个私钥),Bob 有一个私密数 b(非公开,对应一个私钥)

对于 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)。

在 ServerHello 的过程中发出,请求对客户端进行身份验证,并将其接受的证书的公钥和签名算法传送给客户端。

它也可以选择发送一份自己接受的证书颁发机构列表,这些机构都用其可分辨名称来表示:

在 ClientKeyExchange 的过程中发出,证明自己拥有的私钥与之前发送的客户端证书中的公钥匹配。消息中包含一条到这一步为止的所有握手消息的签名:

最初的会话恢复机制是,在一次完整协商的连接断开时,客户端和服务器都会将会话的安全参数保存一段时间。希望使用会话恢复的服务器为会话指定唯一的标识,称为会话 ID(Session ID)。服务器在 ServerHello 消息中将会话 ID 发回客户端。

希望恢复早先会话的客户端将适当的 Session ID 放入 ClientHello 消息,然后提交。服务器如果同意恢复会话,就将相同的 Session ID 放入 ServerHello 消息返回,接着使用之前协商的主密钥生成一套新的密钥,再切换到加密模式,发送 Finished 消息。
客户端收到会话已恢复的消息以后,也进行相同的操作。这样的结果是握手只需要一次网络往返。

Session ID 由服务器端支持,协议中的标准字段,因此基本所有服务器都支持,服务器端保存会话 ID 以及协商的通信信息,占用服务器资源较多。

用来替代服务器会话缓存和恢复的方案是使用会话票证(Session ticket)。使用这种方式,除了所有的状态都保存在客户端(与 HTTP Cookie 的原理类似)之外,其消息流与服务器会话缓存是一样的。

其思想是服务器取出它的所有会话数据(状态)并进行加密 (密钥只有服务器知道),再以票证的方式发回客户端。在接下来的连接中,客户端恢复会话时在 ClientHello 的扩展字段 session_ticket 中携带加密信息将票证提交回服务器,由服务器检查票证的完整性,解密其内容,再使用其中的信息恢复会话。

这种方法有可能使扩展服务器集群更为简单,因为如果不使用这种方式,就需要在服务集群的各个节点之间同步会话。
Session ticket 需要服务器和客户端都支持,属于一个扩展字段,占用服务器资源很少。

❹ diff算法阮一峰

Diff算法是虚拟DOM的核心,用于比较新旧虚拟DOM树之间的差异,实现最小量更新。以下是关于Diff算法的详细解答:

  1. Diff算法的作用

    • Diff算法用于计算出Virtual DOM中被改变的部分,然后针对该部分进行原生DOM操作,而不用重新渲染整个页面。
    • 它通过比较新旧虚拟DOM树,找出差异,然后以最小化的方式更新真实DOM,从而提高页面渲染效率。
  2. Diff算法的策略

    • Walk:遍历新旧虚拟DOM树,对比节点,并记录差异。
    • Update:根据差异进行更新。如果节点类型不同,直接替换整个节点;如果节点类型相同,则比较其属性和子节点。
    • Diff Attributes:比较节点的属性差异,并根据差异进行更新。
  3. Diff算法在Vue和React中的应用

    • 在Vue中,每个组件都有一个对应的虚拟DOM树,当数据发生改变时,Vue会重新计算虚拟DOM树的结构,并与旧的虚拟DOM树进行比较,然后使用Diff算法找出差异并进行更新。
    • React也使用了类似的虚拟DOM和Diff算法机制,通过遍历newChildren和oldFiber进行比较,实现高效的DOM更新。
  4. Diff算法中的key作用

    • 在使用虚拟DOM进行Diff算法时,为了正确识别节点并找到正确的位置插入新的节点,需要给每个节点设置一个唯一的标识key。
    • 通过key,Diff算法可以更快地定位到需要更新的节点,从而提高更新效率。
  5. Diff算法在股票MACD指标中的应用

    • 需要注意的是,虽然都提到了“Diff”,但股票MACD指标中的DIFF与虚拟DOM中的Diff算法是两个不同的概念。
    • MACD中的DIFF线代表的是收盘价短期、长期指数平滑移动平均线之间的差,是MACD指标的短期指标,用于分析股票市场的趋势。
  6. Diff算法的性能优化

    • 对于大型JSON数据的比对,可以考虑使用哈希索引优化搜索,以及使用并行处理等技术来提高比对效率。
    • 此外,通过减少不必要的数据更新和比对,也可以进一步优化Diff算法的性能。

综上所述,Diff算法是虚拟DOM的核心机制之一,通过比较新旧虚拟DOM树之间的差异,实现最小量更新,从而提高页面渲染效率。在Vue和React等前端框架中得到了广泛应用。

阅读全文

与阮一峰算法相关的资料

热点内容
在线js编译 浏览:281
pdf打印无法打印出来 浏览:962
stc单片机怎么用 浏览:987
linux编译器软件包 浏览:53
和平精英ak解压视频 浏览:762
lg安卓手机如何下载微信 浏览:34
php清理所有变量 浏览:727
beanshell编程 浏览:920
安卓车机怎么开启驾车模式 浏览:97
程序员三个字作诗 浏览:767
安卓怎么录入羊城通 浏览:151
领克手机app不更新怎么处理 浏览:938
安阳数控编程怎么学 浏览:973
数据加密常用算法 浏览:922
很多程序员进考场时候的照片 浏览:12
php数组key相同 浏览:368
win7编译linux 浏览:843
程序员食堂阿姨 浏览:929
耳机能加密吗 浏览:884
服务器lol手游崩了怎么办 浏览:171