用户
搜索

该用户从未签到

i春秋作家

Rank: 7Rank: 7Rank: 7

20

主题

54

帖子

3567

魔法币
收听
0
粉丝
108
注册时间
2016-12-7

i春秋认证春秋文阁春秋巡逻i春秋签约作者爱心勋章美女勋章赵

发表于 2018-12-27 15:05:08 510325
本帖最后由 immenma 于 2018-12-27 15:23 编辑

小学生坐马桶上都看得懂的加密与通讯

入门导引

笔者在逛知乎的过程中,偶然看见了一篇关于介绍网络安全的文章当中谈论到了关于HTTP/HTTPS,和一些密码保存的相关的东西,甚是有兴趣,文中谈到登录过程中一定要使用HTTPS而不能使用HTTP,否者中间人攻击将很容易取得用户的密码,如果带点钻牛角尖作者的这个说法恐怕并非正确,密码的安全性并不能因为使用了HTTPS就高枕无忧,也并非使用了HTTP就不安全.

上面这句话你可能看的一头雾水,不过这没有关系,这只是抛砖引玉的几句牢骚,同时这也是笔者写这篇文章的原因,一是科普下数据安全的那些事,二是顺便带大家初步的了解一下有关于密码的知识,当然读者不用担心,笔者并不打算谈论过多的数学方面的东西,你完全可以把本文当故事书来看.不过有些地方恕笔者口拙,仍然不可避免的添加一点点不太复杂的理论基础,同时笔者并非全才也非研究密码学数论的专业人士,谈吐之余可能还添加了新的错误,仍望读者见谅指正.

在开始讨论关于密码安全之前,笔者很愿意先给大家讲述一些小故事,以达到增加文章阅读趣味的功效,我们先来看看,假如你打算给你的GG或者是MM眉目传情好在某个愉快的时间唱着歌儿吃着火锅干着快活事儿那你该怎么办?

当然,眉目传情这招技术难度实在太高,除了心有灵犀一点通之外毕竟不是谁都能够有那能耐靠挤眉弄眼就能搞明白对方想表达的是什么意思,比如你想表达明天下午三点这个概念,恐怕除了眼睛嘴巴外还得用上你的手,你想表达带100块钱好在明晚能买两张电影票这个信息时,恐怕你连脚指头用上也不够了,鉴于眉目传情不管是技术上还是生理上的不靠谱,如果你活在90年代手机还没普及,那写信确实是个好办法.不过在这个早恋还容易被家长批斗的年代,如果直接在信上写

darling, lets go to the movies tonight(亲爱的,我们今晚去看电影吧)

恐怕得带着底下工作党被抓牺牲的觉悟了,如果你不想你美好的初恋让因为信息泄露让整个学校都知道,你恐怕就得对这些文字进行一番处理,做起来也并不困难,最初级的办法是对单词进行混乱或替换,比如你可以和你可爱的GG或者MM约定,加密时将d-\>c,a-\>b,r-\>s,l-\>m,i-\>j,…..也就是每个单词在字母表中往后移一位最后z-\>a完成一个闭环,在阅读时再将它们给移动回来,
例如darling经过变换后变成了cbsmjoh这样传输的信息就没人能懂了.

这个办法简直棒极了,对于传输情书这样的事情,似乎也用不到一群密码学专家进行解密,因此你大可放心的用这个办法传递你想表达的意思,这值的膨胀膨胀,莫不我是个天才,不过遗憾的是这个办法恐怕并不能让你申请专利,凯撒大帝在几百年前就用这种办法来传递军事情报了

1cfda93fa7ca1c366cf1eb5d3b3714a2.png

但不管怎么样,这个加密手法简单粗暴有效,也不用花多少心思去理解,只要像上面这样制作一个对应表,就能够完成一段信息的加密与解密,如果你觉得不放心的话,你大可用更加混乱无序的一张映射表来完成这个加解密,这样就能粉碎那些想要琢磨你单词在字母表上到底后移几位的八卦狗仔队们的破解了.

