这个图就很直观,很明了的表现出了对称加密。它有如下的特点:
-
发送发通过加密算法配合密钥对原数据加密得到密文,接收方通过加密算法和相同的密钥来解密得到明文。
-
加密算法和解密算法应该是互逆的
-
双发从一开始就持有了相同的密钥
这么说,从一开始,发送/接收双方就已经有同样的密钥了。
加密算法的原理:
发送方将明文(原始数据)和 加密密钥 一起经过特殊加密算法处理后,使其变成复杂无意义的 加密密文
发送出去。
收信方收到密文后,使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。
可以对二进制数据(比如图片、视频)
经典算法:
DES(密钥短被弃用了)
AES (密钥很长 很顶) 速度快,效率高
IDEA
3DES(三重DES,听起来就很慢和重 = =,但是应该更难破解了)
至于具体的算法处理网上有许多文章。
原理:A使用公钥 和 加密算法 对数据加密得到密文发送给B,B使用私钥 和 相同的加密算法 对数据加密得到明文。
那这里有一个问题了:这样看来 私钥 能解 公钥 加密的数据 ,那这样,非对称加密和对称加密不是没什么不同吗????
这个问题的答案就是 非对称加密和对称加密的本质的区分:
答案如下:
-
A 有自己的公钥和私钥,假设叫 A公钥 和 A私钥, 它们互逆,能相互解开 对方加密的数据。
-
B 也有自己的公钥和私钥,叫 B公钥 和 B私钥,同样也是互逆 , B公钥能解开B私钥加密后的数据,反过来也是
-
对称加密中 公钥和私钥虽然互逆,但是A B两端也只用 这一对 唯一的密钥。
-
非对称加密中,A B都有了属于自己的 一对公钥密钥
-
A使用了B(对方)的公钥对数据进行了加密, 这也是为什么 B能够使用自己的私钥对密文进行解密
这就是非对称加密的本质。
那么实际情况时,A是怎么知道B的公钥呢?
答案是:在双方沟通开始前,双方各自就给对方发公钥,然后就能得到对方的公钥了。
就是嗨客拿到了密文 还有 公钥,他也不能解出来,因为密文是要用私钥去解的。
所以公钥为什么叫公钥,就是人人都可以获取的。
公钥也可以解开由私钥加密的密文。但是他们不能对换的。
数字签名就是利用 公钥也能解私钥的特点 来做的
数字签名的原理是:
**拿自己的私钥去对原数据进行加密,别人如果能通过我的公钥对数据还原,这就说明这份数据的确是我自己造的。这就是签名。
别人因为没有自己的私钥,所以伪造不出同样的签名数据。**
有了数字签名与验证,那么在平时的加密过程中:A可以向B发送一个原数据+一个数字签名,B收到之后会看到了原数据。那么他会验证是不是A写的,如果他拿A的公钥去解开了数字签名,那么就说明的确是A这个端发的 原数据,而不是别人 伪造了一份原数据。
↑ 这个做法在后面的HTTPS的TLS机制中有用到,通过验证数字签名,来判断对方是不是 我想要去信任的一端。
当然了,上面的例子中也可以把原数据加密一下,那这样带的就是 密文+签名数据了。
前面说过,嗨客是可以在AB数据传输中的路上 获取密文的,如果他截取了密文,然后又拿到了B的公钥,那么,他可以伪造一份原数据:“你给我转100到xxx账户”,然后拿B的公钥去加密,给B,B收到后因为可以用自己的私钥给解开,所以他会觉得这份数据就是A发的,然后他就转钱了。
这绝对是很不安全的。
通过数字签名的学习我们可以做到下面几步来让数据传输更加安全:
-
A 使用B公钥对原数据加密得到密文, 用A私钥对自己信息加密得到签名。
-
A发送 密文+签名 给B。
-
B通过 B的私钥来解密文, 再用A的公钥来解签名
-
验证都Ok,好,保证这份数据是A传给B的。因为嗨客没有A的私钥,所以嗨客不能构造A的签名。
经典算法:
RSA:用来签名、原文加密 都行。
DSA:专门设计用来签名。(签名更加快)
原理:将二进制数据(非文本数据)转换成由64个字符组成的字符串的编码算法。
64个字符是0-9 a-z A-Z + / 有个专门的码表(映射表)
比如 M的ASCII是77,对应的二进制是 01001101。
然后自己规定,每6位截取一下,那么就能 切成 010011 + 01,其中 前半部分换成10进制是19,在码表中对应T,后半部分01换成十进制是1,在码表中对应B。
那么M被Base64转换之后就变成了 TB。
其中最多只能规定6位截取一下,因为码表只有64个字符,如果超出6位,那么多出来的码表就没有了。
当然了,还有Base58。
所以Base64的本质将二进制数据转换成字符串。(比如 图片、视频)
所以它的用途是:可以放在URL中传输、可以保存到文本文件、可以进行文本传输。
但是Base64用来加密,肯定是不安全的,Base64码表任何人都知道,直接转过来就行了。
而且Base64完全不高效,都把数据变得更长了。相反它很低效,能不用就不用。
URL可能识别不了中文,所以它会将中文转换成Base64,使用%来编码
压缩的概念是 将数据换一种方式来存储,以减小存储空间
解压缩则是 将压缩后的数据还原成 原来的数据
原则上压缩不算编码。
常见的压缩算法有:DEFLATE
(有没有像Android的INFLATE)、JPEG
、MP3
DEFLATE:zip的压缩归档使用的算法就是DEFLATE
JPEG是对JGP的图片进行压缩,MP3则是对音频进行一个压缩。
序列化的概念是:
把数据对象转换成字节序列的过程,主要用于存储和网络传输。
反序列化就是倒过来,成为内存中的对象。
序列化和反序列化并不算编码。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/952cb60ae723980f3b6f52a99129cbdc.jpeg)
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。
[外链图片转存中…(img-E94JXSA4-1712356956159)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!