最近有个加密的需求,想起以前做过的验签、加密等内容,就一起总结一下吧,具体的技术细节就不展开了,我们只讨论核心以及如何应用
Base64
一句话解释就是用来将二进制数据进行文本化显示的编码方式
想了解base64就一定要先了解什么是字符集
字符集是由a-z,A-Z,0-9以及+/一共64个常见字符组成的,2*6=64(其实还有一个=号用于位不足时补位用,所以base64常见都是以=结尾)
通常一个字符8bit,则3个字符需要24bit;base64则使用6bit表示一个字符,24bit表示4个字符。
那么一串二进制数据或从文本获取字节数据后,无论原始字符串是什么,都可以使用base64将二进制数据用常见的字符组成一段可显示的文本。但由于每个字符bit变少,所以编码后文本会变长,可能会需要更大的带宽。
网上都在说如图片、邮件都在使用base64传输,其实还有一个场景就是加密数据的传输
比如AES加密返回的是byte[],如果使用new String()转换成字符串的话,那么发送接收双方则需要商定好编码格式,否则接收方不知道是UTF-8还是GBK可能导致数据无法还原。同时由于bit位更多加密后原始字符串存在更多不常见字符对开发不够友好。但是使用base64则不存在指定编码格式以及不常见字符问题。但注意文本变长导致的增加带宽问题
由于base64只是编码格式无法保证信息安全,不能用于加密。同样的他性能也更好
AES
aes是一种常用的对称加密算法,专门用于数据安全。AES秘钥支持128、256位不同长度,秘钥越长安全性越高但加解密速度越低
既然有对称加密那么也就有不对称加密,相对来说对称加密通常加解密速度会更快一些。适用于双方可以安全的交换保存秘钥的场景;而非对称加密则更多应用于无法安全交换秘钥的场景,比如HTTPS获取证书
MD5
也叫摘要算法,通过hash算法计算出一个固定长度的hash值,且过程不可逆。也就是无法通过MD5还原数据。现在有些黑客或者网站会通过彩虹表的方式记录大量hash后的数据反向破解原始数据。同时由于使用hash算法,就存在不同原始值的hash值一样的hash冲突问题。所以也不能通过MD5判断数据是否相等
但由于MD5的定长,以及不可逆,我们一般用于像支付报文验签,防止请求遭遇中间人攻击篡改报文此类问题