美文网首页
数字签名

数字签名

作者: whlpkk | 来源:发表于2021-12-10 18:12 被阅读0次

最近学习了一下iOS代码签名机制 ,这里做个笔记记录,整理思路,加深理解。

本文仅对签名本身进行讲解,iOS代码签名机制仅做总结:

iOS代码签名的生成方式及数据结构,在这个过程中,至少存在4次计算哈希的行为,并且是环环相扣的

  1. _CodeSignature/CodeResources中对每个资源文件计算哈希
  2. Code Directory 中对MachO文件本身的每个分页,以及Info.plist、CodeResources、Entitlements等文件计算哈希
  3. CMS Signature的signedAttrs中对Code Directory计算哈希
  4. 对signedAttrs计算哈希并使用开发者的私钥加密

只有最后一步的哈希值是被加密的, 前面几步的哈希值是否加密都不影响签名的效果,只要任意内容有变化,均会因某个环节的哈希不匹配而导致签名校验的失败。想了解更多iOS签名相关,强烈推荐去看看原文,写的太棒了。原文出处 深度长文:细说iOS代码签名

什么是数字签名

签名的本质是用于验证数据的合法性,确保被签名的数据来自特定的来源,并且未经篡改。它基于非对称加密,和哈希算法,研究签名之前需要对这两种算法有一定的了解。

非对称加密算法

它在加密和解密时使用的是不同的密钥,具有这样的特征:

  • 有一对密钥 ab ,满足 a ≠ b
  • 用密钥a加密的数据只能用b进行解密,a自身无法解密,反之亦然
  • 只知道其中一个密钥,无法推导出另一个
  • 把其中一个可以公开的叫做公钥,另一个不能公开的叫做私钥。
pubkey_crypto.png

哈希算法

也叫散列或者摘要算法,对一段任意长度的数据,通过一定的映射和计算,得到一个固定长度的值,这个值就被称为这段数据的哈希值(hash)。给定一个哈希算法,它一定具有以下特征:

  • 相同的数据计算出的哈希值绝对相同
  • 由于哈希值是固定长度, 也就意味着哈希值的数量是有限的。而任意数据都可以计算出一个哈希值,计算哈希的过程,相当于无限集到有限集的映射。因此哈希值相同,对应的原始数据不一定相同,如果不同,则称这两段数据存在哈希碰撞,实际应用中认为这是小概率事件(数学意义上的”不可能事件”),优秀的哈希算法都是碰撞率极低的。
  • 哈希算法是单向算法,无法通过哈希值,计算出原始数据,这一点非常重要!

常见的哈希算法有: md5, sha1, sha256等,其中sha1长度为160bits,而sha256长度为256bits,二者相比,sha256的取值范围更大,因此碰撞和破解的概率更低,也就相对更安全。

签名算法

有了上面这两种算法作为基础,就可以组建一个签名和验证签名的体系了,如下图所示:

sign_verify.png

假如A要给B发送一段数据d,先对其签名:

  • 计算d的哈希值h,并使用自己的私钥ah 进行加密,得到的密文c就是签名

得到签名后,将数据d和签名c通过某种方式发送给B,此时B收到了数据d'以及签名c',需要验证这段数据是否被篡改,以及是否是A发送的

  • 计算d'的哈希值h',使用A的公钥b将签名c'解密,得到h''。通过对比h'h''是否一致,就可以知道数据或签名是否被篡改。并且,如果哈希值是匹配的,能够说明这段数据一定是由A签名并发出的

常见的签名算法:

  • sha1WithRSAEncryption:先对数据计算sha1摘要,再对摘要进行RSA加密
  • sha256WithRSAEncryption:先对数据计算sha256摘要,再对摘要进行RSA加密
  • md5WithRSAEncryption:先对数据计算MD5摘要,再对摘要进行RSA加密

证书

上面这个例子中,任何需要接受A的消息的人都需要事先保存A的公钥。这样的方案存在一个很大的问题:如果B要接受来自很多不同来源的数据,不可能事先将所有来源的公钥都提前保存下来,并且这样无法适应来源变动(增加、删除、变更)等带来的变化。因此,一般会把公钥当做签名的一部分,随着数据一起分发,接收方不需要事先保存任何数据来源的公钥。

sign_verify1.png

但是这样会引入一个新的问题:如何知道数据中所携带的公钥就是否是发送者自己的公钥?想了解的同学还可以搜索中间人攻击。

为了解决这个问题,可以把公钥和所有者的信息保存在一个文件里,并让一个可信的第三者使用其私钥对这个文件进行签名,得到一个签了名的公钥文件,这个文件就叫做证书。证书会作为签名的一部分,随着数据一起分发。

cert_struct.png

数据签名中的证书本身也是一段数据(公钥+所有者信息)以及其签名组成的,但证书中的签名是简单签名,一般只有加密哈希值和签发者名称,不会再将签发者的证书包含在签名中,否则就陷入无限递归的死循环了。

此时我们还需要使用签发者的公钥验证这个证书的合法性。虽然需要多验证一步,但是这样一来,本地不再需要保存每个数据来源的公钥,只需要保存这个签发者的证书(公钥)即可,每个数据来源的证书都由这个可信的签发者进行签发,这个可信的签发者就被称为证书颁发机构(Certification Authority),简称 CA

向 CA 请求签发,获取证书流程如下图:

ca_request.png

接收者使用证书验证公钥流程如下图:

ca_verify.png

实际上,CA的证书可能也是由其他更高一级的CA进行签发的,这种情况会产生3级甚至3级以上的证书链,系统中只需要保存最高级CA的证书,中间CA的证书和信息提供者的证书依次进行递归校验即可。

总结

经过签名的数据,结构如下图:

data_all.png

相关文章

  • IOS 逆向开发(三)应用签名

    @[TOC](IOS 逆向开发(三)应用签名) 1. 数字签名 什么是数字签名? 数字签名(digitally s...

  • 008——逆向之APP重签名

    前言在先了解APP重签名之前我们先来了解一下数字签名 数字签名 数字签名过程中,就是利用了RSA加密来进行数字签名...

  • 数字签名和数字证书

    数字签名 数字签名是什么?--阮一峰数字签名--百度百科 数字签名的流程 用哈希函数先对报文生成摘要 用私钥对摘要...

  • 数字签名与数字证书

    一、数字签名 数字签名的主要技术是非对称密钥加密技术。数字签名并不能保证信息在传输过程中不被截获。 1.数字签名技...

  • 密码学相关概念总结

    数字签名 数字签名(又称公钥数字签名,英语:Digital Signature) 发送报文时,发送方用一个哈希函数...

  • iOS逆向-应用签名原理(Ⅲ)

    数字签名(digitally signed) 概念数字签名(又称公钥数字签名)是一种类似写在纸上的普通的物理签名/...

  • 数字签名

    数字签名的概念 1.所谓数字签名(Digital Signature)(又称公开秘钥数字签名、电子签名) 是一种类...

  • Https 编程

    目录 数字签名 数字证书 Https 编程 数字签名 数字签名是非对称加密与数字摘要的组合应用 应用场景 校验用户...

  • 区块链开发——数字签名扩展 #C02

    本篇为资料整理 数字签名算法 常见的数字签名算法主要有RSA、DSA、ECDSA三种。 RSA数字签名算法 RSA...

  • Python RSA数字签名实践

    之前讲到RSA可以用来加密和数字签名,这里是RSA用作数字签名。Python的pycrypto库实现的数字签名有一...

网友评论

      本文标题:数字签名

      本文链接:https://www.haomeiwen.com/subject/lzzcfrtx.html