彻底搞懂Android安全架构:基础篇

安全要解决什么问题?

  • 保密(Security、Confidentiality):只想让部分有权限的人知晓,其他人是看不到的;
  • 鉴别、认证(Authentication):确保通信的对方就是自己信得过的人;
  • 完整性(Integrity):能够验证信息在传输过程中是否发生了篡改,或者数据丢失等现象
  • 不可否认性(Non-repudiation):谁发的信息,能够表明发送者等身份。

一些常用术语:

  • 密钥:分为加密密钥和解密密钥。
  • 明文:没有进行加密,能够直接代表原文含义的信息。
  • 密文:经过加密处理之后,隐藏原文含义的信息。
  • 加密:将原文转换成密文的实施过程。
  • 解密:将密文转换成明文的实施过程。

密码术

说到密码术似乎感觉很高大上,这不都是各种谍战片里面经常出现的吗?其实,在我们现实生活中,多多少少也会接触一些简单的密码术,例如:字母加密、藏头诗、倒写文等。我们可以采用任何规则来定义密码术,但是通常我们并不会自己去写新的密码术,为什么呢?

这主要是因为:

  1. 安全性:没有经过验证的密码术,确保不了该密码术一定安全。
  2. 密码术里面是否有后门,因为自己定义的密码术不公开,不知道里面是否包含一些其他后门的类似程序。

概括来讲,加密主要分为:置换加密转置加密乘积加密(多次置换加密和转置加密的混合使用)。

加密模型

加密模型

对称加密模型

  • DES

  • AES

  • 应用场景

  • 存在的问题:密钥如何交换?

非对称加密模型

下面首先通过一个例子来简单说明公钥私钥、数字签名、消息摘要是什么,然后再详细分析非对称加密模型里面的重要知识点:

产生公钥和私钥
鲍勃采用某种产生密钥的算法,生成两把密钥:一把是公钥,一把是私钥。

将公钥公开
鲍勃将自己的公钥发送给他的朋友--帕蒂、道格、苏珊--每人一把,以后谁想给鲍勃写私密邮件,则可以使用该公钥进行加密。

采用公钥加密
现在苏珊想给鲍勃写一封保密邮件,他写完之后用鲍勃的公钥加密,就可以达到保密的效果。

采用私钥解密
鲍勃收到信之后,用自己的私钥解密,看到了信件的内容。这里要强调的是,只要鲍勃的私钥不泄漏,这封信就是安全的,即使落在别人的手里,也无法解密。

使用数字签名,生成摘要
鲍勃给苏珊回信,决定采用“数字签名”。他写完之后先用Hash函数,生成信件的摘要(Digest)。

对摘要进行加密,生成数字签名
然后,鲍勃再使用私钥对这个摘要加密,生成“数字签名”。

将数字签名附在信件的下面
鲍勃将这个签名附在邮件下方,一起发给苏珊。

采用公钥解密
苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。

比对摘要是否相同
苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行比对。如果两者一致,就证明这封信未被修改过。

假的公钥
复杂的情况出现了,道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成”数字签名”,写信给苏珊,让苏珊用假的鲍勃公钥进行解密。

使用数字证书
后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找”证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成”数字证书”(Digital Certificate)。

签名的同时,再加上数字证书
鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。

用CA的公钥揭开数字证书将
苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明”数字签名”是否真的是鲍勃签的。

  • 公钥和私钥

通过上面的例子,我们可以很轻松的知道,公钥和私钥都是由鲍勃产生的,私钥由自己保管,公钥交可以交给任何人。

应用场景:

  • 公钥算法的理论基石
    数学是科学之基
    基础学科研究之物,虚虚实实,先虚后实
    公钥算法的最重要的两大数学基础
    建立在分解大数的困难度
    建立在以大素数为模来计算离散对数的困难度
  • RSA算法
    RSA的名字由来?就是三个科学家的名字首字母的组合
    建立在分解大数的困难度
    公钥私钥的长度至少1024bit

两大加密模型的优缺点:

