赞
踩
javaScript 提供了一些内置方法来实现加密解密。
加密:
解密:
需要安装使用 js-base64 插件。
yarn add js-base64
// 或者
npm install js-base64 -S
var Base64 = require('js-base64').Base64;
Base64.encode('qwerr1123');
import { Base64 } from 'js-base64';
Base64.encode('qwerr1123');// 编码
Base64.decode(str);// 解码
更多使用案例,请看官网。
【拓展】
从 IE10+ 浏览器开始,所有浏览器就原生提供了 Base64 编码、解码方法,不仅可以用于浏览器环境,Service Worker环境也可以使用。
浏览器对原生提供的 Base64编码、解码方法:
使用 atob() 和 btoa() 方法加密解密:
window.btoa('qwerr1123') // 编码
window.atob(str) // 解码
MD5 加密理论上是不能破解的,因为 MD5 是一种散列函数,使用的是hash算法。
需要安装使用 blueimp-md5 插件。
yarn add blueimp-md5
// 或者
npm install blueimp-md5 -S
const md5 = require("blueimp-md5");
md5("qwerr1123");
import md5 from 'blueimp-md5';
md5("qwerr1123");
如果觉得加密程度不够的话,可以再次嵌套一个md5加密,例如:
md5(md5("qwerr1123"));
【拓展】
“可逆与不可逆”之数学类比:
可逆:
100 (/2) = 50
50 (*2) = 100
不可逆:
100 (%49) = 2
上面这个不可逆的案例之所以是不可逆的,是因为:51、100、149、198 对 49 取余都得 2。在操作过程中某些信息丢失了,因此没法逆向操作以还原。
SHA 系列加密,采用散列算法,并非加密算法,所以不可逆。
需要安装使用 js-sha1 插件。
yarn add js-sha1
// 或者
npm install js-sha1 -S
const sha1 = require('js-sha1');
sha1("qwerr1123");
import { sha1 } from 'js-sha1';
sha1("qwerr1123");
SHA 系列加密,采用散列算法,并非加密算法,所以不可逆。
sha256 加密包括:
使用 sha256 加密,需要安装使用 js-sha256 插件。
yarn add js-sha256
// 或者
npm install js-sha256 -S
var sha256 = require('js-sha256');
sha256('qwerr1123');
import { sha256, sha224 } from 'js-sha256';
sha256('qwerr1123');
需要安装使用 crypto-js 插件。
AES 的加密模式 5 种:
AES 的填充 6 种:
【拓展】关于AES 的加密模式和填充本文只做了解,若要深入学习 AES 的加密模式和填充,请戳这里。
yarn add crypto-js
// 或者
npm install crypto-js -S
var CryptoJS = require("crypto-js");
// Encrypt
var ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123').toString();
// Decrypt
var bytes = CryptoJS.AES.decrypt(ciphertext, 'secret key 123');
var originalText = bytes.toString(CryptoJS.enc.Utf8);
console.log(originalText); // 'my message'
import CryptoJS from "crypto-js"; // 若后端没有提供“秘钥”和“常量”,那就分别给定一个默认值。 var key = CryptoJS.enc.Latin1.parse("秘钥"); // 秘钥(后端提供) var iv = CryptoJS.enc.Latin1.parse("常量"); // 常量(后端提供) export default { //加密 encrypt(data) { var srcs = CryptoJS.enc.Utf8.parse(data); var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }); return encrypted.toString(); }, //解密 decrypt(encrypted) { var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }); return decrypted.toString(CryptoJS.enc.Utf8); } }
使用场景:前端是利用jsencrypt.js去加密,后端利用node-rsa去生成公私钥并解密。
若前端使用 RSA 加密,需要安装使用 jsencrypt 插件。
若后端使用 DSA 解密,需要安装使用 node-rsa 插件。
yarn add jsencrypt
// 或者
npm install jsencrypt -S
yarn add node-rsa
// 或者
npm install node-rsa -S
const NodeRSA = require('node-rsa'); // 生成及导入导出秘钥 var key = new NodeRSA({b: 512}); //生成512位秘钥 var pubkey = key.exportKey('pkcs8-public'); //导出公钥 var prikey = key.exportKey('pkcs8-private'); //导出私钥 var pubKey = new NodeRSA(pubKey, 'pkcs8-public'); //导入公钥 var priKey = new NodeRSA(priKey, 'pkcs8-private'); //导入私钥 // 公钥加密(返回密文) pubKey = new NodeRSA(publicKey, 'pkcs8-public'); var encrypted = pubKey.encrypt(buffer, 'base64'); // 私钥解密(返回明文) priKey = new NodeRSA(privateKey, 'pkcs8-private'); var decrypted = priKey.decrypt(buffer, 'utf8'); // 私钥签名(返回签名) priKey = new NodeRSA(privateKey, 'pkcs8-private'); var signature = priKey.sign(buffer); // 公钥验证(返回true或false) pubKey = new NodeRSA(publicKey, 'pkcs8-public'); var flag = pubKey.verify(buffer, signature);
import JSEncrypt from 'jsencrypt'; const jsencrypt = new JSEncrypt();// 创建 JSEncrypt 对象实例 // 加密 const publicKey = `-----BEGIN PUBLIC KEY-----... ...`;// 加密公钥 export function setEncrypt (msg) { jsencrypt.setPublicKey(publicKey);// 设置公钥 return jsencrypt.encrypt(msg);// 对内容进行加密 } // 解密 const privateKey = '-----BEGIN RSA PRIVATE KEY-----';// 解密私钥 export function decrypt (msg) { decrypt.setPrivateKey(privateKey);// //设置秘钥 return decrypt.decrypt(msg);// 解密之前拿公钥加密的内容 }
JWT 全称 JSON WEB TOKEN。
JWT 先 Base64 编码对其头部进行加密,然后采用 HS256 算法进行加密。
JWT的构成:
公共的声明 :
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密。
私有的声明 :
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
JWT的优点:
JWT的注意事项:
// 创建一个 token
export const createToken = (params) => {
// secret——加密密文,私钥;expires——到期时间(秒)
const { secret, expires } = tokenBaseInfo;
const token = JWT.sign({
// id: params.id ...
timestamp: (new Date()).getTime()
}, secret, {
expiresIn: expires
});
return token;
}
// 解析 token
export const resolveToken = (token) => {
// secret——加密密文,私钥
const { secret } = tokenBaseInfo;
return new Promise((resolve, reject) => {
JWT.verify(token, secret, (error, data) => {
error ? reject(error) : resolve(data);
});
})
}
参考文档:
前端js几种加密/解密方法:https://www.jianshu.com/p/4c236d83ea04
AES加密解密前端使用方法:https://blog.csdn.net/qq_37135762/article/details/111321321
AES加密(3):AES加密模式与填充:https://zhuanlan.zhihu.com/p/131324301
使用JSEncrypt加密解密:https://www.cnblogs.com/hlweng-0207/p/12971180.html
前端利用jsencrypt.js进行RSA加密:https://www.jianshu.com/p/5008a407b558
基于node简单实现RSA加解密的方法步骤:https://www.jb51.net/article/158197.htm
node-rsa使用:https://www.appblog.cn/2017/10/23/node-rsa%E4%BD%BF%E7%94%A8/
什么是 JWT – JSON WEB TOKEN:https://www.jianshu.com/p/576dbf44b2ae
JSON Web Token - 在Web应用间安全地传递信息:http://blog.leapoahead.com/2015/09/06/understanding-jwt/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。