信息的保密和认证
转载互联网,作者不详,是一篇好的科普贴。
我们在互联网上发布和接收着各种各样的信息:浏览网页,发布文章,下载文件,上传视频,网购......诸位,我们肯定希望自己接收或发布的信息不被篡改吧?我们肯定不希望自己被钓鱼吧?我们也不希望自己干了吗都被别人看得一清二楚吧?
很可惜互联网先贤们在设计互联网的时候重点放在连接上了,而没有考虑安全,导致我们所熟悉的互联网到处是漏洞:
1,信息是以明文的方式传输的,也就是说,路上随便谁都可以看到信息内容;
2,通信双方没有身份认证机制,随便来个家伙都能冒充其中一方进行通信(想到钓鱼网站了吗?)
3,没有对信息的完整性校验机制,导致第三方能随意篡改信息(例如对下载的软件挂马)
没办法,后人只能当救火队员了!各种加密算法由此而生,DES,AES,RSA,Diffie-Hellman......说起加密,那可是一门复杂的学问,对称加密和非对称加密,各种不同的加密算法,他们各有各的特点,各有各的适用范围。例如对称加密(加密密钥和解密密钥是同一个)适合给大量数据加密,多用于维持加密连接;而非对称加密(加密密钥和解密密钥不同)适合给少量信息加密,再加上加密密钥和解密密钥不同,多用于在不安全的信道上完成密钥交换建立加密连接。(这只是很简单的介绍,我有空会仔细聊聊,密码学非常复杂)
大概会有人认为有了加密算法之后就万事大吉了:只要保管好密钥,信息在传递过程中自然不会被第三方得知内容,面对无意义的密文,第三方也无从下手,可以说通信双方是高枕无忧了!
哪有这么美好的事情?
首先很多时候都没办法事先保管密钥的,例如用户和网站发起连接,请问怎么事先商定密钥?线下商量吗?而如果线上商量,那么第三方就可以制作钓鱼网站,诱使用户落入陷阱。
还有就是,第三方虽说无法得知通信内容,但照样可以搞鬼:第三方可以在密文中增加或减少几个字符,从而完全改变内容;还可以复制密文,再进行重放(即重放攻击,例如截取并重放cookie,可以直接在不知道用户名密码的情况下完成登录,从而偷取账号);也可以把木马加入进去(特别是下载的时候)。
而且不仅仅第三方会捣鬼呢。想象一下这样的场景:A和B达成了一笔交易(B以一定价格向A买了一定数量的货物),A送去了一条确认信息(确认B花C美金买了D吨货物),然后B就把钱打到了A的账户里;可是等B向A索取货物时,A赖账了。A说:”我从来没有送过什么确认信息。“
对,A和B的通信一直是加密的,两者事先商量好了密钥。可是当B提出了这一点时,A却说:”首先,你怎么证明和你商量密钥的是我?而且你也完全可以自己伪造一条确认信息,然后说是我发的。“B没有办法了。
如果A和B有多笔交易,情况会更复杂:A和B正常完成了第一笔交易,但是在第二次交易的时候,货物价格暴涨了。B不想当冤大头,就故意复制了第一次交易时A的确认信息,然后取代了第二次交易的时候A发送的确认信息。A发现不对,就找到B说:”这根本不是我发送的信息!“然后B很淡定的说:”拜托,这就是你发送的好不好?不信你自己看看!“A发现这信息和第一次的确认信息一模一样,怀疑B复制并替代了信息,但是找不到任何证据。
怎么解决呢?
首先是双方要都有身份证明(具体拿什么做身份证明合适以后再说,总之要有身份证明,否则就可以随便赖皮了)
然后该怎样解决伪造和复制的问题呢?
对付复制其实很简单:time stamp(时间戳),在每条信息上都打上时间戳,这样就能识破冒充新信息的旧信息了。
那伪造呢?这就比较复杂了。
如果采用对称加密,那么有个问题始终解决不了:双方都可以伪造对方的加密信息然后互相赖皮(如果说双方直接通信的话),除非.....
老大哥出场!老大哥知道一切,所有人都信任老大哥,这是前提;因为只要有一个人不信任,那就又可以赖皮了。
直接看图吧[1]:A是A的身份证明,B是B的身份证明,RA是A生成的随机数,t是时间戳,P是确认信息内容,KA括起来的是A用自己的私钥 加密的信息;A将信息传送给老大哥,老大哥解密之后再用B和自己的密钥BB重新生成信息,其中的KBB加密部分是B无法解密的。
A发送了确认信息之后依旧想赖账,于是就宣称自己没发送过什么确认信息;B自然不干,于是就把A告上法庭。
法官:”B,你凭什么说这确认信息是A发送,而不是你或者其他什么人伪造的?“
B:”首先,如果说是我自己伪造了信息,那么老大哥就绝对不会接收到这条确认信息并进行重新处理的。“
法官:”老大哥,你接收到了A发给B的确认信息了吗?
老大哥:”查询记录中.........我接收到了!“
B:”我们都信任老大哥,没错吧?时间戳和随机数可以证明这条信息不是复制而来的。还有一点,如果法官大人你还不相信我,那么可以请老大哥解密这条我无法解密的信息(也就是KBB加密的部分)“
法官:”老大哥,请解密这条信息。“
老大哥:”OK......解密成功!内容是A的身份证明和时间戳以及确认信息的内容!“
法官:”这样就可以确定了,这条信息不可能是其他人伪造的(因为其他人不知道老大哥的密钥,无法伪造出KBB部分),A,这条确认信息就是你发送的!不要想赖账。“
案件关闭。
听起来很完美,问题在于......上哪找这样一个老大哥去?政府?哈,千万别开玩笑,最不能相信的就是政府了!
那么就只能依靠非对称加密算法(公钥加密算法)解决问题了:还是请诸位直接看图[2],A先将确认信息内容P用自己的私钥DA加密,然后再用B的公钥EB加密,然后发送给B,B再用自己的私钥DB和A的公钥EA解密得到P(图中省略了时间戳,当然还是要有时间戳了)
现在,我们亲爱的A还是想赖账,于是B又把A告上法庭了。
法官:”B,你怎么证明这确认信息是A发出的?“
B:”我手中有用A的私钥DA加密的信息DA(P),只有A能做到生成这样一条信息,因为只有A知道私钥DA!“
法官:”我用公开的EA解密看看......啊,结果是P,也就是说这的确是A生成的信息。A,这确认信息就是你发出的,不要想赖账了!“
案件关闭。
不过公钥加密算法方案也不完美:A可以赖账说自己的私钥丢失了,或者A更改了私钥而B用的是原先的公钥进行解密,结果B又没办法了。
共有 0 条评论