zoukankan      html  css  js  c++  java
  • Internet History, Technology and Security (Week⑨)

    Week ⑨

    We are now on the second to last week of the class and finishing up our look at Internet Security. You can also see the final exam and its due date. The due date of the final exam signals the end of the class.

    This week, we’ll be covering web security. We apply the basic ideas of encryption and signing to who we actually secure the connections that we use on today’s Web and Internet.

    Security: Web Security

    coursera address

    Secure Web Connections

    KeywordPublic-key cryptography, SSL, TLS, HTTPS, (CA)Certificate Authority, digital certificate

    Security Public/Private Key

    接着上篇讲到的密钥分类,如果决定使用私钥(private key)加密,那么密钥的保密就很重要,因为泄漏密钥等于信息泄密。例如,我们觉得凯撒密码很容易破解,是因为密钥被我们知道了(按字母表顺序推移),所以加密效果形同虚设。但说句实话,如果我们不知道凯撒密码的内涵,那么突然放一个经过凯撒密码加密的句子在你面前,多多少少还是有那么点保密性的。

    但在网络安全这方面,采取私钥不是一个特别好的方法,因为私钥一定是要发送方和接收方两方私有的,所以不能使用网络去传输,就比较麻烦。(一定要假想网络环境是不安全的)在解决这个问题时,有一个非常聪明的想法,就是公钥加密系统,Public-key cryptography

    这套系统最早由 DiffieHellman 在1976年提出。最基本的概念是这样:公钥加密系统会有两个密钥,一个是公开的,另一个是私有的。公钥用来加密,私钥用来解密。所以说,公钥体系的密钥是非对称的。

    简单地讲,在使用公钥系统时,产生一对密钥的原理主要是来源于大素数。先挑选两个比较大的素数,然后将其相乘,得到一个结果。既然是素数,那就是说,除了1和它本身以外不再有其他因数。所以说这个相乘的结果虽说不是素数,但因子也很少,只有1、那两个素数、和它本身这四个数。(可以先简单地认为:公钥是两素数的乘积,私钥是两个素数。)这里的数学奥秘是在于:当这个两个素数足够大时,对乘积进行因式分解,也就是分解两个大素数之积,这在数学上是一个很难的问题。也就是说,从可计算性理论的角度来看,用公钥去破解得出私钥的难度极高,几乎是不可能的。

    例子: 数字55124159的因子是什么?这个问题是非常难的。但是如果已经有了一个因数,求另一个因数是相当容易的:什么数乘以7919会等于55124159?只要做一下除法就知道另一个因子是6961。

    对于分解大素数之积,如果已知一个因子,那么知道另一个因子会相当容易。但是如果只想通过积来得出两个因子,那会相当困难。这就是公钥加密安全性能的理论:公司保存私钥,用来解密。用网络传递公钥给用户,用户用公钥加密,用户不需要解密,所以不需要了解私钥。

    好处:因为公钥是在网络上公开的,所以会有被别有用心的人收到的风险。但是通过公钥(大素数的积)去破解私钥(两个大素数因子)是很困难的,所以就算公钥、或者加密过后的密文被攻击者拦截到了,对攻击者来说也是毫无用处的。公司收到用户的密文,再通过私钥解密得到明文即可。

    当然,如果给出了一个大素数的积,那么理论上就存在那两个大素数因子,理论上也是可以破解的。那为了防止被破解,要怎么操作呢?那就得采取很长很长的素数作为私钥了。在RSA算法中,为了保证安全性,已经用到了1024位长度的素数。如果在不久的以后,计算机的运算速度又大大增加了,那么我们就只能把素数的长度再加长,使得这个大素数的积“看起来不可能”被破解。然而实际上,还是存在那一点点被破解的可能的。

    讲了公钥加密的优点,但公钥加密不是一点缺点也没有。就拿RSA算法来说,RSA的安全基于大数分解的难度,所以理论上不是完全安全的。第二,从积分解出因子很困难,但要产生那么长的素数作为因子也不是一件很容易的事情,所以相较对称加密,运算代价很高,速度较慢。

    Secure Sockets

    下面要说的是位于应用层和传输层之间的一层,叫做SSL,英文是Secure Socket Layer。

    我们知道HTTP是TCP层上的一个协议。鉴于安全方面的需求考虑,HTTP也是有所发展的。在TCP层和Application层之间,有一层新的我们需要考虑的分层,叫做Secure Sockets Layer,它在网络信息交流中提供上文提到的公钥加密体系协议,为信息的安全提供保障。Socket的中文意思是插座,也比较好理解,好似提供了安全的接口。运用了SSL的超文本传输协议叫做HTTPS,意思可以是HTTP Over SSL 或者 HTTP Secure。SSL是由网景公司研发的(Netscape真的好厉害,第一个大型商用浏览器、JavaScript、还有这个SSL)。经过这么些年,SSL当然也有进步,现在已经管它叫TLS了(Transport Layer Security),在wiki中输入SSL或者Secure Sockets Layer也会直接跳转到TLS。

    TLS有以下功能:

    • 能够确保网络通信的私密性(也就是confidentiality)。
    • 密钥生成算法。本堂课也略有分析,wiki也有很详细的介绍。
    • 共享密钥是安全的,可靠的。
    • 通信双方的身份可以使用公开密匙加密认证,这是可选的,但通常至少得有一方做认证。(下文会提到的Certificate Authority)
    • 包含一个消息完整性检查:使用消息身份验证代码,防止数据在传输过程中的损失或变更(确保了Integrity)。

    除了这些最基本的,还有一些优点:

    • 仔细配置的TLS可以提供额外的隐私相关的属性。例如能确保未来的任何披露任何TLS加密密钥不能用于解密过去的通信记录。
    • TLS支持许多不同的方法交换密钥,加密数据和消息完整性进行身份验证
    • TLS有许多不同方法来交换密钥、加密数据、验证信息完整性。因此,TLS支持丰富的可配置安全参数。也就是说可以根据安全等级级别需要来选择合适的步骤。

    基于网络四层模型的分层的好处,底下的三层在传输数据的时候(无论是hop、router、Network等等)传输的都是密文,然而对它们来说这是没什么影响的。

    作为网络的普通使用者,在输入例如信用卡账号密码这样的敏感信息时需要对网页地址要多个心眼:看一下URL的开头是不是HTTPS。如果只是HTTP那要谨慎操作。同时,还是要注意电脑系统安全的防护,因为电脑病毒可以记录你的键盘操作从而得到明文。总之,安全第一!


    Integrity and Certificate Authorities

    公钥加密系统解决的是confidentiality。所以说,还有Integrity要解决。

    之前提到Integrity时,作为接受信息的Bob,要确保:1、邮件真的是Alice发过来的 2、信息内容没有被人篡改。我们可以使用由哈希加密算法产生的数字签名来确保接受到的信息的Integrity。

    在网络上交流敏感信息,还要考虑的另一个问题。假设我们是用户,需要向购物网站提交例如银行卡密码这样的敏感信息,那么我们发送信息之前,必须确定对方的身份真实性。因为有可能有第三方做一个钓鱼欺诈网站什么的,欺骗我们把信息发给第三方(我们误以为发送给了真正的购物网站)。换句话说,作为Alice也要确认我们的发送对象是真的Bob。

    Certificate Authority

    wiki:Certificate Authority

    In cryptography, a certificate authority or certification authority (CA) is an entity that issues digital certificates. A digital certificate certifies the ownership of a public key by the named subject of the certificate. This allows others (relying parties) to rely upon signatures or on assertions made about the private key that corresponds to the certified public key. In this model of trust relationships, a CA is a trusted third party—trusted both by the subject (owner) of the certificate and by the party relying upon the certificate.

    认证授权,简称CA。CA解决的问题就是数字认证。CA依靠的是一个具有公信力的第三方机构,在这个机构能够提供证明,证明网站发布的公钥的所有权确实是此网站,以及网站拥有者的身份。

    网站如果确实需要获取用户的敏感信息,那么就需要做数字认证。网站向CA申请安全认证,需要花费一笔钱。CA机构也必须花费精力去验证申请者的身份,以防虚假身份的人取得了安全认证。Verisign就是一个优秀的CA机构。在它多年的发展中,经受了充分的考验,取得了非常强大的信任度(信用真的是一个人很重要的东西)。在安装操作系统、浏览器时,会预装确信的CA,例如Verisign。那么电脑就知道了,经过Verisign授权安全认证的网站,身份就不是虚假的,安全又多了一份保障。

    This is my Mac, you can see the companies that have been included by Apple as the manufacturer of the operating system. And so you see that Verisign is one of those companies that has been pre-included in Apple Macintosh. Which means that a certificate from Verisign is going to be known, right? So, let's, so let's look a li, a little bit more. So, so these come, your browsers and your operating systems come with pre built in public key certificates for certain certificate authorities like Verisign.

    具体的工作流程是这样的。亚马逊先去CA申请数字认证。Verisign完成验证亚马逊网站的身份后,向其授权了安全认证。于是,亚马逊网站在把公钥发送给用户之前,先发送给Verisign,Verisign通过自己的private key,把生成的证书摘要(digest)附在亚马逊的公钥上面,再送回亚马逊。

    带有digest的公钥,就和以前不同了。它是经过一个第三方具有公信力的公司赋予数字证明的公钥,所以具有身份验证性和信用。这样,别的人就很难去伪造它。

    用户想在亚马逊上购物,浏览亚马逊的网站,输入敏感信息时。浏览器(或者操作系统)可以检测到Amazon public key是经过Verisign验证的。这样就保证了公钥的的确确是亚马逊发送过来的。用户输入的信息被公钥加密,再送回Amazon,Amazon使用它的private key解密,得到明文。一轮安全的传输就完成了。

    在网络中传递的要么是亚马逊的公钥、要么是用户加密后的密文。私钥都保存在Verisign和Amazon的服务器中,这样就实现了在危险的网络环境下的信息传递的安全性。


    在对Bruce Schneier的采访视频中,有一些话让我印象挺深。

    Without Cryptography, the organization like NSA(美国国安局) can bulk collect data on everybody. With Cryptography they are forced to target and that's extraordinarily valuable.

    在没了解它的机制之前,我们也许会觉得诸如“密码学”这样的术语十分高深神秘。但其实在数据结构课上了解过RSA、在学了Dr.Chunk的这门入门课后,你会发现密码学探寻的其实就是优雅的数学之美。

    如同我们之前一直反复提到的那样,没有绝对的安全。就算强如RSA,也可能被暴力破解。那么密码学存在的意义是什么呢?如果没有密码学的这些研究,那么gov就能轻而易举地大批量地获得所有人的各种数据。gov具有计算能力超强的资源,因为有了密码学,这些超级计算机也不会被滥用。它更多的是保护你我这样的普通人,保护了我们的隐私。

    See Also

  • 相关阅读:
    tp5 宝塔open_basedir restriction in effect 错误; IIS open_basedir restriction in effect
    如何封装一个自己的win7系统并安装到电脑做成双系统
    推荐7个模板代码和其他游戏源码下载的网址
    PHP简单实现异步多文件上传并使用Postman测试提交图片
    PHP公众号开发给用户发微信消息提醒功能
    解决在页面中无法获取qrcode.js生成的base64的图片
    如何使用GUID硬盘分区格式安装新windows系统
    超详细的纯净windows系统重装示例
    Spark之join、leftOuterJoin、rightOuterJoin及fullOuterJoin
    Spark中groupByKey、reduceByKey与sortByKey
  • 原文地址:https://www.cnblogs.com/ZCplayground/p/6433006.html
Copyright © 2011-2022 走看看