这种加密被用了很长时间,甚至在军事上,而且一直工作的不错,苏格兰的玛丽女王正是使用这种加密方法来完成很多秘密消息的传递,不过事实也证明了,她确实被这个办法给坑惨了:),当然本文并不打算介绍玛丽女王是如何用这种加密方法同别人密谋造反然后被拆穿被续的,我们把注意力放在她的密码是如何败露的,现在你可能疑惑,这个加密的问题出在哪了,看上去确实木有啥问题啊,但实际上破解的方法却很简单,不需要你具备多么高深的密码学数论编码学方面的知识,只要稍微了解下统计学的东西就可以了.那么是如何办到的呢,你可以翻开一本英文书,然后从头看到尾,然后你可以数数当中的字母a占所有字母的几成,字母b占几成….也许你已经发现当中的区别,是的,如果你统计了足够多的文章,你会发现这些单词出现的可能性大概就在某个范围之内,这种替换法也许替换了原来的单词,却无法替换它出现的概率,当破译者通过某些手段收集了足够多的玛丽女王的密文信件时,他就能够通过这种办法来破译出明文了,也正是这样,强度不够的加密手段让玛丽女王最终因为事情败露而上了断头台.

这个故事可能讲的有点长,但它却表达了笔者想要表述的几个概念,一种是加密是什么,显然的,加密是将一种信息表达变成另外一种信息表达的方式,一个很现实的比方是在外地你和你老乡交谈用的可能是你们家乡的方言,尽管你用普通话表达”我爱香菜”和用方言表达”我爱香菜”是一个意思,但用方言表述不是你家乡的人恐怕听不懂,另一种就是映射关系了,就像上面的对应表,实际上你可以叫它映射表,没错
,无非就是把一串数据对应某种关系变成另外一串数据.

尽管我们知道了上面的这种映射加密有多么的不靠谱,当然这种不靠谱的加密还是有个名字就是叫”凯撒加密”,经过了几个世纪的发展,经过众多的数学家密码学物理学甚至是生物学….家的努力,我们最终还是开发出了不少靠谱的加密方式,在这里,因为我们主要讨论的是计算机相关的东西,所以笔者也得用数学的方式(信号与系统?)的方式来描述一下了.

假设我们将没有加密过的信息叫明文(A),加密后的信息叫密文(C),设B为加密方式,那么加密的过程就可以写成类似

A*B=C

当然,解密过程就是

C*D=A

其中D表示B的逆,也就是解密过程了.

你的钥匙安全么

通过上面的故事我们很容易理解一个加密的过程,举个非常通俗易懂的栗子,假如我们有五个数字要告诉对方,分别是1,2,3,4,5加密就是将每个数字乘以2,对面于是就收到了密文2,4,6,8,10最后,对面只需要将每个数字除以2就能取得明文1,2,3,4,5了,在这个过程中,2作为整个加密过程中最关键的数字,可以说是整个加密解密的钥匙,你就得好好保存了,一旦让别人知道了你的密钥,你的加密将形同虚设.

显然的,上个章节说到的玛丽女王并非是自己不小心把自己的钥匙泄漏了,但别人却通过统计学的方式取得了她的钥匙,虽然并不是每个人都能意识到字母在大量的文章书籍中的统计学关系,但我们却不得不面对一个更加直观的问题,假如你和一个你不认识的人进行加密通讯,你如何保证你的钥匙能只交给你的接头人呢.

当然,当面交易不管是在密码还是网购都属于一个比较靠谱的方式,但是如果你想通过信件的方式,就是经过一堆不知名的邮差邮局最终才能到你的接头人手中时,你就得担心担心中间有没有人把你的钥匙给拷贝了一份了.现在你面临一个非常严重的问题,你无法保证中间人会不会出卖你,然而你确不得不把自己手中的钥匙交给他们,否者你的接头人就无法使用它来和你进行加密通讯了.

尽管这种方式和我们实际说的密码学多多少少有一点不一样,但是它的确给了我们提示,设明文为A,密钥为B,密文为C,是否存在一种加密函数使得:

