iOS安全之密码技术

作者 : 开心源码 本文共6041个字,预计阅读时间需要16分钟 发布时间: 2022-05-12 共138人阅读

图片来自网络

工作或者者面试过程中我们总会接触到密码相关的技术和问题,本篇文章是我对近期阅读《图解密码技术》的总结,这本书很值得推荐。那本篇文章能否适合你呢,假如下面的问题你都理解这篇文章暂时不适合你。

  • 工作中你使用到过哪些加密算法?
  • 分组密码的模式有哪些?(分组密码是如何迭代的?)
  • 对称加密(共享秘钥密码)和非对称加密(公钥密码)那个快?
  • 说说混合密码系统的具体实现?
  • SSL/TLS使用到哪些密码相关技术?
  • 区块链使用到了哪些密码相关技术?
  • 单项散列函数、消息认证码、数组签名、证书分别是为理解决哪些问题?
  • ……

本文章只对我认为重要的知识点做简单详情和梳理,想详细理解可以阅读原书籍。

开始之前我们先明确一个基本的概念。

加密,是以某种特殊的算法改变原有的信息数据,使得未受权的使用户即便取得了已加密的信息,但因不知解密的方法,依然无法理解信息的内容。所以Hash算法并不能称为加密算法,由于操作者本人都无法解密成原数据。

密码技术

根据秘钥的用方法可以将密码分为:对称密码和公钥密码两种。对称密码(共享秘钥密码)是指加密和解密时用同一秘钥的方式;非对称密码(公钥密码)是指加密和解密时用不同秘钥的方式。

对称密码

常使用的对称密码算法主要有DES、三重DES、AES、Rijndael、APPTagId

比特序列的异或者

密码技术中经常会使用到比特序列的异或者运算xor,使用符号表示⊕,a⊕b = (?a ∧ b) ∨ (a ∧?b),假如a、b两个值不相同,则异或者结果为1。假如a、b两个值相同,异或者结果为0。密码学中使用到异或者运算的一个特性是:假如有比特序列a、b、c ,假如a⊕b=c则 c⊕b=a。

0101(a)
0011(b)
结果0110(c)

逆运算:

0110(c)
0011(b)
结果0101 (a)

有没有发现什么我们把a当做源数据,b当做秘钥,c当做加密后的密文,a⊕b相当于加密。c和b异或者后又变成了a。这不就是一个很简单的对称加密嘛。

DES

DES现在已经不是一种安全的加密方法,已经能够被暴力破解。DES的基本机构是Feistel网络(Feistel结构、Feistel密码)。Feistel网络中加密的步骤称为轮,整个过程就是进行若干次的轮循环。DES是一种16轮循环的Feistel网络。下面看Feistel网络中的轮。

1001.png

我们先看其中一轮的步骤,上边是三轮的结构图。

  1. 将输入数据等分成左右两部分。
  2. 将输入的右侧直接发送给输出的右侧。
  3. 将输入的右侧发送给轮函数。
  4. 轮函数根据右侧数据和子秘钥,计算出一串随机序列。
  5. 将上一步得到的比特序列与左侧数据进行XOR(异或者)运算,并将结果作为加密后的左侧。

这样第一轮下来尽管右半部没有加密,但是第二轮就会变成左半部分参加加密。

DES的解密用相同结构的逆运算就行了。

三重DES

三重DES是为了增强DES的强度,将DES重复3次,得到的一种密码算法,也叫做TDES或者者3DES。

3DES并不是进行进行三次DES加密(加密-> 加密 ->加密),而是加密-> 解密->加密的过程。当然每一步秘钥不同。当一二步秘钥相同时,三重DES也可以当做DES用,由于前两部加密、解密又变成了原文,相当于只进行了一次DES。

AES

AES是为了取代DES而生的一种对称密码算法。他并没有用Feistel网络,而是采使用了Rijndael算法。Rijndael算法中一轮就经过了逐字节替换、平移行、混合列、与轮秘钥进行异或者。

1002.png

分组密码模式

