Hi there 👏👏👏

Welcome to my blog.

数字签名和证书

为什么要数字签名? 信息传输过过程中,容易被拦截篡改,比如网络调试时我们会用 Fiddler、Charles工具拦截请求修改数据,而攻击者可以入侵请求流转的服务器,在上面拦截请求并修改数据; 数据签名就是用来保证信息传输时不被篡改,保证信息的完整性 信息发布的目的是让人们知道信息,虽然没必要对信息进行加密,但是必须排除有人伪装信息发布者发布假信息的风险,这时信息发布者就可以使用数字签名。而对明文信息施加的签名,称为明文签名(clearsign) 在实际使用中,我们既想加密信息,又想签名,所以要对加密和签名组合使用,比如TLS就组合了加密和签名 那什么是数字签名? 对需要加密的文本(可以是各种格式的文件),用散列/hash函数生成信息摘要,然后使用私钥对摘要内容加密,生成“数字签名”。 从字面理解是数字落款,类似写信时落款签名,表明这信息或信是谁写的,那它是如何保证信息不会被篡改呢?看下数字签名制作及验证过程: 使用信息摘要技术在数据加密传输时,发送方先对文件内容使用哈希算法进行信息摘要计算,再对摘要内容进行加密,之后将文件内容以及摘要内容(已加密)发送出去。 接收方收到数据后,先解密得到摘要内容,再依据相同的哈希算法对文件内容进行信息摘要计算,最后匹配接收到的哈希值与计算得到的哈希值是否一致,如果一致那就说明传输过程是安全的。 这样也就避免了对整体原数据加解密的计算过程,从而提高了验证效率。 这里加解密采用非对称加密算法,使用一对公钥私钥进行的。 数字签名过程涉及两类算法:一是生成摘要的hash算法,二是加密摘要的非对称加密算法 这里两个问题 为什么不直接对消息加密,而是生成摘要? 因为对数据进行加解密时,如果数据量大(比如大文件),效率非常低的。信息摘要则是解决加密数据过大问题,其原理是对信息内容通过一个很难被逆向推导的公式计算得到一段哈希数值,它具有以下特点: 计算得到的哈希值大小固定,不受原本信息内容大小的影响; 不可逆,根据哈希值无法推断得到原本信息(实际上MD5以及SHA-1算法已经被证明可以被破解); 唯一性,原本信息内容一致,那么哈希值也一致;原数据不同,也不会存在重复的哈希结果。 为什么要对摘要加密? 信息被拦截是比较容易的事情,拦截者目的可能不是看你发的什么信息,而是篡改信息,他只要替换信息内容和摘要就可以误导你了。而使用发送者私钥加密后的摘要(即数字签名),拦截者是无法替换的(他没有私钥),如果强行替换成拦截者的摘要,接收者验证会失败,因为接受者用的是发送者的公钥 上面讲到拦截者,除非拦截者把自己公钥发给接收者并替换原来的公钥,所以这里引入了如何证明公钥合法性问题,即数字证书 数字证书 讲数字证书前,先了解下CA CA 是“Certificate Authority”的缩写,也叫“证书授权中心”。它负责管理和签发证书的第三方机构。一般来说,CA 必须是所有行业和所有公众都信任的、认可的。因此它必须具有足够的权威性。好比A、B两公司找C公司做担保,A、B都必须信任 C 公司,才会找 C 公司作中介担保。 CA为每个使用公开密钥(公钥)的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥(公钥)。CA用自己的私钥,对申请用户的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。使用公钥的用户(在拿到数字证书后),使用CA公钥(如何获取CA公钥?)解开数字证书,得到用户(申请证书的用户)的公钥及其它信息,后面就可以用这个公钥与服务器交换加密信息里。公钥的合法性(是否真实用户的公钥)由CA做背书 tls握手为什么要协商session key用于后续内容对称加密呢?最主要是对称加解密效率高,速度快

December 20, 2021 · 1 min

初识项目管理