AB=C
C
D=AB无法推导出(至少推导的成本很大)D

简单来说,就是加密的密钥和解密的密钥不一样,这样我们就不用担心我们的密钥被泄漏了,

在现实有点像这么一个过程

  1. 首先准备一个带锁的箱子,用钥匙把这个箱子打开(公钥)

  2. 把这个箱子交给邮递员,同时箱子里附上一个字条,上面写着:请接头人想一个我们之间的通讯加密方式,然后把密钥也放在箱子里锁上寄回给我.(通过公钥加密)

  3. 当这个锁上的箱子再次回到你手中时,用钥匙打开箱子,取得密钥和加密方式(私钥解密)

  4. 之后就可以用这个加密方式和密钥进行通讯了

上面这个办法完美地避免了中间人看到你和接头人密钥,毕竟在交回来时,它可是锁在箱子里面的,只要你发现收回来时这个箱子有什么不对劲,你立即可以编辑短信”
有内鬼,终止交易,”.

虽然最后放在数学中这个方式有点不同,但在思路上,却是大同小异,你也许已经发现了在高中的阶段,要计算3的五次方是多少远比你算多少的5次方是218要简单的多,当代的不对称密钥技术(公钥加密),大多都用上了这种信息不对等的理念,也就是正推容易逆推难.

谈到公钥加密,就不得不聊聊目前相当有名的RSA和ECC了,相对于ECC,RSA理解起来就容易的多,RSA加密简单来说利用了大数质因数分解的数学难题

比如现在你可以随便挑选两个素数,比如59,83,然后将它们乘起来59*83=4897,这很容易,即使是一个小学生也能在十几秒内算出来,但是如果我只告诉你4897这个数,然后让你做因数分解,如果不信你可以试试,不过八成你需要一个一个数去试试了,假如这两个素数挑选的都非常大,那么就算是超级计算机上场,恐怕也得算到世界末日了.尽管上面已经说了本文并不打算讨论过多的数学方面的问题,但幸运的是,理解RSA加密并不复杂,即使是在这短短的篇幅中,也很容易将RSA的原理给讲清楚.

  1. 定义两个素数p,q设n = p*q

  2. 设k= ϕ(n)=(p-1)(q-1), ϕ(n)是欧拉函数,这个不熟悉可以百度

  3. 挑选一个大于1小于k的数d,同时d与k互质

  4. 取整数e(RSA中常常取65537),满足(d*e)%k=1,即de=kt+1(t为某一整数)

然后我们挑选(e,n)作为公钥,将它发布出去,(d,n)为私钥将它保存起来

那么加密过程是怎么样的呢,我们假设将明文编码为x,x与n互质设(图片看不清请下载下来自己看)

image009.png
y即为密文,那么如何对密文进行解密呢,也很简单只需要

image010.png

就可以了,当然口说无凭,我们来证明一番

image011.png

因为x和n互质,根据欧拉定理,
image012.png

因此上式最终变为了x%n=x,RSA得证,要破解RSA那么关键就是找到这个d了,我们看看d是怎么来的,首先从点3我们知道,要知道d首先要先知道k,而k=(p-1)(q-1)也就是需要知道p和q了,而我们公布的只有一个e和n,按照不成文的钦定就算e是65537,也就是说我们必须通过n倒推出p和q,那么,问题就变成了这个大数因数分解的世纪难题了,当然如果你有办法解出来,给我回帖前我建议你先写成论文,只要发表后这样你就可以先领取500万美元的奖金了(这还是零几年的价格,现在应该奖金应该足够你在北京一环内买套豪华别墅).

RSA已经流行了多年,很多时刻仿佛这套理论就会被爆些大新闻让人感觉其安全性已经摇摇欲坠,但是最终RSA仍然屹立不倒,些许在之后的某一天量子计算机诞生或者哪个大神真正找到了某个快速大数的质因数分解的方法,RSA也算真正完成了他的历史使命了.

