iOS

非对称加密、https、 iOSAPP签名原理

非对称加密、https、 iOSAPP签名原理 资料整理

Posted by Dan on January 24, 2019

非对称加密、https、 iOS证书

之前也看了一些加密、证书、RSA、https的东西,但是一直没有贯通,理解的不是特别清楚,今天整理一下。

加密

现在的加密分为:对称加密算法(symmetric key algorithms)非对称加密算法(asymmetric key algorithms)

对称加密算法中,加密使用的密钥和解密使用的密钥是相同的。也就是说,加密和解密都是使用的同一个密钥。因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道,不能对外公开。

密钥,一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算法。

非对称加密算法中,加密使用的密钥和解密使用的密钥是不相同的。

那么对称加密算法非对称加密算法在使用的时候有什么不一样呢? 比如这个场景: 小明 和 小红 通讯信,但是信的内容不想让别人知道,小明可以使用对称加密算法非对称加密算法给内容加密。 如果使用对称加密算法,由于加密使用的密钥和解密使用的密钥是相同的,那么小明怎么把密钥告诉小红呢? 有人会说对密码再加密,那么还是要传输密码啊,所以总是存在在传输过程中泄漏密码的问题。

那么用非对称加密算法怎么做呢?

首先 小红 生成公钥和私钥,自己保留私钥,公钥发布出去,小明用公钥加密信的内容,然后把信传输给小红,由于只有小红有私钥,所以即使别人截取到信的内容,也不能破解。

因为私钥不需要传播,所以就不会因为传播而被别人截取。

` 非对称加密算法`中的公钥和私钥是成对出现的,公钥和私钥在本质上是对等的,就是说通过算法生成两个秘钥a和b,你把a公布出去a就是公钥,把b公布出去b就是公钥。公钥和私钥是相对的,两者本身并没有规定哪一个必须是公钥或私钥。

  • 公钥和私钥成对出现
  • 公开的密钥叫公钥,只有自己知道的叫私钥
  • 用公钥加密的数据只有对应的私钥可以解密
  • 用私钥加密的数据只有对应的公钥可以解密
  • 如果可以用公钥解密,则必然是对应的私钥加的密
  • 如果可以用私钥解密,则必然是对应的公钥加的密

非对称加密算法的两种用法

  1. 实现数据的安全传输 要实现数据的安全传输,当然就要对数据进行加密了。 如果使用对称加密算法,加解密使用同一个密钥,除了自己保存外,对方也要知道这个密钥,才能对数据进行解密。如果你把密钥也一起传过去,就存在密码泄漏的可能。 如果我们使用非对称算法,过程如下:
1. 首先 接收方 生成一对密钥,即私钥和公钥;
2. 然后,接收方 将公钥发送给 发送方;
3. 发送方用收到的公钥对数据加密,再发送给接收方;
4. 接收方收到数据后,使用自己的私钥解密。
由于在非对称算法中,公钥加密的数据必须用对应的私钥才能解密,而私钥又只有接收方自己知道,这样就保证了数据传输的安全性。
  1. 对信息进行数字签名 除了保证数据的安全传输之外,公钥体系的另一个用途就是对数据进行签名。通常“数字签名”是用来验证发送方的身份并帮助保护数据的完整性。

    例如:一个发送者 A 想要传些资料给大家,用自己的私钥对资料加密,即签名。这样一来,所有收到资料的人都可以用发送者的公钥进行验证,便可确认资料是由 A 发出来的了。(因为只有A使用私钥签名得到的信息,才能用这个公钥来解) 采用数字签名,可以确认两点:

    1. 保证信息是由签名者自己签名发送的,签名者不能否认或难以否认。
    2. 保证信息自签发后到收到为止未曾作过任何修改。 之所以可以确认这两点,是因为用公钥可以解密的必然是用对应的私钥加的密,而私钥只有签名者持有。

注意: 数字签名用的是私钥, 用私钥加密的信息叫数字签名,因为私钥只有自己持有,相当于公章。 数字签名用的私钥,就像发毕业证书上的钢印一样,只有盖了钢印的证书大家才认可是毕业证书是真的。