为什么要做项目管理 我们先看一个互联网项目开发过程: 领导:小明,你看这项目新加的需求你一个人大概要多长时间才能完成上线? 小明:需求大概看了下,一个月左右吧 领导:别跟我说“左右”!准确一点,究竟多少天? 小明:那就20个工作日吧 领导:这个功能急需推出抢占市场,20个工作日太长了,给你两周吧。 小明:两周实在太短了,领导 领导:那就3周吧,别再讨价还价了,就这么定了。 小明:好吧 小明接着进入紧张开发中,每天挑个任务处理下: 领导:小明,2周过去了,进展怎么样了 小明:有个模块用到的技术之前没接触过,花了2天时间学习;用户模块逻辑复杂,比预期多话了3天,另外之前组件/操作没封装,重新封装后把之前的都改了一遍 领导:你得抓紧啊,就剩一周了 一边做一边发现,实现需求,要开发的工作还是很多的;一周后: 领导:小明,是否可以测试了? 小明:还不行,我在等其它系统接口,不知道他们什么时候开发完;另外有个模版,产品也没给我 领导:你得催他们啊,另外你得反馈给我😓 加班加点两周后,终于做完了,兴高采烈说可以测试了: 测试:小明需求流程走不通会报错啊,你看下 小明:哦,是测试环境上路径没写对,数据库表也没更新(大写的尴尬),我调整下 测试:小明,这ui还原度不高啊,看起来不协调 小明:哎呀,工期那么紧,我也没办法 测试:这个金额输入框没做校验啊,输个字母就直接蹦了 小明:呃,前端没校验,后端接口也没处理边界情况,导致报错了,错误前端没拦截处理 测试:这个功能逻辑不对吧,开需求会时有特意讲过啊,怎么还做错了;这么多明显的问题,我怎么测试啊... 小明:我改还不行嘛, 好累... 这一改4天过去了,项目总工期来到了30个工作日(6周), 离最初3周相去甚远。 看完对话是不是似曾相识?这里小明犯了几个问题: 没有拆分任务进行评估,只是大概看了下,导致评估时间不准 没和领导商量好开发资源 风险意识不足 质量没达到要求 各方沟通不足 项目管理是互联网人的基础能力: 在互联网行业中,无论哪个岗位都不是孤立存在的,都无法独自完成项目的闭环,因此必然涉及和人的沟通、对资源的管理、对时间进度的管理。 什么是项目管理 什么是项目? PMI(项目管理协会)里介绍,项目是为了一个特定的目标,组织相关资源,进行的一次临时性的努力,项目结束时交付产品、服务或结果这样的产物,然后解散相关资源。 什么是项目管理? 根据项目的定义,可以把项目管理可以理解为:将知识、技能、工具和技术应用到项目活动中以满足项目要求的过程。 为了实现一个特定目标,所实施的一系列针对项目要素的管理过程,包括过程、手段以及技术等。项目管理的目标是为了能够预测性的通过对时间、成本以及一定质量的控制去交付成果,所有这些和项目相关的组成构成了项目管理的范围。 互联网行业里常说的产品和项目是什么却别? 一般传统行业,尤其是外包行业,通常都是从事做项目的业务,为了客户完成一个项目。而互联网公司如BAT等,基本都是在做产品,产品应该最初是从项目发展起来的,由于满足特定的用户(客户)的需求,通过立项,召集相关资源,把一个产品从无到有的做出来,当项目交付投入市场后,如果市场表现好,就会根据用户的需求不断的迭代优化,就变成了产品化。而产品要不断的迭代更新版本,每个版本的开发过程其实就可以看成项目。通过项目管理的方法保证版本保证质量的按期交付,完成产品的版本迭代更新。 怎么做项目管理 项目管理是一门广泛而科学的学科,需要大量的管理知识作为基础。最有名的PMBOK,全称正是《项目管理知识体系指南》,PMBOK是全面介绍了项目管理所涉及的知识,分为五大过程组和十大知识领域: 五大过程组:启动 -> 规划 -> 执行 -> 监控 -> 收尾 十大知识领域:整合管理、范围管理、时间管理、成本管理、质量管理、采购管理、人力资源管理、沟通管理、风险管理、相关方管理 其中时间、范围、成本是项目管理的三要素。 项目管理用到的方法有很多,基本来自于项目实践,并跟随历史发展、组织的进步一起成长,这里着重介绍敏捷项目管理和传统项目管理(如:瀑布开发、精益、功能驱动开发等方法)。 敏捷项目管理 VS 传统项目管理 在互联网行业里,敏捷的项目管理方式比较受用,那为什么大家更喜欢敏捷项目管理呢?敏捷项目管理跟传统的项目管理有什么不同和特点呢?我们从价值理念、流程框架、实践方法三个角度来说明下: 价值理念 看上面的图,大家都知道项目管理的三要素:时间、范围、成本。从这三要素上说下两种项目管理方法的不同。 传统的项目管理,是先确定产品的范围,也就是要做哪些需求和特性先固定下来;然后评估这些需求要花费多少时间,协调花费多少人力,然后形成各种计划,如排期计划、沟通计划、人力分配计划、风险计划等等,然后按照既定的计划来推进,是典型的计划驱动。因为只有这样,进度和成本才可以估算,风险才可以控制。而敏捷项目管理,是先固定了成本、和时间,如一个团队就10个人,迭代周期两周,那我们先做哪些有价值的需求和特性。所以它们本质的区别是,传统项目管理是计划驱动的,而敏捷项目管理是价值驱动。 在互联网大环境下,市场环境是很不确定性的,所以很多业务最开始需求的范围就很难确定下来,或者前期确定下来,后期也会不断的变化。传统项目管理的价值理念是需求范围要确定,最好不变,不适合互联网公司的业务环境,所以敏捷才应用更广泛。 研发模式 传统的项目管理,通常用瀑布的研发模型,瀑布模型是最典型的预见性方法,什么叫预见性方法,就是做之前先严密的分析计划,严格遵守预先计划的需求分析、设计、编码、集成、测试、维护的步骤顺序化进行。为了后期的执行过程中不会有太大的风险和偏差,所以前期会花大块的时间准备繁重的各种文档,并且会有很严格的评审流程。通过预见性的方法来保证有个好的研发过程。这样的研发模型是不接受变更的,因为变更的代价会较大。...

