笔者在逛知乎的过程当中,偶然看见了一篇关于介绍网络安全的文章当中谈论到了关于HTTP/HTTPS,和一些密码保存的相关的东西,甚是有兴趣,文中谈到登陆过程当中必定要使用HTTPS而不能使用HTTP,否者中间人攻击将很容易取得用户的密码,若是带点钻牛角尖做者的这个说法恐怕并不是正确,密码的安全性并不能由于使用了HTTPS就高枕无忧,也并不是使用了HTTP就不安全.算法
上面这句话你可能看的一头雾水,不过这没有关系,这只是抛砖引玉的几句牢骚,同时这也是笔者写这篇文章的缘由,一是科普下数据安全的那些事,二是顺便带你们初步的了解一下有关于密码的知识,固然读者不用担忧,笔者并不打算谈论过多的数学方面的东西,你彻底能够把本文当故事书来看.不过有些地方恕笔者口拙,仍然不可避免的添加一点点不太复杂的理论基础,同时笔者并不是全才也非研究密码学数论的专业人士,谈吐之余可能还添加了新的错误,仍望读者见谅指正.chrome
在开始讨论关于密码安全以前,笔者很愿意先给你们讲述一些小故事,以达到增长文章阅读趣味的功效,咱们先来看看,假如你打算给你的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这样传输的信息就没人能懂了.架构
这个办法简直棒极了,对于传输情书这样的事情,彷佛也用不到一群密码学专家进行解密,所以你大可放心的用这个办法传递你想表达的意思,这值的膨胀膨胀,莫不我是个天才,不过遗憾的是这个办法恐怕并不能让你申请专利,凯撒大帝在几百年前就用这种办法来传递军事情报了函数
<ignore_js_op>性能
但无论怎么样,这个加密手法简单粗暴有效,也不用花多少心思去理解,只要像上面这样制做一个对应表,就可以完成一段信息的加密与解密,若是你以为不放心的话,你大可用更加混乱无序的一张映射表来完成这个加解密,这样就能粉碎那些想要琢磨你单词在字母表上到底后移几位的八卦狗仔队们的破解了.学习
这种加密被用了很长时间,甚至在军事上,并且一直工做的不错,苏格兰的玛丽女王正是使用这种加密方法来完成不少秘密消息的传递,不过事实也证实了,她确实被这个办法给坑惨了:),固然本文并不打算介绍玛丽女王是如何用这种加密方法同别人密谋造反而后被拆穿被续的,咱们把注意力放在她的密码是如何败露的,如今你可能疑惑,这个加密的问题出在哪了,看上去确实木有啥问题啊,但实际上破解的方法却很简单,不须要你具有多么高深的密码学数论编码学方面的知识,只要稍微了解下统计学的东西就能够了.那么是如何办到的呢,你能够翻开一本英文书,而后从头看到尾,而后你能够数数当中的字母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
CD=AB没法推导出(至少推导的成本很大)D
简单来讲,就是加密的密钥和解密的密钥不同,这样咱们就不用担忧咱们的密钥被泄漏了,
在现实有点像这么一个过程
首先准备一个带锁的箱子,用钥匙把这个箱子打开(公钥)
把这个箱子交给邮递员,同时箱子里附上一个字条,上面写着:请接头人想一个咱们之间的通信加密方式,而后把密钥也放在箱子里锁上寄回给我.(经过公钥加密)
当这个锁上的箱子再次回到你手中时,用钥匙打开箱子,取得密钥和加密方式(私钥解密)
上面这个办法完美地避免了中间人看到你和接头人密钥,毕竟在交回来时,它但是锁在箱子里面的,只要你发现收回来时这个箱子有什么不对劲,你当即能够编辑短信”
有内鬼,终止交易,”.
虽然最后放在数学中这个方式有点不一样,但在思路上,倒是大同小异,你也许已经发现了在高中的阶段,要计算3的五次方是多少远比你算多少的5次方是218要简单的多,当代的不对称密钥技术(公钥加密),大多都用上了这种信息不对等的理念,也就是正推容易逆推难.
谈到公钥加密,就不得不聊聊目前至关有名的RSA和ECC了,相对于ECC,RSA理解起来就容易的多,RSA加密简单来讲利用了大数质因数分解的数学难题
好比如今你能够随便挑选两个素数,好比59,83,而后将它们乘起来59*83=4897,这很容易,即便是一个小学生也能在十几秒内算出来,可是若是我只告诉你4897这个数,而后让你作因数分解,若是不信你能够试试,不过八成你须要一个一个数去试试了,假如这两个素数挑选的都很是大,那么就算是超级计算机上场,恐怕也得算到世界末日了.尽管上面已经说了本文并不打算讨论过多的数学方面的问题,但幸运的是,理解RSA加密并不复杂,即便是在这短短的篇幅中,也很容易将RSA的原理给讲清楚.
定义两个素数p,q设n = p*q
设k= ϕ(n)=(p-1)(q-1), ϕ(n)是欧拉函数,这个不熟悉能够百度
挑选一个大于1小于k的数d,同时d与k互质
而后咱们挑选(e,n)做为公钥,将它发布出去,(d,n)为私钥将它保存起来
那么加密过程是怎么样的呢,咱们假设将明文编码为x,x与n互质设(图片看不清请下载下来本身看)
<ignore_js_op>
y即为密文,那么如何对密文进行解密呢,也很简单只须要
<ignore_js_op>
就能够了,固然口说无凭,咱们来证实一番
<ignore_js_op>
由于x和n互质,根据欧拉定理,
<ignore_js_op>
所以上式最终变为了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呢,你能够打开一个网站好比百度,若是你用的是chrome,那么按下F12,你能够看到有一堆文字
<ignore_js_op>
这段文字就是符合http规范的的文字(固然http协议相关的细节信息已经省略了),你能够管它叫网站源代码,或者简单一点来讲,就是这段文字通过解析后变成了你所看到的网页,固然,这个源代码在互联网上传输,就像你把情书交给了一个不靠谱的邮递员同样不靠谱,这个邮递员大可能已经被你的情敌收买了,把你的信件拆开来添油加醋地加一点东西而后再神不知鬼不觉地封回去这样足够给你形成一些情感危机了,但https可以很好的避免这一堆问题,由于这段文字被加密了,若是不知道解密手段的话,即便添加了一些东西解密后也会变成一堆意义不明的数据,收信方也很容易察觉出问题.所以,https显然在防篡改方面比http要安全.
那么是不是HTTPS就必定比HTTP安全呢,HTTP是否必定不安全呢,就像文中做者所说的,无论怎么样必定要使用HTTPS作密码的登陆框,否则密码就会被泄漏.
其实这句话,就有点像就算是屠龙宝刀若是给一个菜鸟的话,恐怕真到约架时,也会被砍的娘都不认识,就算是一根树枝假如给的是独孤求败这种人物,就算是在多人一块儿上也是被扁的哇哇叫,打铁还需自身硬,若是自身都不够硬,真要干起架来,哪怕是再好的武器也于事无补.要理解HTTPS为何安全,安全在哪里,咱们就得有打破砂锅问到底,不到秃头不掉泪的精神以探其究竟.
在这里,咱们进稍微一步地探究下细节,有关于HTTPS的传输流程是怎么样的,能够看到,HTTPS比HTTP就多了一个字母S,这个S表明着SSL(Secure
Socket
Layer)的意思,也就是安全传输层,不要看名字那么高大上,实际上用人话来说就和笔者第一章说的那个送箱子的过程差很少,首先SSL层先使用公钥加密技术交换密钥对(好比RSA,ECC….),以后再使用AES
DES或者更经济点的RC4进行加密通信,看上去这个交递箱子的方案彷佛没有什么问题,但咱们回到那个交递箱子的过程
首先准备一个带锁的箱子,用钥匙把这个箱子打开(公钥)
把这个箱子交给邮递员,同时箱子里附上一个字条,上面写着:请接头人想一个咱们之间的通信加密方式,而后把密钥也放在箱子里锁上寄回给我.(经过公钥加密)
当这个锁上的箱子再次回到你手中时,用钥匙打开箱子,取得密钥和加密方式(私钥解密)
咱们作一个这个假设,假设这个邮递员准备了一个和你如出一辙的箱子,而后假装成你的接头人和你通信,再用这个伪造的箱子和你真正的接头人进行通信,那么你还能保证你的通信是安全的么.恐怕这个时候,即便是公钥加密技术也无能为力了,咱们能作的,只能是尽可能提醒接头人,好比在箱子上盖个印章条形码,并方方正正地写上”此箱子版权全部,仿冒必究,请到xx正品店进行专柜验证”,而后祈祷你的接头人会好好地验证这个箱子的真伪,但鉴于你和接头人从未谋面,恐怕他也并不知道你会不会给他寄个”带有防伪标签的箱子”,是的,这个过程几乎和ssl的理念同样,每一个https的站点须要向一个可信的第三方CA(数字证书的颁发机构)申请一个证书来向每个浏览你网站的人证实你是你,但浏览你网站的人可能根本没法意识到,你的网站是否进行过防伪了这种中间人攻击的手段又叫SSL剥离攻击,其原理图一看就明白大概是如何办到的
<ignore_js_op>
虽然不肯意认可,不过若是你的网路流量出入口真被某些居心叵测的破坏分子控制的话,你能作的就是尽可能祈祷这个家伙的技术水平不够到家和给你编写APP的码农技术到不到家了,搭建一个SSL剥离的攻击方案也许就是一个黑wifi,一次ARP劫持和几个脚本的事情了,实际上避免攻击的准则除了选择一个能够信赖的网络服务商,另外的更多工做须要在本身设计的代码中去实现而不是盲目地相信某种通用的手段(固然不是说HTTPS很差用,有条件固然仍是最好用上),一个最基本的理念是,若是攻击你的成本远远大于攻击成功取得的价值成本,就可以很大程度的避免本身被一些别有用心的大佬而不是吃的太饱的大佬摆上一道,这也就是为何咱们学习密码学的缘由,若是你能将那些更加复杂的公钥加密技术设计在你的通信体系中,设计的程序可以利用这些知识,去验证收到数据的真伪(好比验证可信CA颁发的签名证书)那么攻击者就须要花费更大的代价去剥离你的验证部分,或者根本就不可能在偶然的一次通信劫持中完成这类攻击.
但遗憾的是在代码通用化程度如此高的今天,尽管不少的软件运用了完善的加密体系最大程度地保证了通信的安全,但大部分由于开发成本或者是其它的关系,开发人员并无好好的给本身充个电认为使用现有的安全架构就可以一劳永逸去避免一堆可能带来的问题,例如这个登陆的验证问题,处理起来远远不是弄个证书整个HTTPS就可以解决的,但不管是出于开发平台仍是出于开发成本或者是开发员的技术水平,绝大多数的网站在保证安全这块都还有很长的路要走.
除了开发人员,最后是写给用户安全建议的:
请在信任的网络中下载程序或流量网页
若是你连入了一个不信任的网络,请不要浏览不带有效签名的网站,
不要下载没有有效签名的软件,若是你新的过这个没有签名的软件,也要在信任网络中下载
了解密码安全的一些知识
最后笔者在末尾想科普一下散列函数也就是俗称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函数.同时在设计通信架构时,永远不要相信当前的密码手段是永恒不破的,毕竟这就和明天我会不会中个亿元大奖而后走向人生巅峰同样,谁又说得清呢?