【九】加密

前言

本篇章主要介绍了前端加密的主要场景以及方式。

面试回答

1.加密:常见的有四种加密方式。Hash加密、base64加密、AES加密、RSA加密。不论是哪种加密方式,在前端的使用场景一般有两种情景,一种是纯前端加密,加密后与后端的交互直接使用密文,后端数据库保存的也是密文,返回给前端的也是密文。另一种是前后端共同加密,会使用到公钥或者协商后的解密方式,一般出现在后端也需要解密数据的场景。对称加密可以用AES,通过CryptoJS.AES.encrypt,传入value和key进行加密,解密的话则用CryptoJS.AES.decrypt传入密文和key。非对称加密可以用RSA,通过JSEncrypt.setPublicKey,传入公钥来设置公钥,然后用JSEncrypt.encrypt对value进行加密,解密的话类似,只不过将公钥换成私钥。

知识点

1.Hash算法加密

Hash加密,就是把任意长度的输入,通过散列算法,变换成固定长度的输出。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

  • 优点:不可逆、易计算、特征化
  • 缺点:可能存在散列冲突
  • 使用场景:由于不可逆性,常用于密码存储、数字签名、电子邮件验证、验证下载、鉴权协议等方面,更多的是用在验证数据的完整性方面。

md5加密

MD5是比较常见的 Hash 算法,对于MD5而言,有两个特性是很重要的,第一:明文数据经过散列以后的值是定长的;第二:是任意一段明文数据,经过散列以后,其结果必须永远是不变的。前者的意思是可能存在有两段明文散列以后得到相同的结果,后者的意思是如果我们散列特定的数据,得到的结果一定是相同的。比如在登录时将密码进行md5加密再传输给服务器,服务器中的密码也是用md5加密后存储的,那么只要验证加密后的密文是否一致则可。

在项目中需要用到MD5加密时,可以使用开源的js库:js-md5,使用方式:

// 安装
npm install --save js-md5
//引入
import md5 from 'js-md5';   
//使用
md5('hello') // bcecb35d0a12baad472fbe0392bcc043

2.base64加密

Base64 编码只是一种编码格式并不是加密算法,它可用于在 HTTP 环境下传递较长的标识信息。

  • 可以将任意的二进制数据进行 Base64 编码
  • 数据加密之后,数据量会变大,变大 1/3 左右
  • 编码后有个非常显著的特点,末尾有个=号
  • 可进行反向解码
  • Base64 编码具有不可读性

目前浏览器都提供了 Base64 编码、解码方法,btoa() 和 atob(),使用方式:

// 安装
npm install --save js-base64
// 引入
let Base64 = require('js-base64').Base64
// 加密
Base64.encode('测试'); 
// 解密
Base64.decode('5bCP6aO85by+'); 

//或者
var enc = window.btoa('Hello World');  // SGVsbG8gV29ybGQ=
var str = window.atob(enc); // Hello World

3.对称加密(AES加密)

对称加密指的是加密和解密使用相同密钥的加密算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。

对称加密(AES):用的同一个密钥进行加解密的

  • 优点: 算法公开、计算量小、加密速度快、加密效率高。
  • 缺点: 在传输密钥过程中,这个密钥容易被拦截,导致密钥泄漏,安全性不高
  • 使用场景:本地数据加密、https 通信、网络传输等

在项目中需要用到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').toString();
// 解密得到明文
var bytes = CryptoJS.AES.decrypt(ciphertext, 'secret_key');
var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));

4.非对称加密

非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

非对称加密(RSA): 生成密钥,分别为公钥和秘钥,公钥对数据进行加密,私钥对数据进行解密

  • 优点: 只需要服务端把公钥,传递给前端,前端通过公钥进行加密,服务端通过私钥解密,安全性很高
  • 缺点: 加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
  • 使用场景:https 会话前期、CA 数字证书、信息加密、登录认证等

    使用方式:

// 使用公钥加密
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);

常见的前端加密方式及场景

在业务http请求中,AES的密钥在前端随机生成,从服务器获取RSA的公钥,对AES的密钥进行非对称加密,把加密后的密钥在请求头中传给服务器,用AES对body进行加密。服务器收到请求头中的加密后的密钥,用RSA的密钥进行解密,得到明文的AES密钥,即可对body进行解密。md5有校验字符串一致性的特性,为避免请求被拦截后篡改body,可在发请求时,将body字符串进行一个md5加密后在请求头传输,服务器收到请求后,解密body后再md5与请求头的进行校验,可验证是否请求被篡改。

最后

走过路过,不要错过,点赞、收藏、评论三连~

你可能感兴趣的:(前端javascript)