网络安全的签名与认证是非常实用的技术知识,但是了解的人比较少。因为相关的内容基本都有成熟的解决方案,很少需要我们做什么。这些东西经常被用到,需要真正理解才能更好和更正确的使用。这里把相关的内容整理出来,帮助大家更好的掌握。
一、密码学
1.1 古典密码学
密码学的起源是古代战争。因为战争需要传递消息,而消息可能被对方截获。为了保证消息的安全,而产生了古典密码学。对原文进行加密,只有用特殊的方式才能还原。古典密码学主要有移位式加密和替换式加密两种。
移位式加密
如下图这样,将布条缠绕在木棒上,进行书写。拿掉木棒就是加密后的消息。需要用同样粗细的木棒重新缠绕上,就可以看到原始的信息。这里缠绕木棒后进行书写,就是加密算法。木棒的尺寸规格就是密钥。
替换式加密
替换式加密是将原文的字符按照指定的方式进行替换,从而让原文的意思无法被解读。如,a到z用00001到11010替换。hello就会变成01000 00101 01100 01100 01111。这种加密方式加密算法是替换文字,密钥是码表。
1.2 现代密码学
现代密码学主要伴随数据在网络上传输而产生。古代信件被截获也是有概率的,而现代数据在网络上传输,想要不被截获是不可能的。相对于古典密码学,现代密码学主要关注数据的加密与破解。现代密码学分为对称加密和非对称加密两种。
二、加密算法
2.1 对称加密
它的定义是:使用密钥和加密算法对数据进行转换,得到的无意义的数据即为密文;使用密钥和解密算法对密文进行逆向转换,得到原始数据。
加解密的过程如下图所示,它加密和解密使用的密钥是同一个,因而叫做对称加密。
经典的对称加密算法有DES和AES两种。因为DES密钥太短,只有56位,密钥短意味着可以使用的值比较少,容易被用“穷举法”暴力破解,因而被弃用了。现在主要用的是AES,它的密钥有128位和256位两种可选。
对称加密有一个缺点,因为数据都是在网络上传输,密钥也是通过网络传输,因而密钥有可能在传输中泄漏。密钥一旦被攻击者获取,加密也将失效。解决这个问题可以用非对称加密算法。
2.2 非对称加密
它的定义是:使用公钥对数据进行加密得到密文,使用私钥对数据进行解密得到原数据。
它的工作过程如下图,它的加密和解密用的是不同的密钥。用加密密钥加密的数据只有用解密密钥才能还原。因而,可以将加密密钥通过网络发出去,发送方用该密钥对数据进行加密,接收方用解密密钥进行解密。
由于解密密钥没有在网络上传输,因而没有被截获的风险。攻击者得到加密密钥也只能用于加密,不能对密文进行解密。因而是安全的。因为这两种密钥的特性,加密密钥又称为公钥,解密密钥称为私钥。
非对称加密是采用复杂的数学技巧,传统的密码学没有对应的原型。这里也不进行详细介绍,只要了解它有这种特性即可。
非对称加密也有一个问题,攻击者不能解密密文,但他可以拿到收发双发的公钥,对数据进行加密后发给双发。既是可以伪造消息。解决这个问题就要用到数字签名。
2.3 数字签名
数字签名是非对称加密的衍生用法。非对称加密有一个特点:公钥加密的数据私钥可以解;私钥加密的数据,用公钥也可以解。即公钥和私钥可以互相解密。
因而,反着使用非对称加密算法--用私钥对数据进行加密,就可以对数据进行签名。因为只有签名方才有私钥,如果公钥可以解开这个消息,这个消息就一定是签名方发的。具有不可伪造性。
为了方便比对,通常发送方会将原文和签名后的数据一起发送,接收方将签名数据解密后与原数据对比。如果相同则可以证明是来自发送方的。
这里说公钥和私钥可以相互解密,并不意味着公钥和私钥可以互换。公钥和私钥在诞生时,它们的身份就确定了。公钥就是公钥,私钥就是私钥。因为公钥通常是可以用私钥计算出来的。而私钥不能通过公钥来计算。
例如,加密比特币的椭圆曲线算法。它的大概思路是,选择椭圆上一个顶点和发射算法,从这个顶点进行发射,遇到椭圆的边进行一次弹射,弹射的次数是私钥,而最终弹射的位置则是公钥。确定了弹射次数之后,我们就能确定最终的位置。而如果只知道最后的位置是无法确定弹射次数的。
加密+签名
加密是问了防止消息泄漏,签名是问了防止消息伪造。
增加了签名机制的消息传输机制如下图。发送方用对方的公钥对数据进行加密,同时再用私钥对数据进行签名。这两包数据同时发送给对端。接收方收到数据后,公钥对签名数据解密,确定发送者的身份。用私钥对解密密文拿到原始数据。
这个机制还有一个问题,就是攻击方拿到这一包数据后,用公钥对签名数据解密,还是可以拿到原数据。解决这个问题,就要用到下面说的哈希算法。
三、哈希
Hash的原意是“将东西切碎”的意思。这里Hash算法是把任意数据转换成指定大小范围的数据。例如学校给每个学生一个学号,用这个学号可以指代这个学生。它的主要作用是做摘要和数字指纹,用来进行数据完整性验证、快速查找和进行隐私保护。经典的算法用MD5、SHA1和SHA256等。
3.1完整性验证
我们可以将一串很长的字串进行Hash,得到一段很短的序列。进行网络传输时,将数据和Hash序列一起发送出去。接收方拿到数据,对数据进行同样的Hash,如果得到的序列和发送方给的Hash序列一致。则说明数据在传输中没有丢失或者被破坏。
3.2快速查找
java中经常用Hash算法实现相等性的快速比对。我们知道有一条规则是“重写equals方法,也要重写hashCode方法”。
java就是用这两个方法判读对象是不是相等。这样的设计是出于性能考虑。hashCode方法开销很小,可以快速进行粗略判断。相同的对象hashCode一定相同,不同的可能相同。因此通过判断hashCode不同,就可以快速判断两个对象不相等。如果两个对象hashCode相同,则再用equals方法精确比对,确定是否同一对象。
3.3隐私保护
用户登录网站的信息,通常保存在服务器的数据库中。如果这些信息如果用明文保存,一旦信息泄漏,就会带来很大的安全风险。
因此,用户登录信息,通常是经过Hash处理(如,SHA1算法)之后保存到服务器。用户登录的时候,用同样的SHA1算法对登录信息进行Hash,如果Hash后的值与库中存储的一致,则认为登录有效。
因为经过Hash处理后的数据,无法还原原数据,因此即使数据泄漏也不会造成风险。如,SHA1(“test@123”) = fdjsaklklljk…,无法根据密文还原原文。
彩虹表攻击
针对服务器用Hash加密登录信息的方法。攻击者通常采用“彩虹表”的攻击手段。彩虹表,就是将常用的密码用Hash算法整理一张表。然后用从服务器获取的密文进行一一比对,通过穷尽暴力破解。
彩虹表形式如下,它可以有几百上千万行,这个数据量对于现代计算机来说不是问题。
SHA1(“123456”) = kljklnklnklj
SHA1(“666666”) = jklsafdagdsa
SHA1(“111111”) = fadsdgfdghds
SHA1(“888888”) = fasdfdfasdf
…
加“盐”
为防止彩虹表攻击,服务器通过加“盐”的方式,进行防范。它的方法是在用户信息上,增加一段特有的信息,对这一段信息进行Hash。如,用户信息是:zhangsan,盐是123,Hash的数据可以是SHA1(“zhangsan123”)。加盐之后Hash的数据和元数据Hash的结果有极大的差异,会导致彩虹表失效。并且“盐”和加盐的方法,是每个服务器严格保密的信息。它可以有效的防止彩虹表的攻击。
四、网络安全认证过程
通过前两个章节加密算法和Hash算法的介绍。看一下加密+签名+Hash的完整网络安全认证过程。
发送方先将原数据进行Hash,生成简短的摘要信息,对该摘要信息用私钥进行假面,形成签名摘要。同时发送方将原数据用对端的公钥进行加密。这两段数据同时发送到对端。对端先用私钥对原数据进行解密,然后用公钥对签名摘要进行解密。再对解密后原数据进行Hash,用生成摘要与签名数据比对,验证发送者身份。身份验证成功后,再使用解密后的原数据。
这个过程可以做到安全的信息传递。Hash后生成的摘要体积要比原数据小的多,可以减小需要传递数据的体积。
因为非对称加密算法比较复杂,开销较大。通常网络连接再第一次建立连接时使用非对称加密。连接建立后,使用非对称加密方式,传递对称加密密钥。在后续信息交互中,使用对称加密的方式,以此来提高网络访问的性能。
以上就是完整的网络安全与认证过程。主要涉及到非对称加密、签名、Hash和对称加密几个相关的知识点。