# 加密

信息在网络中,如果不加密,都是以明文的方式传递,包括密码,这会让网络陷入混乱和不安全中,于是就有了对信息的加密解密,在这个过程中需要密钥和加密算法,将要传递的信息变成不可读的词句,而加密算法分为对称加密(symmetric cryptography)和非对称加密(asymmetric cryptography)两种。

# 加密算法

# 对称加密

对称加密算法的特点是加密使用的密钥和解密使用的密钥是相同的,用的同一个密钥,它的优点是简洁易记,速度快,效率高,缺点是有多个密钥时管理比较困难,而且两个用户之间沟通密钥内容,这中间容易泄露。

常见的对称加密算法有,DES,3DES,AES,TDEA,Blowfish,RC5,IDEA。

DES(Data Encryption Standard),数据加密标准,速度快,适用于大量数据场合。3DES(Triple DES),基于DES,对一个数据块用三个不同的密钥进行三次加密。AES(Advanced Encryption Standard),高级加密标准,下一代的加密标准,速度快,安全级别高。

# 非对称加密

加密解密用的密钥是不相同的,在这种算法中,每个人有公钥和私钥,公钥是公开透明的,其他人都能获取到的,私钥是私有的,只能自己拥有,举个例子,A的公钥加密过的东西只能通过A的私钥解密,A的私钥加密过的东西只能通过A的公钥加密。

这种方法加密解密缺点是比对称加密耗时,优点是不同的两个用户不用再沟通密钥内容,比对称加密更安全。常见的非对称加密有RSA,DSA(数字签名),ECC(椭圆曲线)。RSA是目前最有影响力的公钥加密算法,被推荐为公钥数据加密标准,而ECC提供更高的安全级别,不过缺点是变慢。

# Hash算法

Hash算法也叫摘要算法,该种算法对一段信息产生摘要,通过比较摘要是否相等就可以判断每段信息是否相同。该算法单向不可还原,常用在密码存储,信息完整性校验,只要数据源不同,算法得到的摘要必定不同。

常见的摘要算法有MD5和SHA1,MD5用的哈希函数,产生128bit的串,而SHA1算法比MD5安全性更强,对于小于2^64^位的消息,SHA1会产生一个160位的串。

# 数字签名

# 应用场景

假设现在有A和B两个人,A想要给B发送一条信息,他不想让别人看到信息的内容,A使用B的公钥对信息加密,只有B的私钥能够解密,B的私钥唯一性保证信件不会泄露。

但是有一天黑客冒充A给B发送信息,他也能使用B的公钥加密,导致B以为是A给他发信息,如何避免出现这种情况呢?首先A发消息前用自己的私钥加密信件,然后再用B的公钥加密信件,这样除了B没有能看到信件里的内容,且B持有A的公钥,可以通过第二次解密信件来验证这封信是来自A。

注意上面我们提到非对称加密有个缺点,那就是耗时长,如果文件本身特别大时,用非对称方式加密方式对文件加密解密无疑是个巨大的开销,此时就是数字签名的应用的场景了。

# 数字签名过程

现在A要发送一段信息给B,那么它会经历如下流程:

digitSignatureFlow

  1. A对该信息进行Hash运算得到摘要
  2. A对该摘要用私钥加密,得到数字签名
  3. A将数字签名附在要发送的信息后面发送给B
  4. B得到信息后取出数字签名,用A的公钥解密得到摘要,如果成功解密,说明是A发的信息
  5. B对信息正文进行Hash运算得到摘要,并将该摘要同A的数字签名中解密得到的摘要对比,如果完全一致则说明信息没有被篡改。

# 数字签名的漏洞

在这个过程中如果要进行攻击的话有两个漏洞:

  1. 中间人C如果想同时篡改Email正文和数字签名,那他需要获取A的私钥。
  2. 中间人C截取信息和数字签名,篡改后用他自己的私钥进行数字签名,那么C需要替换B的电脑中A的公钥为自己的公钥,或者在B导入A公钥的同时冒名顶替A,让B以为自己的电脑中C的公钥为A的公钥或以为自己导入的公钥是A的公钥。

上面第一种方法一般认为比较困难,这是非对称加密认为比较安全的基石,也就是每个人私钥只有自己持有,当然不排除非正常手段获取别人的私钥,这个是拦不住的。第二种攻击方法被认为比较容易,因为公钥是公开并自行导入到电脑的,这个过程中比较容易冒名,那么如何避免这种情况呢,解决办法就是数字证书。

# 数字证书

数字证书是由证书签证机关(CA, Certificate Authority)签发的对用户公钥的认证,它就是个人或单位在Internet上的身份证,它包括证书所有者的信息,证书所有者的公钥和证书颁发机构的签名。

# 数字证书的构成

数字证书有几部分构成:

  • 证书的发布机构(Issuer,CA)
  • 证书有效期(Valid from,Valid to)
  • 证书所有者的公钥(Public Key)
  • 证书所有者(Subject)
  • 数字签名使用的算法(Signature algorithm)
  • 指纹与指纹算法(Thumbprint,Thumbprint algorithm)

指纹是证书的信息摘要,使用证书的人根据数字签名使用的算法来解开数字签名,得到里面的指纹(hash串),然后自己计算一个hash串,通过比对来验证这个证书是否是CA颁发的原证书,没有被第三方进行恶意修改。

# 数字证书的生成过程

digitSignatureGenerate

  1. 将申请数字证书的人的身份信息通过Hash生成信息摘要,再通过CA私钥加密生成数字签名,也就是指纹。
  2. 将证书申请者的身份信息和数字签名一起组成数字证书。

# 数字证书的使用

还以上面A给B发送信息为例:

digitSignatureCertificateFlow

注意A给B发消息不再是提前把自己的公钥发过去,而是把自己的数字证书附在要发送信息的后面,B拿到消息后,先根据A的数字证书中的颁发机构查找自己受信任证书列表,若找到说明该数字证书的颁发机构是受信任的,进一步验证该A的数字证书是否被篡改。下面是验证流程:

digitSignatureVerify

# CA的嵌套验证

注意证书被分为root Certificate和intermediate Certificate,相应的CA也分为root CA和intermediate CA。CA的组织结构是一个树结构,一个root CA下面有多个intermediate CAs,而每个intermediate CA又包含多个intermediate CAs。颁发给用户的证书可以是root Certificate也可以是intermediate Certificate,最终用来认证用户公钥的证书被称为end-user Certificate。

一般来说root CA不会直接颁布end-user Certificate,而是授权给多个二级CA。二级CA授权给多个三级CA,这些多级CA才会颁布end-user Certificate。而如何验证实体证书的CA是权威可信的CA呢?这时候就需要证书链,通过end-user Certificate证书得到它的证书颁发机构,如果该机构不是root CA,就一直递归找下去,直到拿到根证书,只要拿到了根证书就递归验证了多级CA的权威可信。

# 数字证书颁发机构

任何人都可以向这些多级CA申请数字证书,可以先使用数字证书管理工具(keytool,OpenSSL)构建CSR(Cerificate Signing Reques,数字证书签发申请),然后提交给这些CA进行签名最终形成数字证书。

注意,如果数字证书只是在公司内部使用,公司可以给自己建立一个CA,在公司所有机器上把这个CA都设置为操作系统信任的CA,这样以后公司发布的证书在公司内所有机器上就都通过验证了,但这仅限于内部使用。

# 查看数字证书

windows下可以 开始菜单->运行,输入certmgr.msc。

Mac OS下可以 keychain->证书。