以前端的角度来梳理一些常见的数据加密方式。

一、前端加密有意义吗

正反派都有。

1、无意义论

​ 说无意义的,无非是说,对于后端而言,前端无论是直接发送明文密码还是使用md5等加密的密文密码,从数据层面来讲,都是『明文』,只要被劫持,就算是密文,也并不需要去破解,直接伪造请求,照样发送就好了。

​ 再加上,因为前端代码是运行在用户本地,代码都能扒下来,什么加密算法都是用户可见的,混淆,散列,加密无非是增大这种可见的难度,并没有从根本上解决问题。

2、有意义论

​ 说有意义的呢,更多说的是保护用户隐私,不至于明文在网络上传输,不在后台日志明文记录,增加破解难度和复杂度,防君子不防小人等等,毕竟会破解的大牛还是少数,甚至大多数普通程序员对破解也只是略知一二。

​ 总的来说,它的主要意义是增加破解难度和门槛。

二、转码(Base64)

Base64就是一种用64个Ascii字符来表示任意二进制数据的方法。主要用于将不可打印的字符转换成可打印字符,或者简单的说将二进制数据编码成Ascii字符。Base64是网络上最常用的传输8bit字节数据的编码方式之一。

1、原理

​ 首先,需要准备一个包含64个字符的表格(如下表),0~63分别对应了唯一一个字符,比如18对应的是S。

base64编码有什么用?(base64介绍及应用)

​ 然后,对二进制数据进行处理,每3个字节一组,每个字节用二进制表示,一共 3 x 8 = 24bit,将这24bit划分为4组,每组正好6个bit,6bit的数据从二进制转为十进制(前面补两个0),这样4组就能得到4个数字,而这4个数字刚好可以就是0~63的范围,然后查表获得相应的4个字符,就得到了编码后的字符串。

下表将整个处理的过程描述的很清楚。

Man => TWFu // 原始数据Man => base64转码后为TWFu

base64编码有什么用?(base64介绍及应用)

​ 所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加为原来的4/3。如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?此时,需在原数据后面添加1个或2个零值字节,使其字节数是3的倍数。然后,在编码后的字符串后面添加1个或2个等号“=”,表示所添加的零值字节数。解码的时候,会自动去掉。

2、示例

hello  ==> aGVsbG8=
helloo ==> aGVsbG9v

3、应用

  • http环境下,将一些较长的标识信息或二进制数据转化为适合传输的字符串编码

  • 一些较小的图标图片使用base64格式,减少网络请求次数,降低服务器压力

二、散列(MD5)

一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。特点是加密后的结果长度一致且不可逆。

1、原理

漫画趣解MD5算法:https://blog.csdn.net/qq_27061049/article/details/115368792

2、示例

hello  ==> 5d41402abc4b2a76b9719d911017c592
helloo ==> b373870b9139bbade83396a49b1afc9a

3、应用

  • 密码存储,将用户明文密码用md5加密后再存储数据库中,防止泄露后被人用作密码撞库。
  • 签名校验,将数据经过本地md5加密生成签名,与服务器端md5加密后的签名进行比对,来判断数据是否合法安全

4、安全

由于同一字符串在md5加密后的结果是固定的,比如123456在md5加密后始终是e10adc3949ba59abbe56e057f20f883e,所以通过比对加密后的结果就能反向判断密码,理论上是可以通过遍历来暴力破解的。

在线解密网站:https://www.cmd5.com/

防范建议:

  • 密码要足够长足够复杂,例如最少8位,包含字母和数字
  • 使用md5多次加密
  • 加盐处理
  • 换用SHA-256

三、对称加密(AES)

密码学中的高级加密标准(AES),这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用,是目前最常用的对称加密算法。

对称加密:加密密钥和解密密钥相同。

非对称加密:加密密钥和解密密钥不相同。

前面介绍的base64和md5严格上来说不算是加密方式,aes和rsa才算是真正意义上的加密算法。

1、原理

漫画趣解AES算法:https://www.sohu.com/a/201169795_466846

2、示例

在线工具:https://the-x.cn/cryptography/Aes.aspx

明文:hello  
密钥:123456
加密结果:MA3sBXfpbtc8MoGlBavWdQ==
    
明文:helloo  
密钥:123456
加密结果:B89iPX6VHiP3zfLOaKB/8w==

3、应用

  • 任何需要加密的场景,例如wifi协议、https协议等

四、非对称加密(RSA)

RSA是最常用的非对称加密算法,使用不同的加密密钥与解密密钥。RSA是被研究得最广泛的公钥算法,经历了各种攻击的考验,普遍认为是目前最优秀的公钥方案之一。

AES的加解密使用同一密钥,一旦密钥被截获,密文将不再安全;而RSA使用公钥加密、私钥解密,即使知道公钥也无法解密,所以相对于AES来说,RSA方式安全性更高。

RSA的公钥和私钥也是由算法生成,一一对应的。

1、原理

运用了一些数学运算,欧拉函数、欧拉定理、模反元素、迪菲赫尔曼密钥交换等。

