HTTPS从原理到应用(一):加密(Encrypt)与哈希(Hash)

随着安全问题越来越被重视,公司也全面替换了HTTPHTTPS2015iOS9ATS到今年苹果更是放出话来,2017年全面支持HTTPS,不支持的App,在审核的时候可能会遇到麻烦。鉴于此,我有了写这一系列文章的冲动,文章从最基本的知识点着手,一点点剖析,尽量把HTTPS这个东西说明白。此系列共四篇文章(有可能会出一篇进阶篇讲述攻防相关知识),本人从事iOS开发,其他端的实际运用不做叙述,但是前三篇的原理部分是通用的都可以看。四篇文章分别为:

此篇文章的逻辑图

图0-0 此篇文章的逻辑图

加密(Encrypt)

  • 加密的概念:简单来说就是一组含有参数k变换E信息m通过变换E得到c = E(m)。原始信息m为明文,通过变换得到的信息c为密文。从明文得到密文的过程叫做加密变换E加密算法参数k称作秘钥。同一个加密算法,可以取不同的密钥,得出不同的加密结果。从密文c恢复明文m的过程称作解密解密算法D加密算法E的逆运算。解密算法也有参数,称作解密算法的秘钥。
  • 加密的方式:私钥密码(对称加密)公钥密码(非对称加密)

私钥密码(对称加密)

私钥密码实例-凯撒(J.Caesar)密码:

公元前罗马皇帝凯撒(J.Caesar)曾用密码传递作战命令。他的加密方法是把每个字母按字母表的顺序向后移动3位,最后3个字母依次变成前3个字母。例如,"take action at middle night",经过加密变成"wdnhdfwlrqdwplqqohqljkw"(忽略掉空格)。(这个加密算法应该都不陌生,数据结构双向循环链表部分应该都实现过的)

凯撒密码的加密算法是把字母按字母表的顺序循环移动k位,取k=3就是凯撒所用的加密算法。如果用数字0 ~ 25分别表示26个字母,算法可表示成 E(i) = (i + k)mod26, i = 0, 1, ..., 25,其中k就是加密秘钥。凯撒密码的解密算法是D(i) = (i - k) mode 26, i = 0, 1, ..., 25。其中k就是解密秘钥。它的解密算法的秘钥与加密算法的秘钥相同。

私钥密码

由以上例子可以看出。私钥加密的秘钥是对称的,只要知道加密秘钥就能推出解密秘钥(所以称为对称加密)。通信双方分别持有加密密钥和解密密钥,密钥对外是绝对保密的,必须通过秘密渠道传送 。常见的对称加密算法有:DES3DESTDEABlowfishRC2RC4RC5IDEASKIPJACKAES

公钥加密(非对称加密)

公钥加密概念

迪菲(W.Diffie)和赫尔曼(M.Hellman)1976年提出公钥密码的思想,这种密码是非对称的,也就是说,不能从加密密钥推算出解密密钥,所以又称之为非对称加密。加密密钥不需要保密,可以公开,称之为公钥,只需要保守解密秘钥称之为私钥。公钥和私钥是成对的。常见的非对称加密算法有:RSAElgamal背包算法RabinD-HECC

公钥加密简单举例:甲乙两人通信,甲将他的加密密钥(公钥)公布,任何想与甲通信的人都可以使用这个加密密钥将要传送的信息(明文)加密成密文发送给甲,只有甲自己知道解密密钥(私钥),能够把密文还原为明文。任何第三方即使截获到密文也不可能知道密文所传递的信息。

  • 两种加密方式对比如下图(图1-0)所示:
图1-0 两种加密方式对比
基于公钥密码的加密和认证

加密和认证是两个不同的概念,其中加密是保证数据的安全性,认证是确保用户的真实性。只有通信双方确定是真正要通信的双方,通信才有进行下去的必要。这也就是认证的主要目的。

基于公钥密码的加密过程
比如有两个用户AliceBobAlice想把一段明文通过公钥密码的技术发送给BobBob有一对公钥和私钥,那么加密解密的过程如下:
1、Bob将他的公钥传送给Alice
2、AliceBob的公钥加密她的消息,然后传送给Bob
3、Bob用他的私钥解密Alice的消息。
Alice使用Bob的公钥进行加密,Bob用自己的私钥进行解密。

基于公钥密码的认证过程
认证和加密就不同了,主要是鉴别用户的真伪。还是AliceBob这两个用户,Alice有一对公私钥,Alice想让Bob知道自己是真实的Alice,而不是假冒的,因此Alice只要使用私钥对文件加密发送给BobBob使用Alice的公钥对文件进行解密,如果可以解密成功,则证明Alice的私钥是正确的,因而就完成了对Alice的身份鉴别。
整个身份认证的过程如下:
1、Alice用她的私钥对文件加密,从而对文件签名。
2、Alice将签名的文件传送给Bob
3、BobAlice的公钥解密文件,从而验证签名。
Alice使用自己的私钥加密,BobAlice的公钥进行解密。

基于公钥密码的加密和认证的思考
在加密过程中,思考如何保证Alice拿到公钥后就能确定是Bob的公钥,若是篡改的公钥,通信进行下去已经无意义。接下来的第二篇文章数字签名和数字证书来解答这个问题。

哈希(Hash)

哈希与加密是不同的,概括来说,哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。
两者有如下重要区别:
1、哈希算法往往被设计成生成具有相同长度的文本,而加密算法生成的文本长度与明文本身的长度有关。
2、哈希算法是不可逆的,而加密算法是可逆的。
这里重点强调一下HashEncrypt的主要区别,因为接下来的文章要用到这两个概念,这里对此不做深究。详细介绍可看我下面参考的一篇文章哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

总结

第一篇讲解的都是一些常用的基本概念,做安全肯定是会经常遇见,后续的几篇文章也依赖于对这些概念的理解,所以这里先提一下。关于Hash也只强调了一下和加密的区别。

参考

推荐阅读更多精彩内容