优点:相对于非对称加密非常高效。
缺点:密钥交换问题
     不如RSA的加密安全程度高,但是当选择256bit的AES时,仍然能胜任绝大多数的安全领域

非对称加密的优缺点:

优点:安全性足够高
     没有密钥交换的问题
缺点:效率低,对于大数据加密很慢

密钥交换

实际的保密会话场景:

  • 基于高效的 对称加密 算法对会话进行加密
  • 会话密钥实时产生且周期性变化
  • 基于其他足够安全的方式进行会话密钥的传输和交换

实际的保密会话应用场景

利用公钥密钥来交换会话密钥

  • 实时随机的会话密钥产生
  • 使用对端的的公钥对产生的会话密钥加密并传递给对端
  • 对段使用私钥解密获取会话密钥
  • 双方开始基于共享的会话密钥进行对称加密的保密会话通信
    利用公钥密钥来交换会话密钥

其他的密钥交换方式

Diffie-Hellman密钥交换协议

  • 基于以大素数为模计算离散对数的困难度
  • 双方各自选定Key,然后以一定算法变换(使得Key不以明文传输)后传输给对方
  • 双方利用对方交换过来的数据和自己选定的key做变换,获得一个一致的结果,作为会话密钥
    其他的密钥交换方式

消息摘要

  • Hash与散列函数的定义与特点
    定义:变长的输入变成定长的输出。
    特点:

易变性:即便原始信息发生1bit的变化,Hash的输出将会有不可预知的巨大变化。
不可逆性:通过Hash的结果构造出满足的输入信息是不可能的,或者极其困难的。

常见的Hash算法:MD5(128位)、SHA1(160位)

  • 消息摘要和数字指纹

人的指纹的特点:
双胞胎的指纹不同
通过指纹猜不出它的主人
与Hash的对应关系:
易变性
不可逆
数字指纹由此而来,通过对消息采用某种Hash算法得到的输出就是消息摘要,也叫数字指纹。

  • Hash的应用场景
  1. 防篡改
    基于易变特性
    保证完整性
    示例:
    网络下载某个文件时,都会指定该文件的一个MD5值,确保文件没有被替换
    消息传送时尾部额外传MD
  2. 防损坏
    基于易变特性
    保证完整性
    示例:
    CRC校验的作用和不足
    MD校验消息恶劣环境传输的完整性和未受损坏
    应用程序中对于核心文件/数据库读写的鲁棒性保护,防止掉电和Crash

  3. 认证
    基于不可逆特性
    可认证对端
    示例:
    HTTP的Basic和Digest认证
    PPP的PAP和CHAP认证
    手机登陆密码和隐藏MMI的设计

  • HMAC
    我们遇到了什么问题?
    直接尾部附带消息摘要的问题(篡改内容的同时篡改摘要)
    直接对密码做Hash传输的认证的问题(重放攻击)

    HMAC怎么解决的?
    HMAC就是使用Key对原始信息变换后再进行Hash

电子签名

签名要解决什么问题?

  • 签什么?
    签的内容的完整性保护
  • 谁在签
    签名人的不可否认性

    公钥密码术的两面性

公钥密码术的两面性

通过上面的图例说明我们知道对于公钥密码术,我们不仅可以使用公钥加密,反过来也可以通过公钥来实现电子签名。

证书与PKI

  • 证书的作用
  1. 证书的存储和交换
    公钥作为一个字段存储于数字证书中
    证书的交换和传输即可传输/交换公钥

  2. 现代信任基石

证书只是存储和交换公钥的吗?那我不可以吧公钥直接作为一个文件来存储和交换吗?
另外,我不可以篡改证书吗?我作为第三者,篡改苏珊发给鲍勃的证书,把里面的公钥改成我自己的,由此来HACK别人发给鲍勃的信息。
利用签名来保护数字证书本身。

  • 证书链和PKI

根证书自签名,非根证书父签名
证书的限制:约束、拥堵、有效期

参考资料

http://www.youdzone.com/signature.html
http://www.jikexueyuan.com/course/32_7.html?ss=1
http://www.cnblogs.com/f1194361820/archive/2015/01/29/4260025.html