LH 知库 | 密码与你无关?
密码是不是一个难以捉摸的词汇,密码跟“口令”、“编码”是否有什么区别?
我们平时登录淘宝、微信时需要输人用户名和密码,在银行取钱时也会要求输入密码,一提到 “密码”,大多数人是想到上面这些情形。但是,所有以上场景输人的密码,都只是一种身份验证的凭据,即向系统证明你才是这个账号主人的一种证据,类似旧时的 “天王盖地虎!” “宝塔镇河妖!”。严格来说,这种 “密码” 应该是叫作 “口令”。
我们也习惯把DNA称作 “遗传密码”, DNA的功能是将一种信息(如蛋白质的结构信息)转换成另一种信息(碱基的序列)并记录下来。如同将歌曲转换成MP3文件一样,本质上是一种编码的过程,因此这里的“密码”更准确的说应该是一种“编码”。
那信息加密里边涉及的“密码”到底是什么呢?简单来讲,这里的“密码”是一个庞大信息处理体系,涉及到信息的机密性、完整性、认证等多方面,由此而衍生出的密码技术无时无刻不在护卫着我们生活中的各种信息安全,我们今天就来认识一下这第三种 “密码” 。
密码技术是如此重要,但又是那么的不起眼,以至我们很少注意到它们的存在,更鲜有人知道我们为什么需要它们,以及它们究竟是怎样工作的。对于密码技术,可以说大多数人都处于一种 “既不知其然,亦不知其所以然” 的状态。在如今这个信息爆炸的时代,我们每个人都和信息安全脱不了关系。因此,正确理解密码能做到什么,不能做到什么,对于培养我们的信息安全意识是非常重要的。
密码技术需要解决的问题有三种:机密性,完整性,认证性。
我们首先来考虑这样的一个场景,发送者A向同事B发送一封电子邮件,在互联网中,邮件会经过许多台计算机和通信设备进行中转,在这过程中,就存在被恶意窃听者偷看到的可能性,不让窃听者了解到邮件的内容,这便是我们首先要解决的第一个问题“机密性”。
除了窃听者,在邮件的传输过程中,我们还有可能遇到篡改者。篡改者截取发出的邮件,改变邮件内容后,再发送给接收者B。那么当B接收到邮件时,如何确认这封邮件就是同事A发过来的内容,没有被别人篡改过呢?这就是我们要解决的第二个问题“完整性”。
除了窃听者、篡改者,在邮件的发送中,我们还有可能遇到第三种人:伪装者。伪装者假冒A的身份,向接收者B发了一封邮件。当B接收到邮件时,如何确认这封邮件就是由同事A发送过来的呢?这就是密码技术需要解决的第三个问题“认证性”。
所有的密码技术就是围绕着上边三个问题展开的,密码学家为了护卫我们的信息安全,在他们的工具箱里开发了各式的工具。现在,就让我们来看一看这些工具:
当我们在电脑上打开文件出错时,会看到一些乱码,这时,就算有文件在手,也没法看明白文件里的具体内容。在密码技术里,配合使用加密、解密技术就可以达到类似的效果,从而解决信息“机密性”的问题。
我们还是回到之前发送者A向同事B发送一封电子邮件的场景,不过这一次,发送者A不向同事B直接发送邮件的内容“明文”(我们称直接展示信息内容的文件为明文)。发送者A通过秘钥将明文加密,加密之后的明文就变成了一个看不懂内容的“乱码”文件(密文),然后A将密文通过网络传递给同事B,B在自己的电脑上收到密文之后,再通过秘钥解密“密文”,将明文还原回来后,就可以阅读到邮件本身的内容了。注意在这一次的邮件传递过程中,在互联网上传递的只有邮件的密文,因此假设有窃听者存在,窃听者通过网络能够得到的也只是经过加密之后的密文邮件,窃听者是无法获知邮件里边所承载的具体内容信息的。
在现实世界中,钥匙是形状复杂的小金属片。而在电脑世界中,密钥就是一串很大的随机数字,例如:903854714568407690355673007683435768。
上边例子里,同事B解密密文用的秘钥和A加密明文用的秘钥是相同的,我们称这样的秘钥为对称秘钥。聪明的读者肯定就会想到一个问题了,同事B解密密文需要秘钥,那么A怎么把秘钥安全的发给同事B呢?如果有这样的一个安全途径存在,那么A直接通过这个安全途径把邮件(明文)发送给B不就行了么?这个问题,就是我们在密码世界里边碰到的“密钥配送问题”。
密码专家对这个问题的解决方式是:那就让解密用的秘钥和加密用的秘钥不同,解密秘钥一直由信息接收者持有,不会在互联网上传递,这样也就不用担心解密秘钥被窃听者劫取到了,我们称这样的密码为公钥密码(与对称密码相对应),公钥密码可以说是密码学历史上最伟大的发明。公钥密码具体的加、解密方式是这样的:
首先由信息接收者(同事B)生成一个密钥对(包含一个加密用的公钥和一个解密用的秘钥,两者不同),B将公钥通过互联网发送给同事A(公钥被窃听者获取也没有关系,因为公钥只能用于加密,不能用于解密),A用接收到的公钥加密自己想发送的邮件,然后把邮件密文发送给同事B(邮件密文可能被窃听者获取),B收到邮件密文后用解密私钥进行解密,然后就可以获得明文内容了。我们回顾一下整个过程,窃听者有可能通过网络获得加密公钥和加密之后的邮件密文,但是密文只能由私钥解密,用公钥无法解密,因此窃听者就算获得了密文和公钥,也无法得知邮件的具体内容。这个信息传递过程如下图:
以上就是我们对信息传递过程中“机密性”问题的解决,那么我们是怎么解决“完整性”问题(防篡改)的呢?——通过算出每一条消息的散列值(散列值可以形象的理解成一条消息的指纹,两条消息哪怕稍有不同,“指纹”也会完全不同)。
散列值是通过对消息运用单向散列函数计算得出,散列值具有如下几个特征:
1.长度固定:任意长度的消息计算出的散列值长度都是固定的。
2.消息改变,散列值就改变:一条消息,哪怕只有一个比特的改变,它的散列值也会发生很大的变化。
3.单向性:任何人也无法通过散列值反算出消息的性质。根据消息计算散列值可以很容易,但这条单行路是无法反过来走的。
有了散列值之后,A在向同事B发送加密邮件时,就可以同时将原先邮件明文的散列值计算出后发给同事B(散列值发送可以不用加密,单向散列函数不是一种加密算法,因此也无法通过解密将散列值还原为原来的消息),同事B收到邮件密文后,通过解密还原成明文,再自己计算出明文的散列值(散列值的计算方法都是通用的),与同事A发过来的散列值进行比较,如果二者完全一样,则可以确信A发送过来的邮件没有被篡改过。
运用散列值的时候会遇到一个问题,如果伪装者伪装成同事A,同时将文件以及它的散列值发给接受者B,那么B自己计算出的散列值肯定会和接收到的散列值相同,那么这时,B如何确认这次的信息就是由同事A发出,而不是由其他的伪装者发出呢?这就是我们面临的第三个“认证性”问题。密码专家运用了消息认证码MAC(Message Authentication Code ),通过消息认证码MAC,可以同时解决“完整性”、“认证性”两个问题,我们在银行转账时,常听到的一个SWIFT就是运用的消息认证码MAC技术。
在计算MAC时,需要用到两件东西:想传递的消息以及在发送者、接收者之间事先共享的密钥。关于散列值和MAC,大家可以这样理解:计算散列值,只需要想要传递的消息就可以了;MAC在此基础上更多了一个东西,需要事先共享的秘钥,MAC实际上就是一种需要“共享的秘钥”才能计算出来的散列值。因为伪装者作为第三方,没有事先共享的秘钥,所以伪装者是不能够计算出消息MAC值的,因此这样就解决了“认证性”(防伪装)的问题。
从历史上的密码开始,包括简单替换密码到二战时著名Enigma密码机的攻破(破解者是现代计算机之父:图灵),到现在我们大家每日都使用的对称密码(AES、Rijndael算法)、公钥密码(RSA,发明RSA算法的三人于2002年获得了计算机科学界的诺贝尔奖—图灵奖)、混合密码系统(结合了对称密码以及公钥密码两者各自的优势)、散列值、消息认证码(在SSL/TLS中的应用,SSL/TLS 是世界上应用最广泛的密码通信方法)、数字签名(不仅解决了消息“完整性”、“认证性”两个问题,还具有防止消息发出者“事后否认”自己行为的功能)。
上述的现代密码技术依然不是终点,比如量子计算的出现就对当前主流的非对称加密算法构成挑战,有可能只要较短的耗时就能破解(经典计算机需要数以万年计才能破解),显然解决的方法就是量子密码技术,利用量子纠缠特性来确保共享信息不会被窃听。
领航新界技术合伙人谭永献认为,对密码世界的方方面面做一个整体的了解,知道密码世界的基本框架,对我们更安全地处理自己的各种信息,一定会带来很大的帮助。信息安全的重点在于流程而非产品,我们要懂得在生活中不应肓目相信计算机,而应掌握相关的信息安全知识,注重培养健全的安全意识!
END