随着安全问题越来越被重视,公司也全面替换了HTTP
为HTTPS
。2015
年iOS9
的ATS
到今年苹果更是放出话来,2017
年全面支持HTTPS
,不支持的App
,在审核的时候可能会遇到麻烦。鉴于此,我有了写这一系列文章的冲动,文章从最基本的知识点着手,一点点剖析,尽量把HTTPS
这个东西说明白。此系列共四篇文章(有可能会出一篇进阶篇讲述攻防相关知识),本人从事iOS
开发,其他端的实际运用不做叙述,但是前三篇的原理部分是通用的都可以看。四篇文章分别为:
- 第一篇:加密和哈希
- 第二篇:数字签名和数字证书
- 第三篇:HTTPS的核心SSL/TSL协议
- 第四篇:iOS中的实际运用
此篇文章的逻辑图
加密(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
就是解密秘钥
。它的解密算法的秘钥与加密算法的秘钥相同。
私钥密码
由以上例子可以看出。私钥加密的秘钥是对称的,只要知道加密秘钥就能推出解密秘钥(所以称为对称加密)。通信双方分别持有加密密钥和解密密钥,密钥对外是绝对保密的,必须通过秘密渠道传送 。常见的对称加密算法有:DES
、3DES
、TDEA
、Blowfish
、RC2
、RC4
、RC5
、IDEA
、SKIPJACK
、AES
。
公钥加密(非对称加密)
公钥加密概念
迪菲(W.Diffie)
和赫尔曼(M.Hellman)
于1976
年提出公钥密码的思想,这种密码是非对称的,也就是说,不能从加密密钥推算出解密密钥,所以又称之为非对称加密。加密密钥不需要保密,可以公开,称之为公钥,只需要保守解密秘钥称之为私钥。公钥和私钥是成对的。常见的非对称加密算法有:RSA
、Elgamal
、背包算法
、Rabin
、D-H
、ECC
。
公钥加密简单举例:甲乙两人通信,甲将他的加密密钥(公钥)公布,任何想与甲通信的人都可以使用这个加密密钥将要传送的信息(明文)加密成密文发送给甲,只有甲自己知道解密密钥(私钥),能够把密文还原为明文。任何第三方即使截获到密文也不可能知道密文所传递的信息。
- 两种加密方式对比如下图(图1-0)所示:
基于公钥密码的加密和认证
加密和认证是两个不同的概念,其中加密是保证数据的安全性,认证是确保用户的真实性。只有通信双方确定是真正要通信的双方,通信才有进行下去的必要。这也就是认证的主要目的。
基于公钥密码的加密过程
比如有两个用户Alice
和Bob
,Alice
想把一段明文通过公钥密码的技术发送给Bob
,Bob
有一对公钥和私钥,那么加密解密的过程如下:
1、Bob
将他的公钥传送给Alice
。
2、Alice
用Bob
的公钥加密她的消息,然后传送给Bob
。
3、Bob
用他的私钥解密Alice
的消息。
Alice
使用Bob
的公钥进行加密,Bob
用自己的私钥进行解密。
基于公钥密码的认证过程
认证和加密就不同了,主要是鉴别用户的真伪。还是Alice
和Bob
这两个用户,Alice
有一对公私钥,Alice
想让Bob
知道自己是真实的Alice
,而不是假冒的,因此Alice
只要使用私钥对文件加密发送给Bob
,Bob
使用Alice
的公钥对文件进行解密,如果可以解密成功,则证明Alice
的私钥是正确的,因而就完成了对Alice
的身份鉴别。
整个身份认证的过程如下:
1、Alice
用她的私钥对文件加密,从而对文件签名。
2、Alice
将签名的文件传送给Bob
。
3、Bob
用Alice
的公钥解密文件,从而验证签名。
Alice
使用自己的私钥加密,Bob
用Alice
的公钥进行解密。
基于公钥密码的加密和认证的思考
在加密过程中,思考如何保证Alice
拿到公钥后就能确定是Bob
的公钥,若是篡改的公钥,通信进行下去已经无意义。接下来的第二篇文章数字签名和数字证书来解答这个问题。
哈希(Hash)
哈希与加密是不同的,概括来说,哈希
(Hash)
是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)
是将目标文本转换成具有不同长度的、可逆的密文。
两者有如下重要区别:
1、哈希算法往往被设计成生成具有相同长度的文本,而加密算法生成的文本长度与明文本身的长度有关。
2、哈希算法是不可逆的,而加密算法是可逆的。
这里重点强调一下Hash
和Encrypt
的主要区别,因为接下来的文章要用到这两个概念,这里对此不做深究。详细介绍可看我下面参考的一篇文章哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用。
总结
第一篇讲解的都是一些常用的基本概念,做安全肯定是会经常遇见,后续的几篇文章也依赖于对这些概念的理解,所以这里先提一下。关于Hash
也只强调了一下和加密的区别。
参考
- 屈婉玲,耿素云,张立昂. 离散数学:高等教育出版社
- 详解公钥、私钥、数字证书的概念
- 哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用