December 10, 2021 · 1 min

值得学习的思维方式

以下是一次团队分享内容,有关思维方式的经验总结,觉得挺受用,这里跟大家一起学习: 特别提醒:这些原则看着很简单,但是想要真正理解并且内化到你自身,需要你在阅读中细细品味 一、做事的一些原则 1.凡做事,必有方法。 (绝不依赖于感觉做事是我给自己卡的标准,我会强制让自己思考和提炼出科学的方法,SOP流程,通用原则等,做事我追求的是可重复,可复制的科学式打法,而不是今天有,明天没有的拍脑袋灵感式的打法。) 2.凡方法,必找原理。 (当一个动作收到反馈的时候,我都会做这样的思考:为什么这个方法有效或者无效?我做对了什么?构成这个结果的因素有那些?那一个是最核心的? 通过反复的追问,把根本的东西提炼出来,让打法可复制。) 3.凡事项,必拉清单。 (我做事有三个标配动作,1.在每周周末为下个周拉出任务统筹清单。2.在一天开始的时候严格遵循先梳理,后部署的原则,先拉to do list,然后再去做事。3.排列事项安排的时候,绝不用脑子去记,一律放入外脑中处理!) 4.凡安排,必做准备。 (对重要的事情,绝不打无准备之仗!!我绝不相信,我即兴的发挥,能赶得上我的精心准备,多算胜,少算不胜,况无算乎?) 5.凡现象,必看本质。 (通过感官获取到的那些引起我情绪波动的东西,绝对不能让它停留在情绪上,而是要强行用理性透过情绪部分,去分析它,把因果倒推,挖出因果链来) 6.凡事后,必做复盘。 (没有复盘的做事,是无法产生积累效应的,经验无法沉淀下来,永远都是低水平的重复!) 7.凡复盘,必有迭代。 (不追求一步登天,但今天要比昨天好,明天要比今天好,刻意的去拔高,每天进步一点点,锲而不舍,金石可镂!) 二、学习的一些原则 1.凡练习,必然刻意。 (对我来说,没有做到让身体、生理产生不适的练习,统统属于无效练习!!) 2.凡灵感,必做记录。 (灵感的出现可遇不可求,不记录,转瞬即忘,我从不相信我的记忆力!) 3.凡输入,必有输出。 (没有输出的输入都是耍流氓的,抓框架、梳逻辑、记笔记、做输出完成学习闭环….) 4.凡输出,必有连接。 (学到的东西必须解释5个以上的生活现象!) 5.凡链接,必做迁移。 (当前的概念、知识点、打法…..,还可以用在哪?还可以用来解释什么现象?) 三、为人处事原则 1.凡现象,必接受。 (接受一切文化现象的存在,无论是让我爽,还是让我不爽的,都统统无条件接受它,做到头脑极度开放,不妄自菲薄,傲慢自负!) 2.凡文化,必多元。 (承认和尊重各个背景,各种阶层间的人群差异,了解各个阶层的人和事,接受他们的生存处境,和文化背景,在人上把别人当人,在人下把自己当人。) 3.凡动作,必利他。 (利他才是最大的利己,将欲取之,必故与之。想要索取,请先思考我能为你带来什么?我能给你提供什么价值?要想着怎么给,而不是怎么去拿!) 4.凡争执,必立场。 (挣脱角色的束缚,换位思考,刻意训练移情。如果我站在他的立场,我会怎么去做,我会是什么感受?) 5.凡交人,必积极。 (积极主动,主动的去释放善意!!) 四、协作协同的一些原则 1.凡做事,必有反馈。 (凡事有交代,事事有着落,件件有回音,这是一名职场人基本的职业修养!) 2.凡问题,必带方案。 (当问题出现,需要协商或向上汇报的时候,必然要求自己自带方案,即使方案有时候不是那么好,但是我给了别人选择的权利!) 3.凡情绪,必分事实。 (区分事实和观点,利益绝对不等于立场,区分出对方情绪中的观点和事实部分,而不是被他人的情绪裹挟,产生无谓的感性烦恼!) 4.凡想法,必有数据。 (我不听I think,请拿数据说话!世界太大,太多元了,任何人都有盲区,我能把握的只是一少部分人,想要把握更多的人,就必须要通过数据说话,比如一名单身汉就理解不了,真正为人父母了那是一种怎样的生活和心理状态……) 5.凡表达,必说三点。 (凡事请刻意练习用三句话说明白,三句话都说不明白,给你三十句话也未必能说明白,简单的东西才能被理解,被理解的东西才能被记住,被记住的东西才能被执行!) 6.凡困惑,必去请教。 (遇到问题的时候,先穷尽脑力,做完所有自己能做到的基础研究,如果反复的跑不通逻辑,则马上请教高手,站在巨人的肩膀上,绝不闭门造车!)

