赞
踩
以前端的角度来梳理一些常见的数据加密方式。
正反派都有。
说无意义的,无非是说,对于后端而言,前端无论是直接发送明文密码还是使用md5等加密的密文密码,从数据层面来讲,都是『明文』,只要被劫持,就算是密文,也并不需要去破解,直接伪造请求,照样发送就好了。
再加上,因为前端代码是运行在用户本地,代码都能扒下来,什么加密算法都是用户可见的,混淆,散列,加密无非是增大这种可见的难度,并没有从根本上解决问题。
说有意义的呢,更多说的是保护用户隐私,不至于明文在网络上传输,不在后台日志明文记录,增加破解难度和复杂度,防君子不防小人等等,毕竟会破解的大牛还是少数,甚至大多数普通程序员对破解也只是略知一二。
总的来说,它的主要意义是增加破解难度和门槛。
Base64就是一种用64个Ascii字符来表示任意二进制数据的方法。主要用于将不可打印的字符转换成可打印字符,或者简单的说将二进制数据编码成Ascii字符。Base64是网络上最常用的传输8bit字节数据的编码方式之一。
首先,需要准备一个包含64个字符的表格(如下表),0~63分别对应了唯一一个字符,比如18对应的是S。
然后,对二进制数据进行处理,每3个字节一组,每个字节用二进制表示,一共 3 x 8 = 24bit,将这24bit划分为4组,每组正好6个bit,6bit的数据从二进制转为十进制(前面补两个0),这样4组就能得到4个数字,而这4个数字刚好可以就是0~63的范围,然后查表获得相应的4个字符,就得到了编码后的字符串。
下表将整个处理的过程描述的很清楚。
Man => TWFu // 原始数据Man => base64转码后为TWFu
所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加为原来的4/3。如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?此时,需在原数据后面添加1个或2个零值字节,使其字节数是3的倍数。然后,在编码后的字符串后面添加1个或2个等号“=”,表示所添加的零值字节数。解码的时候,会自动去掉。
hello ==> aGVsbG8=
helloo ==> aGVsbG9v
http环境下,将一些较长的标识信息或二进制数据转化为适合传输的字符串编码
一些较小的图标图片使用base64格式,减少网络请求次数,降低服务器压力
一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。特点是加密后的结果长度一致且不可逆。
漫画趣解MD5算法:https://blog.csdn.net/qq_27061049/article/details/115368792
hello ==> 5d41402abc4b2a76b9719d911017c592
helloo ==> b373870b9139bbade83396a49b1afc9a
由于同一字符串在md5加密后的结果是固定的,比如123456在md5加密后始终是e10adc3949ba59abbe56e057f20f883e,所以通过比对加密后的结果就能反向判断密码,理论上是可以通过遍历来暴力破解的。
在线解密网站:https://www.cmd5.com/
防范建议:
密码学中的高级加密标准(AES),这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用,是目前最常用的对称加密算法。
对称加密:加密密钥和解密密钥相同。
非对称加密:加密密钥和解密密钥不相同。
前面介绍的base64和md5严格上来说不算是加密方式,aes和rsa才算是真正意义上的加密算法。
漫画趣解AES算法:https://www.sohu.com/a/201169795_466846
在线工具:https://the-x.cn/cryptography/Aes.aspx
明文:hello
密钥:123456
加密结果:MA3sBXfpbtc8MoGlBavWdQ==
明文:helloo
密钥:123456
加密结果:B89iPX6VHiP3zfLOaKB/8w==
RSA是最常用的非对称加密算法,使用不同的加密密钥与解密密钥。RSA是被研究得最广泛的公钥算法,经历了各种攻击的考验,普遍认为是目前最优秀的公钥方案之一。
AES的加解密使用同一密钥,一旦密钥被截获,密文将不再安全;而RSA使用公钥加密、私钥解密,即使知道公钥也无法解密,所以相对于AES来说,RSA方式安全性更高。
RSA的公钥和私钥也是由算法生成,一一对应的。
运用了一些数学运算,欧拉函数、欧拉定理、模反元素、迪菲赫尔曼密钥交换等。
在线工具: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=
客户端存放公钥,服务端存放私钥,客户端请求数据用公钥加密,服务端接收后用私钥解密;
如果对接口返回的数据也需要加密,这时就需要服务端用私钥加密,客户端用公钥解密。
rsa加密有长度限制,具体取决于密钥长度。
maxLen = (keyLen >> 3) - 11
超出长度,分段加解密。
没有哪种加密方式是万能的,合理的运用这些技术才能更好地服务于生产和实践中。
从前端的角度来说,更多的应用场景是对接口数据进行加密,接口数据加密的目的就是防止传输的数据被篡改。
结合AES和RSA混合加密:
相对于AES来说,RSA虽然安全性更高,但加解密速度较慢,不适合数据量大的场景,更好的方式是两者结合起来。
一种结合的方式:数据加解密使用AES,而对AES的密钥进行RSA加密。
这样整个接口数据传输的过程中都是加密数据,且AES秘钥是每次都随机生成的,即使被抓包或拦截也能保证数据的安全,不会被恶意篡改。
另外,RSA和AES的加密过程都是在二进制数据格式下进行的,一般在加密完成后都会将其转为Base64格式,以字符串的形式展示和传输,所以其实这里也运用到了Base64技术。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。