写于前
iOS中常在哪些场景应用到
- 支付密码、验证码相关的业务场景
- 之前个人维护的一个数字证书模块,与密码学相关知识也紧密相关,同时数字证书在我们的业务场景中,是作为指纹支付的基础
- iOS的签名机制。常常跟着网上的教程一顿操作,然而却不知道原理是什么。个人觉得,知道原理后续遇到问题也更能快速定位哪个环节的问题,也能学习优秀的技术方案是如何设计的
写一个系列
- 对称加密&非对称加密&混合加密
- 单向散列函数&数字签名&数字证书
- iOS签名机制
本文概要
- 白话厘清概念,分析优缺点(不累述算法实现)
- 看完,能对平常接触的md5,SHA,数字签名及其应用场景,证书等问题有个清晰的脉络
单项散列函数(One-way Hash Function
为什么存在?
- 解决发送的数据是否被篡改。无法解决伪装性!(是否是某人发的)
基本概念:
- 又称哈希函数/消息摘要函数/杂凑函数
- 输出的散列值又称消息摘要(Message Digest,MD)/指纹(Fingerprint)
- 输入的消息又称原像(pre-image)
特点:
- 计算速度快
- 任意消息长度,计算所得固定长度的散列值
- 消息不同,散列值也不同
- 具有单向性,无法通过散列值反推出消息的性质
常见的单项散列函数
补充一个概念
- 抗碰撞性:无法随机找到两条不同的消息,使得他们的散列值相同
- 弱抗碰撞性:给定某个散列值,找到具有相同散列值的另一条消息非常困难
- 强抗碰撞性:找到散列值相同的两条的不同消息非常困难
- 单项散列函数必须同时具备这两者特征
- 常用来表示这个单项散列函数目前是否安全
- 抗碰撞性:无法随机找到两条不同的消息,使得他们的散列值相同
MD4,MD5
- 产生128bit的散列值
- 目前强抗碰撞性已被攻破,不安全
SHA(Secure Hash Algorithm)-安全散列算法
SHA-1
- 产生160bit的散列值
- 目前强抗碰撞性已被攻破,不安全
SHA-2
- 存在6个版本,实际上是SHA-256和SHA-512的衍生,后面的数字即散列值长度
- 目前尚未被攻破
SHA-3
- 区别于SHA-1,SHA-2的全新标准
补充:
- SHA-1,SHA-2有不同,但还是共享相同的基本算法,SHA-2更安全主要通过增加散列长度实现
- 随着时间推移,旧版本算法被攻破只是时间问题
- SHA-2在2001年成为推荐标准,但软件/硬件设备供应商对SHA-1到SHA-2的迁移大部分工作在2016年和2017年后期才完成。最先吃螃蟹的人总要进行大量的工作,后来者则有更多的经验可借鉴。
- http://www.sohu.com/a/224156626_750628
RIPEMD-160
- RIPEMD-160是欧盟所设计的RIPEMD的修订版,散列值为160比特。
- RIPEMD已经被攻破,RIPEMD-160还未被攻破。
主要应用场景
- 检测软件/数据是否被篡改:软件发布可以将散列值发布到网站上,使用者可判断是否被篡改
- 口令加密:最简单的场景就是服务器存储口令的散列值(口令可以理解为日常用的密码),只有用户输入的时候是密文,后面全部以散列值处理存储
PBE(Password Based Encryption)将口令与salt(随机数)混合计算散列值,作为加密的密钥,来抵御针对口令的字典攻击。
- 伪随机数生成器:伪随机数需要具备”事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。
- 数字签名:下文会提到
数字签名
为什么存在?
- 单项散列函数解决发送的数据是否被篡改。
- 数字签名解决不可伪装性(签名不是别人写的),也不可抵赖(否认签名是自己的签名)。(白话:是你自己签名的,签的也是你自己签名)
How
- 用私钥来签名(私钥只有一个人有,确保这是我发的消息,只有我能发布这个签名),别人可以用公钥来验证(验签)。
- 还记得这篇文章里提到的到底公钥私钥哪个用来加密的讨论吗。这里给出解释了
优化
可优化点:直接对要发送的消息用私钥加密,如果文件较大,那么加密过程会很耗时,且(密文+消息)发送内容也较大
结合单项散列函数的特性,先获得要发送的消息的散列值,再进行加密
- 流程图如下:
数字签名存在的问题
在数字证书的流程中,有一个前提,发送者和接受者的私钥公钥必须是配对的。如果在公私钥共享过程中,遭受中间人攻击或公钥被替换等情况如下图
总结就是需要验证公钥的合法性
- 解决方案:数字证书
数字证书
- 数字证书保证公钥合法性
基本概念
- CA(Certificate Authority):证书的签发、认证、管理
- 又称公钥证书(Public-key Certificate,PKC)
简单流程
- 注册者A,生成密钥对,并将公钥以及个人信息发给CA
- CA生成CA的密钥对,公钥公开下载。CA公钥对A的公钥进行数字签名,并包含一系列信息,生成数字证书
- 为了保证数字证书不被篡改,CA对数字证书进行Hash计算生成Hash值(指纹),并利用CA私钥加密,并放入数字证书(这一点上面的流程图没有画出)
- 使用者B向CA申请,获得数字证书,下载CA公钥
- CA公钥解密证书中的指纹获得Hash值,与自己对数字证书进行Hash计算获得Hash值,两者比较,判断证书是否被篡改
- CA公钥验证数字签名,获得合法公钥
证书示例
总结
- 单项散列函数解决不被篡改
- 数字签名私钥签名,公钥验签。保证消息不可伪装,不可否认
- 数字证书保证公钥合法性,下发公钥时,通过CA对公钥进行签名生成数字证书,同时又对数字证书进行hash,同时CA私钥加密。
- (两层!防止公钥被篡改,防止数字证书本身被篡改,记住这句关键的话,就全部流程都出来了!!!)