我们知道DES和3DES一次只能加密64比特长度,AES一次可加密128或者者192、256比特。但是要加密的原文远不止这么短,那怎样加密的?这时候就要对分组密码进行迭代,而迭代的方法就叫做分组密码的模式。

分组密码的模式主要有以下五种:ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB(密文反馈模式)、OFB(输出反馈模式)、CTR(计算器模式)。

ECB

ECB模式全名是电子密码本模式,这种模式就是将分组分别加密而后拼接得到密文。由于存在弱点因而通常不被用。

CBC

Cipher Block Chaining mode, 密码分组链接模式。首先将明文分组与前一个密文分组进行 XOR 运算,而后再进行加密。【SSL/TLS 有使用到】

CFB

Cipher FeedBack mode, 密文反馈模式。前一个密文分组会被送到密码算法的输入端

OFB

Output FeedBack mode, 输出反馈模式。密码算法的输出会反馈到密码算法的输入端。

CTR

CounTeR mode, 计数器模式。通过将逐次累加的计数器进行加密来生成密钥流的密码。

现在推荐用CBC和CTR模式。

非对称加密

在对称密码中,加密和解密的秘钥相同,所以需要先向发送者配送秘钥。秘钥配送过程即可能受到攻击者窃取或者者篡改,为理解决秘钥配送问题,非对称密码应运而生。在公钥密码中,加密秘钥和解密秘钥是不同的,只需拥有了加密秘钥,任何人都可以加密,但只有解密秘钥才能解密。

RSA

RSA是一种公钥密码算法。

  • 加密

在RSA中明文、密文和秘钥都是数字。RSA的加密过程可以使用下列公式表示:

密文 = 明文 E mod N 

密文是代表明文的数字的E次方对N求余的结果。E和N的组合就是公钥。

  • 解密

解密公式如下:

明文 = 密文 D mod N

密文的D次方对N求余就是明文。D和N的组合是私钥。

当然这里的E、D、N需要满足肯定的规范的。具体计算秘钥对就不在此赘述,想理解的可以查看数据或者者上网理解。

RSA是利使用大整数的质因数分解的困难度来保证其健壮和攻击困难度的。

其余非对称加密

当然除了RSA外,非对称加密算法还有ELGamal、Rabin、椭圆曲线密码。

混合密码系统

混合密码系统章节的主题就表明了它的使用途:使用对称密码提高速度,使用公钥密码保护会话秘钥。这里的会话秘钥就是对称密码用的秘钥。

公钥密码当然也不是完美的,他有两个问题:

  1. 公钥密码的解决速度远远低于对称密码。
  2. 公钥密码难以抵御中间人攻击。

混合密码系统能处理上边第一个问题,要处理第二个问题,就需要我们下一篇文章详情的公钥认证技术。

混合密码系统就是将对称密码和公钥密码优势相结合的方法。混合密码系统加密过程如下图:

1003.png

  • 会话秘钥一般是通过伪随机数生成器产生,是为本次通信而生成的秘钥。
  • 会话秘钥是对称密码的秘钥,同时也是公钥密码的明文。

认证技术

单向散列函数

单向散列函数时为了检验消息的完整性而生的。它也叫做消息摘要函数、哈希函数或者者杂凑函数。

单向散列函数输出的散列值也叫做消息摘要或者者指纹。

单向性

单向散列函数必需具有单向性:无法通过散列值反算出消息的性质。

应使用
  • 检测软件能否被篡改
  • 基于口令的加密:将口令和盐混合后计算其散列值,而后将散列值作为加密的秘钥。
  • 消息认证码(下面详细详情)
  • 数字签名
  • 伪随机数生成器
  • 一次性口令
具体单向散列函数

在讲解具体散列函数之前,我们先明确两个概念:强抗碰撞性和弱抗碰撞性。

  • 强抗碰撞性:要找到散列值相同的两条不同的消息时非常困难的。
  • 弱抗碰撞性:要找到和已知消息具备相同散列值的另外一条消息是非常困难的。

单向散列函数的有MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512

MD4、MD5

MD4和MD5都是产生128比特的散列值。

MD4已经不安全被攻破,MD5也已失去强抗碰撞性,也就是说能产生具备相同散列值的两条不同消息。