November 5, 2021 · 1 min

DNS原理4-递归和迭代查询

dns迭代查询和递归查询定义及区别 DNS系统是用来解析完全限定域名(fully qualified domain name (FQDN))为相应ip地址的,这个解析过程叫做域名解析(name resolution)。 递归查询时,dns client只发一次解析请求,返回的结果只有两种:name resolution(查询成功)或 错误消息(查询失败)。递归查询发生在dns client和local dns server之间。 迭代查询发生在local dns server和其它dns servers之间,迭代查询并不强制要求返回name resolution,也就是其它dns servers如果知道域名解析则返回解析结果,也可以返回referral。 以浏览器访问www.baidu.com为例: 浏览器首先会检查两个地方是否有之前解析google网站的记录,一个地方是电脑上的缓存(window上查看dns缓存:ipconfig/displaydns),另一个是hosts文件。 假设这两地方都没有解析记录,电脑(dns client)将向我的local dns server发起查询:“我想知道www.baidu.com的ip地址”;从dns client到local dns server的查询称为递归查询,dns client要求获得一个明确的结果(name resolution或error message),local dns server负责返回解析结果。 假设local dns server上没有缓存www.baidu.com的ip地址,接下来就是进行迭代查询,迭代查询期间,其它dns servers不知道ip地址的话,会简单返回referral,具体如下: local dns server首先向根域服务器发起查询,根域服务器只负责顶级域解析,如.com, .edu, .org等,这里根域服务器返回.com顶级域服务器地址,同时也称为根域服务器返回一个referral。 接着local dns server向.com顶级域名服务器发起查询,.com顶级域名服务器返回baidu.com权威服务器地址。 然后local dns server向baidu.com权威服务器地址发起查询,baidu.com权威服务器返回www.baidu.com的ip地址。 最后local dns server把解析结果返回给电脑(dns client)。 电脑(dns client)收到结果后,把ip地址缓存起来,供下次使用;local dns server也会缓存解析结果,这样网络中的其它电脑就可以直接拿到结果了,而不需要再走一遍迭代查询流程。 总结下,dns递归查询发生在dns client和local dns server之间,local dns server负责响应dns client的请求,当local dns server不知道域名ip时,则向其它dns servers发起迭代查询,并返回最终结果给dns client。 这里递归查询是从电脑端角度看,迭代查询是从local dns server角度。dns client设置使用的DNS服务器一般都是递归服务器,它负责全权处理客户端的DNS查询请求,直到返回最终结果。而DNS服务器之间一般采用迭代查询方式。...