公钥加密技术有诸多的优点,但是其缺点也一样很明显,大多的公钥加密算法其性能开销基本都比密钥对称加密大得多,因此,他们一般都不用于加密大量的数据,在实际使用中,它们大多被用于交换其它更加经济快速的加密密钥对,或者被设计与数字签名,如果你想进一步了解RSA,那么在在互联网上的资料已经是铺天盖地笔者便不再复述了,如果你对其它的公钥加密有兴趣比如ECC,那么也许笔者之后的\<\<小学生坐在马桶上都看得懂的椭圆曲线加密原理\>\>你也许有兴趣.

HTTP/HTTPS

看到了标题你可能已经在犯咕咚,刚说完密码怎么突然就跳到http/https上来了,不过不用担心,一个非常直观的理解就是,http就是你用明文来写情书,https就是你的情书加密了,实际上后者就是前者加密后的产物.那么什么是http呢,你可以打开一个网站比如百度,如果你用的是chrome,那么按下F12,你可以看到有一堆文字

a5adf7a7e57091de977e0523f895012c.png

这段文字就是符合http规范的的文字(当然http协议相关的细节信息已经省略了),你可以管它叫网站源代码,或者简单一点来说,就是这段文字经过解析后变成了你所看到的网页,当然,这个源代码在互联网上传输,就像你把情书交给了一个不靠谱的邮递员一样不靠谱,这个邮递员大可能已经被你的情敌收买了,把你的信件拆开来添油加醋地加一点东西然后再神不知鬼不觉地封回去这样足够给你造成一些情感危机了,但https能够很好的避免这一堆问题,因为这段文字被加密了,如果不知道解密手段的话,即使添加了一些东西解密后也会变成一堆意义不明的数据,收信方也很容易察觉出问题.因此,https显然在防篡改方面比http要安全.

那么是否是HTTPS就一定比HTTP安全呢,HTTP是否一定不安全呢,就像文中作者所说的,不管怎么样一定要使用HTTPS做密码的登录框,不然密码就会被泄漏.

其实这句话,就有点像就算是屠龙宝刀如果给一个菜鸟的话,恐怕真到约架时,也会被砍的娘都不认识,就算是一根树枝假如给的是独孤求败这种人物,就算是在多人一起上也是被扁的哇哇叫,打铁还需自身硬,如果自身都不够硬,真要干起架来,哪怕是再好的武器也于事无补.要理解HTTPS为什么安全,安全在哪里,我们就得有打破砂锅问到底,不到秃头不掉泪的精神以探其究竟.

HTTPS和中间人攻击

在这里,我们进稍微一步地探究下细节,有关于HTTPS的传输流程是怎么样的,可以看到,HTTPS比HTTP就多了一个字母S,这个S代表着SSL(Secure
Socket
Layer)的意思,也就是安全传输层,不要看名字那么高大上,实际上用人话来讲就和笔者第一章说的那个送箱子的过程差不多,首先SSL层先使用公钥加密技术交换密钥对(比如RSA,ECC….),之后再使用AES
DES或者更经济点的RC4进行加密通讯,看上去这个交递箱子的方案似乎没有什么问题,但我们回到那个交递箱子的过程

  1. 首先准备一个带锁的箱子,用钥匙把这个箱子打开(公钥)

  2. 把这个箱子交给邮递员,同时箱子里附上一个字条,上面写着:请接头人想一个我们之间的通讯加密方式,然后把密钥也放在箱子里锁上寄回给我.(通过公钥加密)

  3. 当这个锁上的箱子再次回到你手中时,用钥匙打开箱子,取得密钥和加密方式(私钥解密)

  4. 之后就可以用这个加密方式和密钥进行通讯了

