编码
编码就是将字符用若干字节表示,使计算机能够识别。比如熟知的ASCII编码,字母A用十六进制0x41表示,但ASCII编码最多只能表示127个字符,所以为了拓展更多文字,使用Unicode编码和UTF-8编码
1.URL编码
URL编码是浏览器发送数据到服务器时使用的编码,因为兼容问题,服务器可能只识别ASCII字符,所以编码后会将ASCII字符不能表示的部分用UTF-8编码,并将编码后的每个字节使用%xx表示。Java提供了URLEncoder类来实现URL编码和解码
2.Base64编码
URL编码是对字符进行编码,表示成%xx的形式,而Base64编码是对二进制数据byte[]进行编码,表示成文本格式,即Base64编码可以将二进制数据byte[]变成纯文本格式。Java也提供Base64类来实现Base64编解码
Hash算法
哈希算法也叫摘要算法,就是对一组输入数据计算后,得到一个固定长度的输出。用途是可以用来验证数据是否改变。
最主要的特点是:1.相同的输入一定会得到相同的输出 2.不同的输入大概率得到不同的输出。
注意是大概率,即不同的输入是有可能得到相同输出的。因为输入是任意长度的,而输出是固定长度的,将无限的集合映射到有限的集合中,碰撞是不可避免的。所以常见的哈希算法有MD5输出长度16bytes、SHA-1输出长度20bytes、SHA-256输出长度32bytes、SHA-512输出长度64bytes,输出长度不断增加,碰撞概率也不断减小
对称加密算法
对称加密算法就是使用同一个密码对数据进行加解密。常见的有DES、AES。DES算法因为密钥过短,破解容易,现在已经基本不用了。Java也提供了相关类来实现此加密算法
非对称加密算法
非对称加密算法是由公钥和私钥组成密钥对进行加密的方式。用其中一个加密,使用另一个解密。公钥可以公开,私钥完全保密。最常见的用法是通过索取对方的公钥加密后,发送给对方,然后对方使用私钥解密。此加密方式的缺点是运算速度非常慢,但用法广泛,其中最典型的算法是RSA算法
1.签名算法
数字签名就是用发送方的私钥对原始数据进行签名,只有用发送方公钥才能通过签名验证。之前说过,非对称加密算法可以使用公钥加密,私钥解密。反之也是可以的,即私钥加密,公钥解密。这种用法的意义在于加密信息发送方过私钥加密后将信息发出,接收方通过公钥解密,如果能够解密,则能确认该加密信息确实由该发送方发送,即达到签名的目的
2.HTTPS协议加密
HTTPS协议加密实现也是通过非对称加密算法,不过并非完全由非对称加密实现。之前说过,非对称加密算法预算速度非常慢,所以HTTPS协议只是通过RSA算法加密AES算法使用的密钥,然后使用AES算法加密通信。即浏览器随机生成一个AES密钥,然后向服务器发送请求,获取服务器公钥,并使用该公钥加密生成的AES密钥,然后发送给服务器,服务器用自己的私钥解密后,就可以在后续通信中使用AES加密。
3.数字证书
上面说了HTTPS协议加密原理,数字证书就是该原理的具体实现。浏览器向服务器发送请求后,服务器返回的就是数字证书,浏览器通过操作系统内置的Root CA做本地验证,验证后通过数字证书内储存的服务器公钥加密本地生成的AES密钥后发送给服务器,服务器使用私钥解密后,即可在后续通信中使用对称加密
数字证书就是集合了多种加密算法,实现了数据加解密、身份验证、签名等功能的一种安全标准