2、示例

在线工具:http://www.toolzl.com/tools/testrsa.html

// 公钥(1024bit)
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdIYAppMq+aNi8Fpcwit3Pdpit
Ml/QlZPG8L0485wkpDcL3+2Z1XOTAAGk61T+icZCJaGchc3Txy9NMAOR/8OJI/Xd
av5sJxS0Vt5Lsxhto52efvRbp6CnvFXkXN+veCilAkD8BVIO9RyyXOakex2xdg87
n8BlPPrvmQCsZdaEOwIDAQAB
-----END PUBLIC KEY-----
// 私钥(1024bit)
-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAN0hgCmkyr5o2LwW
lzCK3c92mK0yX9CVk8bwvTjznCSkNwvf7ZnVc5MAAaTrVP6JxkIloZyFzdPHL00w
A5H/w4kj9d1q/mwnFLRW3kuzGG2jnZ5+9FunoKe8VeRc3694KKUCQPwFUg71HLJc
5qR7HbF2DzufwGU8+u+ZAKxl1oQ7AgMBAAECgYEAyDN6WzmNLRKzlqZFP3eaFihj
VfsTcD7byfNO/W7g4POjuqaD8RClUGNjGbLOAp0t19lGFfW2QZRGKPXdZaNPnPyM
9+p5p1/hoBrTN0RlyTaqJZ9VaaCD0BRulK+egPQrtdrtwUqQ64rsgmpgrtz3uG7K
R2B3+G3wPiK+A0/34xECQQD6DCg4g2AXaPZXfh4pZbluRd5uzS1W1GDH11lcH/+Q
Rzg8rmN/r7Wzg9Py7vgnFcowY86X9KKvG9RWnP3szsf1AkEA4mUekdn8PMeSNiOV
dcKgV5pmelRx83Ekew3MetQRDt9n0xQyDvlqfUAAGSJAo2zDWwYMVFApSMINSw1o
StDtbwJATfOiSlPyjfnD6my/3GoBD/aqLGK8grg837AsBINZOdJqHsjC7hiKDcfI
OJD1PcIWQVWsH0U9vldvr/zLUJr6TQJBAMXXJhLBEssuf9gt2nORRDup4vnuB7J8
4iti0JlZ7xo3IuzzjhdF4MhZgHx2UVQ/PKyzqVyYvKsnYSSAL+6Ji6MCQQCMb+pY
wsSMfmDPmzusHmO8D4TzOCnXjY6B9NfDomv/CqQzAmaX7JDAbw/txBHBNpoOng9V
VH3/ysHjFGhpPWAk
-----END PRIVATE KEY-----
//字符串 hello 的加密结果
CbBo+GLaswTi//dQKRQFeBel2woLpuzXtZ5syKlnWzCEIpL0uIg15Hk/D3PbObvkkAdqjHEABOgD4y+HvmW/1ssSj/WFIZhB6J60sbUMd32jPIo3rSYLiP7JvcAjwGbTMHFWITpTiL80stuQ7GKljKbfBUaMF7TJ2ldsTChtOlI=

3、应用

  • 任何需要加密的场景,例如:git配置ssh、接口数据加密

4、接口数据加密

客户端存放公钥,服务端存放私钥,客户端请求数据用公钥加密,服务端接收后用私钥解密;

如果对接口返回的数据也需要加密,这时就需要服务端用私钥加密,客户端用公钥解密。

5、长内容加解密

rsa加密有长度限制,具体取决于密钥长度。

maxLen = (keyLen >> 3) - 11

超出长度,分段加解密。

6、推荐文章

  • 前端接口RSA加密(h5+小程序,支持超长内容、中文字符):
    https://blog.csdn.net/u010059669/article/details/109067975

五、综合运用

  • 没有哪种加密方式是万能的,合理的运用这些技术才能更好地服务于生产和实践中。

  • 从前端的角度来说,更多的应用场景是对接口数据进行加密,接口数据加密的目的就是防止传输的数据被篡改。

  • 结合AES和RSA混合加密:

    相对于AES来说,RSA虽然安全性更高,但加解密速度较慢,不适合数据量大的场景,更好的方式是两者结合起来。

    一种结合的方式:数据加解密使用AES,而对AES的密钥进行RSA加密。

    img

    • 1、服务端生成一对RSA公钥和私钥,私钥保存在服务端,公钥给到客户端。
    • 2、客户端随机生成一个AES密钥,先对数据进行AES加密处理,然后对AES密钥用RSA公钥加密生成密钥密文,一起传给服务端。
    • 3、服务端对接收到的密钥密文用RSA私钥解密得到AES密钥,然后解密数据即可。

    这样整个接口数据传输的过程中都是加密数据,且AES秘钥是每次都随机生成的,即使被抓包或拦截也能保证数据的安全,不会被恶意篡改。

    另外,RSA和AES的加密过程都是在二进制数据格式下进行的,一般在加密完成后都会将其转为Base64格式,以字符串的形式展示和传输,所以其实这里也运用到了Base64技术。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