我们做一个这个假设,假设这个邮递员准备了一个和你一模一样的箱子,然后伪装成你的接头人和你通讯,再用这个伪造的箱子和你真正的接头人进行通讯,那么你还能保证你的通讯是安全的么.恐怕这个时候,即使是公钥加密技术也无能为力了,我们能做的,只能是尽量提醒接头人,比如在箱子上盖个印章条形码,并方方正正地写上”此箱子版权所有,仿冒必究,请到xx正品店进行专柜验证”,然后祈祷你的接头人会好好地验证这个箱子的真伪,但鉴于你和接头人从未谋面,恐怕他也并不知道你会不会给他寄个”带有防伪标签的箱子”,是的,这个过程几乎和ssl的理念一样,每个https的站点需要向一个可信的第三方CA(数字证书的颁发机构)申请一个证书来向每一个浏览你网站的人证明你是你,但浏览你网站的人可能根本无法意识到,你的网站是否进行过防伪了这种中间人攻击的手段又叫SSL剥离攻击,其原理图一看就明白大概是如何办到的

365c71c83fa0ca976037807be786a2d1.png

如何避免中间人攻击

虽然不愿意承认,不过如果你的网路流量出入口真被某些居心叵测的破坏分子控制的话,你能做的就是尽量祈祷这个家伙的技术水平不够到家和给你编写APP的码农技术到不到家了,搭建一个SSL剥离的攻击方案也许就是一个黑wifi,一次ARP劫持和几个脚本的事情了,实际上避免攻击的准则除了选择一个可以信赖的网络服务商,另外的更多工作需要在自己设计的代码中去实现而不是盲目地相信某种通用的手段(当然不是说HTTPS不好用,有条件当然还是最好用上),一个最基本的理念是,如果攻击你的成本远远大于攻击成功取得的价值成本,就能够很大程度的避免自己被一些别有用心的大佬而不是吃的太饱的大佬摆上一道,这也就是为什么我们学习密码学的原因,如果你能将那些更加复杂的公钥加密技术设计在你的通讯体系中,设计的程序能够利用这些知识,去验证收到数据的真伪(比如验证可信CA颁发的签名证书)那么攻击者就需要花费更大的代价去剥离你的验证部分,或者根本就不可能在偶然的一次通讯劫持中完成这类攻击.

但遗憾的是在代码通用化程度如此高的今天,尽管很多的软件运用了完善的加密体系最大程度地保证了通讯的安全,但大部分因为开发成本或者是其它的关系,开发人员并没有好好的给自己充个电认为使用现有的安全架构就能够一劳永逸去避免一堆可能带来的问题,例如这个登录的验证问题,处理起来远远不是弄个证书整个HTTPS就能够解决的,但不论是出于开发平台还是出于开发成本或者是开发员的技术水平,绝大多数的网站在保证安全这块都还有很长的路要走.

除了开发人员,最后是写给用户安全建议的:

  1. 请在信任的网络中下载程序或流量网页

  2. 如果你连入了一个不信任的网络,请不要浏览不带有效签名的网站,

  3. 不要下载没有有效签名的软件,如果你新的过这个没有签名的软件,也要在信任网络中下载

  4. 了解密码安全的一些知识

  5. 找个靠谱的码农朋友.

散列函数(hash)

最后笔者在末尾想科普一下散列函数也就是俗称hash函数的东西,在开始科普关于hash之前,笔者首先想谈谈大约五六年前CSDN数据库泄漏的事件,尽管我们无法猜测csdn到底出于什么目的将用户的密码进行明文存储,但这个事件无疑在圈内掀起了轩然大波,无数无辜躺枪的码农程序猿忙着修改自己的账户密码,避免被某些别有用心之徒用撞库的手段给自己造成损失.

倘若csdn不使用明文记录用户的密码信息,而将这个密码用某种不可逆的手段编码成其它的数据,无疑这次的风波至少不会造成如此巨大的损失.

那么说人话, hash函数到底是什么呢,按照百度百科的说法,
hash就是指通过散列算法,变换成固定长度的输出,该输出就是散列值,说的太专业了?没关系,除法求余数总会吧,看下面的式子

y=x%99

这是一个很简单的求余运算,x表示输入的某个整数值,y表示输出的值,显然,不管x取多少,y的结果必定在0-99,如果你知道y的值那么能不能求出x的值呢,很遗憾,也许你能找出很多个符合这个条件的x值,但你恐怕永远不能确定原始的x值是哪一个了

