网站后台如何修改文字,罗湖网站制作多少钱,重庆自有网站推广,品牌营销全案策划一、前言
在信息安全越来越受重视的今天#xff0c;前端的各种加密也变得更加重要。通常跟服务器的交互中#xff0c;为保障数据传输的安全性#xff0c;避免被人抓包篡改数据#xff0c;除了 https 的应用#xff0c;还需要对传输数据进行加解密。
目前常见的加密算法可…一、前言
在信息安全越来越受重视的今天前端的各种加密也变得更加重要。通常跟服务器的交互中为保障数据传输的安全性避免被人抓包篡改数据除了 https 的应用还需要对传输数据进行加解密。
目前常见的加密算法可以分成三类
对称加密算法AES、...非对称加密算法RSA、...Hash 算法MD5、...
二、对称加密算法
对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。它要求发送方和接收方在安全通信之前商定一个密钥。对称算法的安全性依赖于密钥泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密所以密钥的保密性对通信的安全性至关重要。
特点
优点算法公开、计算量小、加密速度快、加密效率高。缺点在数据传送前发送方和接收方必须商定好密钥然后双方保存好密钥。如果一方的密钥被泄露那么加密信息也就不安全了使用场景本地数据加密、https 通信、网络传输等
AES
AES高级加密标准(Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。 密钥用来加密明文的密码。密钥为接收方与发送方协商产生但不可以直接在网络上传输否则会导致密钥泄漏通常是通过非对称加密算法加密密钥然后再通过网络传输给对方或者直接面对面商量密钥。密钥是绝对不可以泄漏的否则会被攻击者还原密文窃取数据。
在项目中需要用到 AES 加密时可以使用开源的 js 库crypto-js
var CryptoJS require(crypto-js);var data { id: 1, text: Hello World };// 加密生成密文
var ciphertext CryptoJS.AES.encrypt(JSON.stringify(data), secret_key_123).toString();// 解密得到明文
var bytes CryptoJS.AES.decrypt(ciphertext, secret_key_123);
var decryptedData JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
三、非对称加密算法
非对称加密算法需要两个密钥公开密钥publickey:简称公钥和私有密钥privatekey:简称私钥。公钥与私钥是一对如果用公钥对数据进行加密只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥所以这种算法叫作非对称加密算法。
特点
优点非对称加密与对称加密相比其安全性更好缺点加密和解密花费时间长、速度慢只适合对少量数据进行加密。使用场景https 会话前期、CA 数字证书、信息加密、登录认证等
RSA
RSA 加密算法是非对称加密算法最常见的一种。RSA 是 1977 年由 Ron Rivest、Adi Shamir 和 Leonard Adleman 一起提出的。RSA 就是他们三人姓氏开头字母拼在一起组成的。 在项目中需要用到 RSA 加密时可以使用开源的 js 库jsencrypt
// 使用公钥加密
var publicKey public_key_123;
var encrypt new JSEncrypt();
encrypt.setPublicKey(publicKey);
var encrypted encrypt.encrypt(Hello World);// 使用私钥解密
var privateKey private_key_123;
var decrypt new JSEncrypt();
decrypt.setPrivateKey(privateKey);
var uncrypted decrypt.decrypt(encrypted);
四、Hash 算法
Hash一般翻译做“散列”也有直接音译为“哈希”的就是把任意长度的输入又叫做预映射 pre-image通过散列算法变换成固定长度的输出该输出就是散列值。这种转换是一种压缩映射也就是散列值的空间通常远小于输入的空间不同的输入可能会散列成相同的输出而不可能从散列值来唯一的确定输入值。
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
特点
优点不可逆、易计算、特征化缺点可能存在散列冲突使用场景文件或字符串一致性校验、数字签名、鉴权协议
MD5
MD5 是比较常见的 Hash 算法对于 MD5 而言有两个特性是很重要的第一明文数据经过散列以后的值是定长的第二是任意一段明文数据经过散列以后其结果必须永远是不变的。前者的意思是可能存在有两段明文散列以后得到相同的结果后者的意思是如果我们散列特定的数据得到的结果一定是相同的。
比如在登录时将密码进行 md5 加密再传输给服务器服务器中的密码也是用 md5 加密后存储的那么只要验证加密后的密文是否一致则可。
在项目中需要用到 MD5 加密时可以使用开源的 js 库JavaScript-MD5
var hash md5(Hello World);
// b10a8db164e0754105b7a99be72e3fe5
五、Base64 编码
Base64 编码只是一种编码格式并不是加密算法它可用于在 HTTP 环境下传递较长的标识信息。
特点
可以将任意的二进制数据进行 Base64 编码数据加密之后数据量会变大变大 1/3 左右编码后有个非常显著的特点末尾有个号可进行反向解码Base64 编码具有不可读性
现代浏览器都提供了 Base64 编码、解码方法btoa() 和 atob()
var enc window.btoa(Hello World);
// SGVsbG8gV29ybGQvar str window.atob(enc);
// Hello World
六、总结
在业务 http 请求中AES 的密钥在前端随机生成从服务器获取 RSA 的公钥对 AES 的密钥进行非对称加密把加密后的密钥在请求头中传给服务器用 AES 对 body 进行加密。服务器收到请求头中的加密后的密钥用 RSA 的密钥进行解密得到明文的 AES 密钥即可对 body 进行解密。md5 有校验字符串一致性的特性为避免请求被拦截后篡改 body可在发请求时将 body 字符串进行一个 md5 加密后在请求头传输服务器收到请求后解密 body 后再 md5 与请求头的进行校验可验证是否请求被篡改。
https://segmentfault.com/a/1190000022000598