本文介绍了程序员应该了解的与网络通信相关的基本安全知识。下面,我们一起来看看吧。通信风险窃听:第三方可以获悉通信内容。篡改风险(tampering):第三方可以修改通讯内容。假装:第三方可能假装成其他人参与通信。风险防范信息加密传输,防止第三方窃听。增加了验证机制,一旦被篡改,通信双方都会立即发现。配备身份证书,防止身份冒充。哈希(Hash)哈希也称为散列,它通过哈希算法将任意长度的输入转换为固定长度的输出。输出是哈希值,也称为摘要。Hash是一个压缩图,通常这种变换是不可逆的压缩图。即哈希值的空间通常远小于输入的空间,不同的输入可能会哈希到同一个输出,因此无法从哈希值中确定唯一的输入值,但是如果outputdigits是足够的,不同的输入散列到相同输出的概率非常非常小。简单地说,哈希就是将任意长度的消息压缩成一定长度的消息摘要的过程。散列是不可逆的,即输入不能从输出中还原出来,这一特性常用于密码保存。SHA-512、MD5等是众所周知的散列函数。MD5生成的哈希码是128位,甚至MD5与哈希同名。您可以使用网站:https://passwordsgenerator.net/sha512-hash-generator/在线计算哈希值。哈希有什么用?散列可用于存储密码,以明文形式存储密码是危险的。通常我们把密码hash加密后保存,这样即使密码泄露了,因为是hash值,也没有办法推导出密码的明文(字典攻击很难破解)。验证时,只需要对密码(明文)做同样的哈希,将哈希后的输出与保存的密码哈希值进行比较即可验证身份。可用于验证下载文件的完整性和防篡改。比如网站在提供安装包的时候,通常也会同时提供md5值,这样用户下载后,可以重新计算安装包的md5值。如果一致,则证明下载的本地安装包与网站提供的安装包一致,网络传输时没有错误。加密加密是把明文变成密文的过程,解密是把密文反方向变成明文的过程。比如著名的凯撒密码,就是将每个单词映射到另一个单词,这样只要有密码本,就可以通过比较完成加密和解密。比如最简单的情况,对于26个英文字母,每个字母右移3,abc变成def。这也是一种加密。当然,这种加密方式非常简单,也很容易被破译。不过,诸如AES(高级加密标准)、3DES(三重数据加密算法)等被公认为难以破解,山东大学女教授王小云却很厉害。她破解了MD5和SHA-1,逼迫加密标准升级,终于成为院士。1.对称加密对称加密就是加密和解密的密钥相同,优点是速度快。这也是传统的加密方式,比如AES和3DES,都是对称加密。2.非对称加密非对称加密使用不同的密钥进行加密和解密。有两个密钥,公钥和私钥。公钥可以公开,私钥保存在安全的地方。RSA、ECC(椭圆曲线加密算法)、DH(密钥交换算法)都是非对称加密。非对称加密很慢,到底有多慢?与对称加密相比,慢了1000倍。因为速度慢,常用于密钥协商(Handshake)。协商会话密钥后,使用对称密钥对通信数据进行加密。1976年,WhitfieldDiffie和MartinHellman首先提出非对称加密的概念,该算法称为Diffie-Hellman密钥交换。然后在1978年,麻省理工学院的RonRivest、AdiShamir和LeonardAdleman发表了RSA算法。这些都可以认为是非对称加密的基础。非对称加密也称为公钥基础设施或PKI。非对称加密的提出是密码学的一场革命,影响深远。非对称加密算法用私钥加密,用公钥解密,或者用公钥加密,用私钥解密。证书证书就是证明我是我。比如你要访问中国银行的网站,中国银行的官网怎么证明是中国银行的官网呢?答案是数字证书。CA是数字证书中心。服务器需要找到CA进行认证,让CA给自己颁发数字证书。数字证书一般包含一些关于服务的信息和服务器的公钥。经过CA的私钥加密后,生成的数字证书是因为CA的权威性,其公钥是全世界都知道的,如果能用CA的公钥来解锁证书,就可以证明证书必须是CA颁发的,否则没有CA的私钥。密钥,不可能生成可以用CA公钥解密的证书。由此可见,数字证书采用的是非对称加密。数字签名在日常生活中也有签名。每个人的笔迹都不一样。刷卡消费后,在账单上签上自己的名字,服务员核实无误后保存。如果你拖欠帐单,你可以有签名作为证明,因为是别人写的。你手写的字和你手写的字总会有区别的。什么是数字签名?比如A发邮件,收件人如何证明这封信是A写的?本质上,数字签名也使用非对称加密。如前所述,非对称加密有公钥和私钥。如果发送方用私钥加密,接收方可以用发送方的公钥解密,就可以证明是某个发送方发送的,因为别人是拿不到的。一旦你得到了你的私钥,就不能用你的私钥加密,你也不能否认。数字签名通常是先对内容进行哈希处理,生成内容摘要,然后用私钥加密得到签名。密钥协商我举个例子来说明这些问题:张三有2把钥匙,一把公钥,对外公布,一把私钥,妥善保管,只有他自己知道。显然,非对称加密。李斯给张三写了一封信。写好后,用张三的公钥加密,通过邮局寄给了张三。邮递员就算打开信封看了也看不懂,因为里面的内容是密文,只有张三的密钥才能解密。张三收到信后,用私钥解密,就可以正常阅读了。现在张三要给李四回信。写好后,用哈希函数生成摘要。然后张三用私钥加密摘要,生成数字签名签名。然后在信的底部附上签名,一起寄给李四。过程是:字母明文->哈希->digist->私钥加密->签名。李四收到回信后,用张三的公钥解密了数字签名,得到了摘要,证明这封信确实是张三寄出的。为什么?因为如果不是张三发的,那么写信的人就没有张三的私钥,用其他私钥加密得到的签名,用张三的公钥是无法解密的。李四,然后对信件内容进行哈希处理,得到一个摘要,与上一步得到的摘要进行比较,如果一致,则证明信件内容没有被修改,信件内容做完了。并发症出现了。王五用自己的公钥替换了李四保存的张三的公钥,也就是王五欺骗了李四,李四误把王五的公钥当成了张三的公钥。你可以假装张三给李四写信(王五用自己的私钥加密)。有什么问题?问题是李斯不能确定自己保存的公钥真的是张三的公钥。如果客户端电脑上存储的工行官网公钥,实际上是某家诈骗公司的公钥,那就麻烦大了。怎么破?让张三去认证中心CA(CertificateAuthority)认证公钥。怎么做?CA中心用自己的私钥对张三的公钥等相关信息进行加密,生成数字证书(DigitalCertificate)。张三拿到数字证书后,以后回信给李四,同时在数字证书上签名。李四收到信后,从CA的公钥中解开数字证书,取出张三的公钥(一定是真的),然后就可以按照前面的流程安全愉快地解开签名了。加入数字证书后,最核心的区别就是张三的公钥不再保存在李四,而是通过数字证书签发。为什么数字证书中张三的公钥一定是真实的呢?因为CA是一个权威机构,假设全世界只有一个(其实不止一个,只是不多),它的公钥是全世界都知道的,是一个固定的字符串。因此,可以用CA公钥解密的证书一定是CA颁发的,因为CA是用自己的私钥来加密证书的。显然,非对称加密可以用来证明我就是我。密钥交换算法著名的DH密钥交换算法,这个算法很有趣也很巧妙。简而言之,就是通信的双方交换一点信息(不怕被偷窥),然后在两端产生一个分布。一样的钥匙,太棒了。有一个非常有趣的例子。爱丽丝和鲍勃想要协商公开颜色。他们可以交换信息,但是交换的信息可以被窃听者看到。我应该怎么办?我们可以在不让其他人知道的情况下协商公开颜色。首先,它们有一个共同的颜色,都是1ml黄色。然后Alice挑了一个privatered,Bob挑了green,都是1ml。只有自己知道,不会告诉别人。然后Alice将黄色和红色混合在一起,Bob将黄色和绿色混合在一起,每个2ml。然后,他们互相给了对方2毫升他们混合的颜色液体。然后,用你自己的1ml私人颜色液体,和你从对方那里得到的2ml液体混合,这就是见证颜色奇迹的时刻,他们得到的颜色是一样的,第三方也做不到通过偷看它们来传递数据,知道它们最终会变成什么颜色(基于一个假设,在图中解释)。密钥交换算法的原理与此类似。关于这个问题网上有很多资料。理解了上面的例子,我觉得再看ECDH就不难了。我们都知道http是一个互联网协议,但是它不够安全,所以出现了一个改进版的https,其实就是多了一个TLS,也就是传输层加密。本质上是通过握手协商出一个会话密钥,并传输后续的数据,都用这个密钥进行对称加密和解密。我们经常谈论安全通道。其实就是协商一个sessionkey,并不神秘。随便扔几张图片。为了减少这些RTT,想了各种办法,如果重用连接,可以做到0RTT和1RTT。就说到这里吧,最后抛几个名词,有兴趣的可以自己百度学习:DTLS、HMAC、AEAD、replayattack、amplificationattack,是不是很高端?