整数求余运算是一个非常简单的散列运算函数或者通俗点叫hash函数,但这是一个不合格的hash函数,因为我们可以非常容易地通过输出y求得多个x的可能解,并且x和y在一定的范围内存在线性关系,而理想的hash函数,是正着算容易,倒着算难,同时输入的轻微变动也将导致输出极大的不同,

那么这就很有意思了,假如我们在数据库保存密码时,使用适当的hash函数对其进行编码,那么就能够避免我们的密码明文被泄漏了,说到这里,不得不提提当今鼎鼎有名的几个hash函数,比如MD5,SHA256.

这就安全了么?

的确,当明文的密码使用MD5或者是SHA256后想要再逆向为明文是不大可能了,但这还不足以让你高枕无忧,毕竟早不久才报出个大新闻MD5被破解了!,当然,被破解这种标题党的行为在学术上来说极为的不准确,准确来说,是MD5被找到了一种能够快速找到碰撞的办法,那么碰撞是什么呢,我们回到之前的y=x%99,如果我们知道y的值是1,那么x的值是多少呢,显然的,x的值可以是100,可以是199,可以是298….,要知道如果我们用求余法作为密码的hash函数,那么我们输入199,298…哪怕我们的原始密码是100,也会被当做是正确的密码,也就是说,199,298是100对于该hash函数的碰撞结果.

这可就要命了,明明黑客输入的密码和我们输入的密码不一样,系统还是将它当做了一个正确的密码让他登录了,这简直就是密码系统的灾难,既然MD5不再安全了,那么就放弃MD5专用SHA256吧.

然而还是太天真了,我们忽略了一个最基本的事实,如果明文的密码长度不够,那么不管加密的手段如何的高明,我们也能通过穷举的方式进行破解,比如你的密码是一个三位数数字,那么我只需要把100-999都尝试一遍,就可以知道正确的结果了,也许用人脑这个办法有点难,但是在计算机当中,完成这个穷举连1秒都不用.

实际上确实也有人这么干了,他们购买了大容量的存储设备,收集大量大常用明文密码进行hash计算,同时他们建立了快速的查询机制,只要你的密码长度不够或者使用了一些常用的密码,那么hash函数的对你明文密码的保护机制将很可能不再有效.而这种方法在网上有个比较漂亮的名字叫彩虹表

给密码加约束

为了避免彩虹表的危机,我们必须对密码加一系列的约束,比如我们可以规定密码的长度一定要大小写组合的8位以上,16位以下,然后再在密码的结尾加上一段我们自己想出来的随机的值增加输入长度,以避免常规计算的的彩虹表对我们的密码进行暴力破解的效果.

这是一种非常流行的做法,用专业的术语来说就是加盐(salt),那段随机的值就是我们所说的盐值,这个效果的确非常有效,在如今即便是已经被证明不安全的MD5在寻找碰撞仍然不是那么的快的时候,只要这个salt足够长,的确能够在一定程度上缓解这次的危机问题,但不管如何,我们仍然应该摒弃那些不再安全的hash函数而使用目前相对安全的hash函数.同时在设计通讯架构时,永远不要相信当前的密码手段是永恒不破的,毕竟这就和明天我会不会中个亿元大奖然后走向人生巅峰一样,谁又说得清呢?

小学生坐马桶上都看得懂的加密与通讯
==================================



感谢分享
表姐这个地方:流量网页 是不是写错了?是浏览网页的意思么?

使用道具 举报 回复
发表于 2018-12-29 17:38:47
看不懂啊兄弟
有一天他会突然觉得累了甚至忘了初衷 放弃了梦想也许因为年纪的关系奔波于现实 然后拉黑了网络认识的所有人或者说不用了一个号码换了一个QQ 那么记得他叫流光 这个网络他曾来过。
使用道具 举报 回复
发表于 2019-1-1 11:22:41

哇  代码审计  我喜欢  希望版主多多分享  
使用道具 举报 回复
一篇文章写那么多知识点太多了,建议多分几篇文章写。
使用道具 举报 回复
这篇太棒了 很详细 知识点丰富 期待下一篇
使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册