SHA-1

SHA-1的强抗碰撞性2005年也已被攻破。

SHA-2

SHA-256、SHA-384、SHA-512统称为SHA-2,SHA-2目前是安全的。

所以少量重要的信息建议用SHA-2散列函数。

消息认证码

单向散列函数尽管能检测消息的完整性,但是确不能保证消息时有发送者发送的。

消息认证码就是为了保证消息的完整性和防伪造。它是一种确认完整性并进行认证的技术。消息认证码简称:MAC

消息认证码计算必需具备发送者和接受者共享秘钥,没有秘钥无法计算,消息认证码正是利使用这一特性来完成认证的。

消息认证码的用步骤如下:

1004.png

消息认证码同样具备秘钥配送问题,处理方法和对称密码一样可以采使用公钥密码、Diffie-Hellman秘钥交换、秘钥配送中心或者者其余安全方式发送秘钥。

应使用场景
  • SWIFT(环球银行金融电信协会)银行间交换信息使用到了消息认证码
  • IPsec,IP协议中对通信内容的认证和完整性教研采使用的消息认证码
  • SSL/TLS(下面章节会详细详情)
HMAC

HMAC是一种用单向散列函数来构造消息认证码的方法,HMAC中的H是Hash的意思。HMAC的步骤如下:

1005.png

数字签名

消息认证码是能处理完整性和防止伪造却无法防止发送者否认,这个时候需要数字签名登场了。数字签名相当于现实世界中的盖章,用它可以识别篡改和假装,还能防止否认。

消息认证码之所以不能防止否认是由于发送者和接受者用的是同一个秘钥,正由于是同一个秘钥,消息认证码双方都可以计算,对第三方来说无法确认消息是谁生成的。数字签名就不同了,它用的是不同的秘钥。

  • 生成消息签名:这一行为一般是消息发送方来完成的,也成为对消息签名。根据消息内容计算数字签名的值,也意味着“我认可该消息的内容”。
  • 验证数字签名:一般由消息接受者来完成,也可以由验证消息的第三方来完成。

数字签名对签名秘钥和验证秘钥进行了区分,用验证秘钥是无法进行签名的。因而签名秘钥只能由签名的人持有,而验证秘钥则是任何需要验证的人都可以持有。是不是觉得似曾相识,没错这就是我们上面详情的公钥密码。数字签名正是把公钥密码“反过来使用”实现的。看下面比照表:

私钥公钥
公钥密码接受者解密时用发送者加密时用
数字签名签名者生成签名时用验证着验证签名时用
谁持有秘钥个人持有只需需要,任何人都可以持有

数字签名中使用私钥加密相当于生成签名,使用公钥解密相当于验证签名。数字签名的方法有两种:

  • 直接对消息进行签名(耗时,由于公钥密码原本就非常慢)
  • 对消息的散列值签名(快)

数字签名无法处理的问题

使用数组签名就可以识别篡改和假装,还能防止否认。然而要正确用数字签名有一个大前提,那就是数字签名的公钥必需属于真正的发送者。现在我们仿佛陷入一个死循环-数字签名是使用来识别篡改、假装和防止否认的,但是为此我们又必需从没有被假装的发送者得到没有被篡改的公钥才行。为了确认我们的得到的公钥是合法的,我们需要用证书。

证书

公钥证书:里边记有个人信息以及此人的公钥,并有认证机构施加数字签名。公钥证书也简称证书。

认证机构:能够认定“公钥的确属于此人”并能够生成数字签名的个人或者者组织。也是对证书进行管理的人。

下面看一个简单的认证示例图:

1006.png

认证机构

为了协助认证机构工作,有时还包括注册机构和仓库。注册机构负责公钥注册和本人身份认证。仓库是保存证书的数据库。

认证机构的作使用:

  • 生成秘钥对
  • 注册证书
  • 作废证书与CRL

CRL是认证机构宣布作废证书的一览表。

证书的层级结构

既然使用户的公钥由认证机构增加数字签名进行认证,那认证机构又由谁来认证呢?对于认证机构可以由其余认证机构施加数字签名,进行验证,即生成一张认证机构的公钥证书。