June 23, 2021 · 1 min

DNS原理3-dns服务器

四种DNS服务器 DNS服务器(Domain Name Server,域名服务器)是进行域名和与之相对应的IP地址进行转换的服务器。DNS服务器中保存了一张域名和与之相对应的IP地址的表,以解析消息的域名。 所有 DNS 服务器都属于以下四个类别之一:递归解析器、根域名服务器、TLD 域名服务器和权威性域名服务器。在典型 DNS 查找中(当没有正在进行的高速缓存时),这四个 DNS 服务器协同工作来完成将指定域的 IP 地址提供给客户端的任务(客户端通常是一个存根解析器 - 内置于操作系统的简单解析器)。 递归解析器(也称为 DNS 解析器或local dns server) 是 DNS 查询中的第一站。递归解析器作为客户端与 DNS 域名服务器的中间人。从 Web 客户端收到 DNS 查询后,递归解析器将使用缓存的数据进行响应,或者将向根域名服务器发送请求,接着向 TLD 域名服务器发送另一个请求,然后向权威性域名服务器发送最后一个请求。收到来自包含已请求 IP 地址的权威性域名服务器的响应后,递归解析器将向客户端发送响应。 大多数 Internet 用户使用他们 ISP 提供的递归解析器,但还有其他可用选择;例如 Cloudflare 的 1.1.1.1。 根域名服务器每个递归解析器都知道 13 个 DNS 根域名服务器,它们是递归解析器搜寻 DNS 记录的第一站。根服务器接受包含域名的递归解析器的查询,根域名服务器根据该域的扩展名(.com、.net、.org 等),通过将递归解析器定向到 TLD 域名服务器进行响应。根域名服务器由一家名为 Internet 名称与数字地址分配机构(ICANN)的非营利组织进行监督。 注意,尽管有 13 个根域名服务器,但这并不意味着根域名服务器系统中只有 13 台计算机。根域名服务器有 13 种类型,但在世界各地每个类型都有多个副本,它们使用 Anycast 路由来提供快速响应。如果您将根域名服务器的所有实例加在一起,您将有 632 台不同的服务器(截至 2016 年 10 月)。...

June 20, 2021 · 2 min