加密分为 对称加密 和 非对称加密。\
1. 对称加密
现有A,B两人有书信往来,为了避免信件在邮寄过程中被人偷拆查看内容,双方约定,信中所涉及到的数字,写的人要 +7 处理,看得人要 -7 处理。
现在A给B写信:
我家有6只老母鸡,4只小羊羔,来我家杀鸡宰羊款待你。
翻译过来就是:
我家有-1只老母鸡,-3只小羊羔,来我家杀鸡宰羊款待你。那么B看到了信就领悟了精神:A家啥玩意没有。
\
这个 “ + ” 就是算法(计算方法),这个“ 7 ”就是私钥,“6”和“4”就是密文,“-1”和“-3”就是原文(我们习惯叫明文), “ +7 ” 过程的复杂度决定了这种对称加密的安全性,复杂度越高,安全性越高,复杂度越低,安全性越低。
加密和编码的区别是什么?
编码为了降低解码成本(比如unicode)
加密为了正价解码成本
\
常用的对称加密方式AES加密
首先,AES加密 = 算法 + 私钥,也就是 “ + ” 和 “ 7 ”,只不过AES加密产出的算法和私钥都比较复杂,很难通过在没有算法和私钥的情况下由密文推理出明文。
但是,AES加密的算法是公开的,这和举的AB例子有本质区别,这就要求必须保证私钥安全。
下面就是前后端http协议通信时,通过对数据AES加密,避免明文传输的例子。
\
\
但是我们知道,黑客会通过DNS劫持等方式截取我们http请求\
\
\
\
算法和私钥都被黑客拿到,所以,单纯的AES加密安全性鸡肋。
写死在客户端更不行,JS文件没有安全性可言。
\
2. 非对称加密
假设:A与B要进行通信, C想窥探通信内容
B自己产出4个东西,加密算法 + 解密算法 + 公钥 + 私钥
其中 加密算法 + 解密算法 + 公钥 都被公开, 所以A 和 C都能获得A通过 加密算法 + 公钥 对信件明文进行加密,可以简化成
加密(公钥 ,明文) = 密文B拿到密文,通过解密算法 + 私钥 对密文进行解密,可以简化成
解密(私钥 ,密文) = 明文C拿到密文,由于没有私钥,空有解密算法是不能得到明文的。
解密( XX ,密文) ≠ 明文
**
**【也可以用私钥加密,公钥解密】
\
常用的非对称加密方式RSA、ECC加密
RSA加密方式就是上述的ABC案例加密方式,他的大致算法如下:\
生成两个质数 p 和 q
n = p × q
φ(n) = (p - 1)×(q - 1)【欧拉函数】
公钥 = e
e的取值要求:
① 1< e < φ(n) 【且e为正整数】
② e 与 φ(n) 互质5.私钥 = d
d的取值要求:
① e × d ÷ φ(n) ........... 余 16.加密算法 = me ÷ n 得余数=> c 【其中m为明文,c为密文】
7.解密算法 = cd ÷ n 得余数=> m 【其中m为明文,c为密文】
\
总之RSA的核心就是因式分解,简单说就是知道p 和 q就能破解密文,且n 是已知的 ,例如 n = 15, p和q就是 3,5 或者 5,3,很简单就破解了,但是 n = 33609608874827 你来算算 p 和 q(答案是 24036583 × 1398269,摘自梅森素数)
n = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061 呢?(答案是 10169921435575123642561867469669552661717864247752251361375671837367086221354750692635829007786009042729357644276462913457660789233674358081650339142863821 x
10210039189276167395636779557271057346691950991057423589319031237857569595284598319093522326723650646963251941930167018746859556383067696079622198265424441)
\
ECC加密利用的是椭圆曲线函数,其中之一的函数实例为:y^2 = x^3 + bx^2 + c
\
假设A点为(-5,2),B点为(1,5),那么A + B = (5,8)。
\
无论是RSA还是ECC,都是一样的套路,从A可以推出B,但是从B推不出A。这样可以保证私钥的安全性。
\
下面以RSA为例,介绍非对称加密使用流程。
\
\
\
但是安全问题依然得不到保证,因为中间人攻击依然有效。
\
\
动态获取公钥是有问题的,黑客劫持公钥后,自己生成一对公钥私钥,把自己的公钥发送给客户端,客户端拿到黑客的公钥进行加密,黑客拿到密文就能用自己的私钥解密。
\
为了防止拦截,有的公司的做法都是把公钥提前写死在客户端,用的时候直接加密就好了,不需要去服务端获取公钥,而且还少了一次http请求,提高了一点性能。
不过问题又来了,首先可能人为泄密,其次维护实在不方便。
\
\
对称加密与非对称加密的优缺点:
非对称加密消耗性能,但是保密性高;
对称加密消耗性能低,但是保密性相比非对称加密来说低很多;
\
3. HTTPS
\
\
\
返回证书这一步最重要,他解决了两个问题:
\
- 保证了客户端拿到的一定是服务端的公钥,而不是中间人的公钥。
中间人也有CA公钥,但是他解密、修改内容后,并不能加密成客户端能识别的秘文,因为中间人没有CA私钥。
- 防止中间人篡改数据
中间人虽不能将秘文的公钥替换成自己的公钥,但是他可以破坏数据,说白了就是“我拿不到,你也休想拿到”。
此时客户端可以通过 hash(服务器信息 + 服务器公钥)的值和证书解密的hash值进行对比,无论中间人修改了服务器信息 + 服务器公钥,还是修改了证书的hash值,或者两者都被修改了,客户端都能通过新的hash值进行对比,不相等就是篡改了。
有人问如果两者都被修改了,有没有可能新的hash值和证书里的hash值正巧相等呢?几乎不可能。
因为对于hash内容来说,只要修改一点,hash值就会面目全非,撞上这个大运基本不可能。
\
所以,证书验证既能验证数据来源,又能验证数据的完整性,保证了数据安全传递。