那么能不能用公钥进行数字签名呢?因为公钥是公开的,大家都能获得,所以用公钥进行数字签名是没有意义的。 反过来,能不能用私钥对数据加密,实现数据的安全传输呢?答案也是不行的,因为公钥是公开的,大家都能获得,私钥加密的信息大家都能解密。

再整理一下: 通过算法生成两个秘钥,一个公开出去,叫公钥;一个自己保留,叫私钥;自己把信息加密,发布出去叫数字签名,因为只有与私钥(相当于公章)对应的公钥才能解密,能解密的自然知道这个信息只有我能发,也就确保了信息的发布者。

别人用公钥对信息加密,只有我能解开,因为我有私钥,实现了数据的安全传输。

啰嗦了这么多,不知道你是否明白公钥和私钥的关系以及用处?

以下内容摘自别的文章,也可以帮助你理解:

如果只是单方面采用非对称性加密算法,其实有两种方式,用于不同用处:

第一种是签名,使用私钥加密,公钥解密。用于让所有公钥所有者验证私钥所有者的身份并且用来防止私钥所有者发布的内容被篡改。但是不用来保证内容不被他人获得。
只要有发送方公开密钥的人都可以验证签名的正确性。
第二种是加密,用公钥加密,私钥解密。用于向公钥所有者发布信息,这个信息可能被他人篡改,但是无法被他人获得。如果甲想给乙发一个安全的保密的数据,那么应该甲乙各自有一个私钥,甲先用乙的[公钥加密]这段数据,再用自己的私钥加密这段加密后的数据。最后再发给乙,这样确保了内容即不会被读取,也不会被篡改。
任何知道接收方公钥的人都可以向接收方发送消息。
总结:公钥通常用于加密消息、验证数字签名(即解密)。

1、数字签名
  数字签名技术就是对“非对称密钥加解密”和“数字摘要“两项技术的应用,它将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在 传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的【完整性】。
  数字签名的过程如下:明文 --> hash运算 --> 摘要 --> 私钥加密 --> 数字签名
  数字签名验证的过程如下:数字签名 --> 公钥解密 --> 摘要 --> hash原文 --> 对比摘要

数字签名有两种功效:

确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。(来源可靠)
确定消息完整未篡改(完整性)。
注意:数字签名只能验证数据的完整性,数据本身(即原文)是否加密不属于数字签名的控制范围


数字签名
现在知道了有非对称加密这东西,那数字签名是怎么回事呢?

数字签名的作用是我对某一份数据打个标记,表示我认可了这份数据(签了个名),然后我发送给其他人,其他人可以知道这份数据是经过我认证的,数据没有被篡改过。

这几篇文章也能帮你理解: 密码学笔记: http://www.ruanyifeng.com/blog/2006/12/notes_on_cryptography.html 数字签名是什么?: http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html RSA算法原理(一): http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 理解公钥与私钥: https://songlee24.github.io/2015/05/03/public-key-and-private-key/ 公钥,私钥和数字签名这样最好理解:https://blog.csdn.net/21aspnet/article/details/7249401

https 和中间人攻击

https协议就是http+ssl协议,如下图所示为其连接过程:

具体看看这篇文章: HTTPS连接过程以及中间人攻击劫持:http://netsecurity.51cto.com/art/201712/559836.htm 深入HTTPS系列二(加密&证书): https://www.jianshu.com/p/b4c775a26068 HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事: http://web.jobbole.com/87695/

iOS证书以及 App 签名的原理

理解了以上几点之后,再来理解 iOS证书以及 App 签名的原理就简单了。如果上面的没看明白,估计下面的也看的不太明白。

这两篇文章已经写的很清楚了: 如何理解 iOS 的签名证书机制: https://blog.gocy.tech/2017/04/24/iOS-Signing/ iOS App 签名的原理:http://wereadteam.github.io/2017/03/13/Signature/