通信双方使用同一个密钥来加密,解密时使用加密过程的完全逆过程配合密钥来进行解密。
- 经典算法: DES(56位密钥,密钥太短而逐渐被弃用)、AES(128位、192位、256位密钥,现在最流行)
- 对称加密作用:加密通信,放在在不安全网络上被截获后,信息被人读取或篡改
- 对称加密的缺点:密钥泄露,不能在不安全网络上传输密钥,一旦密钥泄露则加密通信失败
使用公钥对数据进行加密得到密文;使用私钥对数据进行解密得到原数据。非对称加密使用的是复杂的数学技巧。
使用非对称加密通信,可以在不可信网络上将双方的公钥传给对方,然后在发消息前分别对消息使用对方的公钥来加密和使用自己的私钥来签名,做到不可信网络上的可靠密钥传播及加密通信。
由于私钥和公钥互相可解,因此非对称加密还可以用于数字签名技术。
通常会对原数据hash以后对hash签名,然后附加在原数据的后面作为签名。这是为了让数据更小。
经典算法:RSA(可用于加密和签名),DSA(仅用于签名,但速度更快)
非对称加密的优缺点:
- 优点:可以在不安全网络上传输密钥
- 缺点:计算复杂,因此性能相比对称加密差很多
数字签名:将原数据先用Hash函数,生成摘要,然后使用私钥,对这个摘要加密,生成数字签名(signature)。
假设发送方是张三,接收方是李四
数字签名跟随数据一起发送给李四,李四收到后,取下数字签名,用张三的公钥解密,得到信件的摘要,由此证明,这数据是从张三那里发出的。此时再对数据使用Hash函数,将得到的结果,与上一步得到的摘要进行对比,如果两者一致,就证明这数据未被修改过。
但是上面这种情况,有个问题,李四无法确定公钥真的属于张三。这个时候张三可以去找证书中心(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对张三的公钥和一些相关信息一起加密,生成数字证书(Digital Certificate)。张三拿到数字证书后,就可以放心了,以后给李四发数据,只要在签名的同时,再附上数字证书就行了。李四收到数据后,用CA的公钥解开数字证书,就可以拿到张三真实的公钥了,然后就能证明数字签名是否真的是张三签的。
证书的目的是确保公钥的合法性,它的本质就是为公钥加上数字签名(用CA的私钥来加密发送方的公钥,就成了数字签名),它的安全性由证书链顶端的根证书来保证。
将二进制数据转换成由64个字符组成的字符串的编码算法。它的算法原理是将原数据每6位对应成Base 64索引表中的一个字符编排成一个字符串(每个字符占8位)
- 将二进制数据扩充了储存和传输途径(例如可以把数据保存到文本文件、可以通过聊天对话框或短信形式发送二进制数据、可以在URL中加入简单的二进制数据)
- 普通的字符串在经过Base64编码后的结果会变得肉眼不可读,因此可以适用于一定条件下的防偷窥(较少用)。
因为自身的原理(将原数据的一个字符8位拆成6+2,这个6对应的是一个新的字符,占8位),因此每次Base64编码之后,数据会增大约1/3,所以会影响存储和传输性能。
在URL的字符串中,对一些不用于特殊用途的保留字符,使用百分号%为前缀进行单独编码,以避免出现解析错误。
- 压缩:将数据使用更具有存储优势的编码算法进行编码
- 解压缩:将压缩数据编码还原成原来的形式,以方便使用
目的是为了减小占用的存储空间。
压缩就是一种编码。所谓编码,即把数据从一种形式转换成另一种形式。压缩过程属于编码过程,解压缩过程属于解码过程。
常见压缩算法:DEFLATE、JPEG、MP3等。
将图像、音频、视频数据通过编码来转换成存档形式(编码),以及从存档形式转换回来(解码)。
目的是存储和压缩媒体数据(大多数媒体编码算法会压缩数据,但不是全部)。
把数据对象(一般是内存中的,例如JVM中的对象)转换成字节序列的过程。对象在程序内存里的存放形式是散乱的(存放在不同的内存区域、并且由引用进行连接),通过序列化可以把内存中的对象转换成一个字节序列,从而使用byte[]等形式进行本地存储或网络传输,在需要的时候重新组装(反序列化)来使用。
目的:让内存中的对象可以被储存和传输。
序列化并不是编码,编码是把数据由一种数据格式转换成另一种数据格式;而序列化是把数据由内存中的对象(而不是某种具体的格式)转换成字节序列。
定义:把任意数据转换成指定大小范围(通常很小,例如256字节以内)的数据。
作用:相当于从数据中提取出摘要信息,因此最主要用途是数字指纹。
实际用途:唯一性验证。例如Java中的hashCode()方法。
怎么重写hashCode方法:把equals()方法中的每个用于判断相等的变量都放进hashCode()中,一起生产一个尽量不会碰撞的整数即可。(一般equals和hashCode方法是成对出现的)
Hash的实际用途1:数据完整性验证。从网上下载文后,通过对比文件的Hash值(例如MD5、SHA1),可以确认下载的文件是否有损坏。如果下载的文件Hash值和文件提供方给出的Hash值一致,则证明下载的文件是完好无损的。
Hash的实际用途2:快速查找,比如HashMap
Hash的实际用途3:隐私保护。当重要数据必须要暴露的时候,有时可以选择暴露它的Hash值(例如MD5),以保障原数据的安全。例如网站登录时,可以只保存用户密码的Hash值,在每次登录验证时只需要输入密码的Hash值和数据库中保存的Hash值作比对就好,网站无需知道用户的密码。(这不属于加密)
MD5加盐:盐是一串随机数或者是固定的字符串。为什么要加盐:只要是明文相同,那么不加盐生成的MD5码就相同,于是攻击者就可以通过撞库的方式来破解出明文。加盐就是向明文中加入随机数,然后在生成MD5,这样一来即使明文相同,但由于盐不同,所以生成的MD5码也不同,如此一来就大大增加了暴力破解的难度,使其几乎不可能破解。
Hash不是编码,因为它是单向的过程,往往是不可逆的,无法进行逆向恢复操作。
Hash也不是加密,它是单向的过程,无法进行逆向恢复操作,因此Hash不属于加密。(MD5不是加密)
含义:一个由整数向现实世界中的文字符号的Map
分支:
-
ASCII:128个字符,1字节
-
ISO-8859-1:对ASCII进行扩充,1字节
-
Unicode:13万个字符,多字节
- UTF-8:Unicode的编码分支
- UTF-16:Unicode的编码分支
-
GBK/GB2312/GB18030:中国自研标准,多字节,字符集+编码
-
https://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html