一个认证机构来验证另外一个认证机构的公钥,这样的关系可以迭代好几层,也就形成了证书的层级机构。

你一定会有疑问最高级认证机构的公钥(根证书)由谁来认证呢?一般有两种方式

  1. 根认证机构对自己公钥进行数字签名也叫自签名
  2. 根认证机构的公钥由低级认证机构认证形成环形认证

PKI:公钥基础设备

应使用场景

下面详情密码技术在以下三种场景中的用,PGP密码软件、SSL/TLS、区块链技术。

PGP

PGP是由Philip Zimmermann个人编写的密码软件,PGP是Pretty Good Privary的缩写。

PGP的功能

  • 对称密码

    支持AES、IDES、CAST、三重DES、Blowfish、Twofish等,分组密码模式采使用CFB模式。

  • 公钥密码

    公钥密码支持RSA、ELGamal等,PGP不是对明文直接加密,而是用的混合密码系统来进行加密操作。

  • 数字签名

  • 单向散列函数

    支持MD5、SHA-1、RIPEMD-160等

  • 证书

  • 压缩

  • 文本数据

  • 大文件的拆分和拼合

  • 钥匙串管理

PGP混合密码系统加密基本步骤和我们前面讲的相同,只是多了消息的压缩以及二进制->文本转换这两个步骤,具体步骤如下图:

1007.png

SSL/TLS

我们都知道HTTP协议是不安全的,现在推荐用HTTPS协议通信,HTTPS相比HTTP多了一层SSL/TLS。SSL是TLS的前身,SSL协议因为存在安全漏洞,现在用的是TLS1.1、TLS1.2协议。

SSL/TLS提供了一种密码通信的框架,这意味着它用的对称密码、公钥密码、数字签名、单向散列函数等技术可以像零件一样进行替换。

协议内容

TLS协议是由TLS记录协议和TLS握手协议这两层协议叠加而成。底层TLS记录协议负责加密,上层的TLS握手协议负责加密以外的其余各种操作。

握手协议

上层握手协议又分成4个子协议:握手协议、密码规格变更协议、警告协议和应使用数据协议,如下图:

1008.png

  • 握手协议:负责在用户端和服务器之间协商决定密码算法和共享秘钥。
  • 密码规格变更协议:负责向通信对象传达变更密码方式的信号。
  • 警告协议:负责在发生错误时将错误传达给对方。
  • 应使用数据协议:将TLS上面承载的应使用数据传达给通信对象的协议。

TLS记录协议

TLS协议负责消息的压缩、加密以及数据的认证。

小结

具体用户端和服务器之间开始连接步骤因为篇幅起因就不在此详细详情,想理解的可以上网搜索或者者阅读原书籍。

我们来看看TLS使用到了哪些密码技术。

密码技术作使用
公钥密码加密预备主密码
单向散列函数构成伪随机数生成器
数字签名验证服务器和用户端的证书
伪随机数生成器生成预备主密码、根据主密码生成密码、生成初始化向量
对称密码(CBC模式)确保片段的机密性
消息认证码确保片段的完整性并进行认证

比特币

区块链就是保存比特币一律交易记录的公共账簿。

关于区块链相关的概念:比特币、比特币地址、钱包、区块、挖矿、矿工、工作量证实等,想详细理解推荐阅读阮一峰的http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html这篇文章。我们说说它使用到的密码技术。

  • 散列值

    工作量证实就是通过计算符合要求的散列值来实现的。每个区块中也包括当前区块的散列值和上一个区块的散列值。

  • 数字签名技术

    在创立交易时运使用了数字签名技术,比特币的数字签名算法是椭圆曲线DSA。

  • 公钥密码

    钱包地址用的就是公钥密码技术

总结

《图解密码技术》是一本浅显易懂的书籍,强烈推荐阅读。本人也是第一次写读书笔记,有不完善的地方欢迎留言指正。


更多iOS、逆向、ReactNative开发文章请专注微博或者者微信公众账号:乐Coding,微信扫描下方二维码也可关注。

lecoding

icon.jpg

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » iOS安全之密码技术

发表回复