seegongsik
我的单词本
seegongsik
安全 · 守护信任的方法

在无法信任的世界里,如何守住安全

守住秘密,确认没有被改动,分辨对方是不是真的。从哈希、加盐到对称密钥、公钥、密钥交换,再到签名、证书、HTTPS,又到防火墙、社会工程学、设计原则。最后,用“没有完美的安全”这个事实,也就是如何管理风险,为整段旅程收尾。

15 / 15
01无法信任的世界的规则
在网络上,消息走过陌生的道路时,你无法知道谁会偷看、篡改或截走它。所以安全要保护的目标有三个。让别人读不到的保密(机密)、让它一路上不被改的完整、需要时随时能用的可用。取首字母,我们叫它 CIA。这三个是要保护的目标,不是保护的方法。手段是另外的。其中一个,是确认对方真的是他声称的那个人,叫认证。就像密码一样,你拿出只有本人知道的东西,证明自己是谁。一句话,安全就是在一个不能信的世界里立起机密、完整、可用这三个目标,再用认证之类的手段去守护它们。不把目标和手段搞混,就是第一步。
02变成回不去的样子,哈希
安全哈希只朝一个方向把输入变成指纹。从输入到指纹很容易出来,但从指纹回到输入做不到。所以我们不把密码原样存下来,只存它的指纹。就算存储泄露了,里面也只有指纹,原来的密码没法直接知道。登录时,把输入的值再变成指纹,跟存好的指纹比一比是否一样。一样就通过。同样的输入总是出同样的指纹,所以这个比较行得通。这跟我们在 data 里见过的哈希样子相似,但目的不同。data 的哈希是为了快快找到,而这里的安全哈希是为了回不去。单向指纹、只存指纹、用比较确认。这就是用哈希守护的办法。
03相同密码的陷阱,一撮盐
相同的密码会成为相同的哈希。所以光看存下来的哈希就能知道谁用了相同的密码,还会冒出一种风险:用一张事先写好常见密码及其哈希的表,反着把密码猜出来。防住的办法很简单。给每个人掺一撮不同的随机值,加进密码里再做哈希。这一撮叫做盐。盐不是秘密,它只要每个人不同就行。加了盐,相同的密码也会给出完全不同的哈希。这样一来,事先做好的表就没法一下子对上,存下来的哈希也不再看起来一样了。一句话,相同密码成为相同哈希的陷阱,用每人不同的盐解开,让相同密码也成为不同哈希,这就是加盐。
04证明你就是你的几种办法
认证就是证明你就是你。证明的材料大致三种。知道的东西(像密码,在脑子里),拥有的东西(像手机或钥匙,在手上),本人的东西(像指纹或脸,长在身上)。只用一种,那一种泄了就完了,但要求两种叠在一起就安全得多。这叫多因素。而且认证不等于授权。认证是确认你是谁,授权则在那之后定你能做什么。就算确认了你是谁,能做的事也另行规定,必要时还能收回。
05只有钥匙才能开的锁,加密
直接发的消息是明文,所以路上的任何人都能照样读。加密用钥匙把明文锁起来,变成没有意义的乱码(密文)。锁住的文字能看到,却读不出意思。要再读,必须用正确的钥匙解开,错的钥匙打不开。所以加密在两处守住秘密。第一,传输中。在穿过互联网的途中,就算被拦截内容也受保护。第二,存储时。放在设备或服务器上的期间,就算有人偷看也安全。一句话,明文会被看见,加密把它锁上,只有钥匙能解开,于是传输和存储里秘密都守得住。怎么安全地分发那把钥匙,下一课接着讲。
06用同一把钥匙上锁和开锁的对称密钥
对称密钥加密上锁和开锁用同一把钥匙。只要一把钥匙就行,所以简单,连大数据也上锁开锁得很快。所以用得很广。可它有个致命的弱点。要让隔得远的对方开锁,那个人也得拿着同一把钥匙,而送那把钥匙的路本身就危险。送的途中被复制,上锁就没意义了,不送对方又永远开不了。送也危险不送也没法用,是个死胡同的两难。这就是密钥配送问题。快这个优点,和钥匙怎么交过去这个难题,是同一回事。下一课的公开密钥方式,正好解开这个两难。
07两把钥匙的魔法,公钥
公钥密码用一对两把钥匙。一把是公钥,发给谁都行;一把是私钥,只攥在自己手里。公钥锁上的东西,只有配对的私钥才能开。别的任何钥匙都开不了,连锁它的那把公钥也开不了。所以收件人的公钥发给全世界也安全。谁都能用那把公钥把消息锁上发出去,而只有握着配对私钥的那个人才能打开。对称密钥里那个头疼的密钥配送问题就消失了,因为根本没有要秘密交付的钥匙。公钥就像把锁分发出去,私钥是自己专属的钥匙。这就是两把钥匙的魔法。
08悄悄分享一把钥匙
公钥安全却慢。所以实际上我们用一把快的对称钥匙来收发真正的内容。问题是这把对称钥匙怎么安全地分享。答案是一起造出来。用混颜色来画,两人都从一个谁都知道的公开色出发,各自掺进一种私密色,只把掺好的色寄给对方。把自己的私密色再掺进收到的色里,两人就到达完全相同的最终色。这个最终色就是共享秘密,也就是对称钥匙。在中间偷看的人,看得见公开色和来回经过的掺好的色,可没有各自的私密色,就造不出相同的最终色。要留意一点:密钥交换跟用公钥加密内容不是一回事。密钥交换是两边一起造出同一个秘密的步骤,造好对称钥匙后,才用它来快速收发真正的内容。
09确认信件是真的,签名
数字签名把公钥密码反过来用。寄件人用自己的私钥给消息附上一个签名。私钥只有那个人有,所以那个签名只有那个人能做出来。收件人用那个人的公钥来验证签名。验证通过,就一次证明了两件事:真实性,它确实出自那个人;以及完整性,途中一个字都没变,因为对内容哪怕做一丁点改动,验证都会失效。如果说加密是把内容锁起来保密,签名则根本不上锁,它证明谁发的以及没被改过。上锁为了保密,签名为了真实和完整。同一对钥匙,只换个方向,两件事都能做。
10这把公钥真是那个人的吗,证书
要安全地用一把公钥,你得能信任这把公钥真属于那个人或那个网站。因为要是半路有人把假公钥当成真的递过来,那就危险了。于是大家都信任的机构,认证机构(CA)就出场了。CA用自己的私钥签名担保说,这把公钥真是这个网站的。这份担保文件就是证书。浏览器里事先就装着一份它信任的CA名单。所以收到网站发来的证书时,它能往上追溯,核对这是不是由一个受信任CA的签名担保的。担保成立就通过;要是名单上没有的地方签的,或担保对不上,浏览器就弹出警告。就这样,把谁为谁的公钥担保连起来的这张信任之网,就是公钥基础设施(PKI)。说到底,证书就是贴在公钥上的、可信的身份担保书。
11万物汇聚的那把锁,HTTPS
HTTPS 是这个领域学到的东西汇聚在一起的那把锁。在网络里你看的是流程,这里你看的是为什么安全。安全来自三个环的闭合。第一,证书确认对方真的是那个站点。这是挡住冒充的环。第二,公钥安全地分享一把快的对称钥匙,不需要秘密配送钥匙。第三,用那把对称钥匙加密内容,还检查它的完整性。这是挡住偷看和篡改的环。三个环一起闭合,锁才扣上。只要缺一个,就不安全。所以地址栏里那把小锁不是一张图,而是认证、密钥交换、加密都闭合了的信号。
12守门的卫兵,防火墙
防火墙是按规则盘查进出通信的卫兵。通信通过叫端口的门进出,防火墙给每道门定下放行还是拦截的规则。规则通常看出发地或目的地,以及从哪道门进来来决定。关键是默认拦截。只放行明确允许的,其余不认识的一律先拦下。开着的门越少,从外面能窥见的表面,也就是攻击面就越小,越安全。所以好习惯是只开真正需要的门,其余的关着。防火墙是守门的卫兵,默认是拦下不认识的,开的门越少越安全。这就是防火墙的核心。
13最弱的一环是人
无论密码和锁多强,最弱的一环都是人。攻击者有时不去破技术,而是盯住人的信任、着急的心情,以及想帮忙的善意。这就叫社会工程学。我们真正需要的,只是知道有这种攻击存在这一份'觉察'。不必去记什么手法,只要把防御习惯养在身上就行。核心有两点。第一,越是突然、越催促的请求,越要停下来,换一条途径去核实。要是有人在电话里要你做什么,别按那个号码回拨,要用官方号码另行确认。第二,密码、验证码这类秘密,绝不随便告诉任何人。说到底,安全不只是技术问题,更是信任问题。慢一点、多怀疑、勤核实的习惯,就是最结实的盾。
14设计安全的原则
好的安全不是来自某一种技术,而是来自设计原则。第一,最小权限。给每个人只够用的权限,事情做完就收回。握的权力越少,能丢的也越少。第二,多层防御。不靠单独一层,摆好几道来挡。一层被攻破,下一层接住。第三,默认拦截。除了明确允许的,先一律挡住。不认识的不放进来更安全。第四,越简单越安全。结构越复杂,没看到的缝隙越多。简单就容易检查。这些原则,就算单个技术变了也长久。所以学新技术时,先用原则掂量一下,就不会迷路。
15没有完美的安全
没有完美的安全。任何锁,只要肯花足够的时间和力气都能被撼动;更重要的是,安全每提高一格,方便就降一格,成本就升一格。这三者彼此是相互交换的关系。所以成熟的安全,目标不是把风险变成零,而是管理风险。零既到不了,硬要去够还会让生活瘫痪。取而代之的是,看清什么有多重要,只留下能接受的那点风险,把其余的挡住。所以正确答案因场景而异。就像个人记事本和银行金库不会用同一把锁,你要挑一个配得上所护之物分量的平衡点。不去追完美,而是挑平衡,这就是看待安全的成年人的眼光。
如果有帮助,请支持我们