加解密
1、 bcryptjs 解密 - 只可加密,比对密码,不可解密
- 下载
npm i bcryptjs
- 作用:字符串加密,已加密的字符串不可破解,只可比对。
- 优点:加密的字符不可解密
- 缺点:已加密的字符不可解密,盗不了密码
- 用作领域:敏感信息加密,例如登录密码
- npm地址:npm - https://www.npmjs.com/package/bcryptjs
src/utils/bcrypt.js
import bcryptjs from 'bcryptjs'//不可逆加密 bcryptjs /*** 不可逆加解密 ,一旦加密不可解密,只可比对* @param {String} txt 加、解密的文本* @param {String} hash 加密的哈希* @param {String} type default:jia, value:[jia 加密 ,bi 比对密码] 操作类型* @returns {[String|Boolear]} 返回值*/
const cyj = (txt, hash, type = 'jia') => {let res = null// 解密if (type === 'bi') {if (!txt || !hash) {throw '解密参数错误或缺少参数'}res = bcryptjs.compareSync(txt, hash)} else {if (!txt) {throw '加密请传入明文'}// 加密res = bcryptjs.hashSync(txt)}return res
}export default cyj
使用cyj加密
import cyj from './src/utils/bcrypt.js 'const pwd = '728637263我是隐私信息'//加密
const jia = cyj(pwd)console.log(jia)//$2a$10$BsXXaevfIG8Og7mKSF5qFu0vSugvJbYWyr3apz9BElCV254.SoIYe
console.log(cyj(pwd, jia, 'bi'))//true
console.log(cyj(pwd, '我是老6', 'bi'))//false
2、CryptoJS 加解密 - 单个key加密
- 下载
npm i crypto-js
- 作用:对字符加解密。
- 优点:一个key可以加密与解密,就像锁钥匙,一把钥匙既可以开锁也可以解锁
- 缺点:这个我不知道
- npm地址:https://www.npmjs.com/package/crypto-js
CryptoJS .js
import CryptoJS from 'crypto-js'// aes加解密/*** AES加密 * @param {String} originText 原始文本* @param {String} key 密钥* @returns */
const encryptAES = (originText, key) => {if (originText) {const encrypt = CryptoJS.AES.encrypt(originText, key)return encrypt.toString()}return null
}/*** AES解密 * @param {String} ciphertext 加密文本* @param {String} key 密钥* @returns */
const decryptAES = (ciphertext, key) => {if (ciphertext) {const decrypted = CryptoJS.AES.decrypt(ciphertext, key).toString(CryptoJS.enc.Utf8)return decrypted}return null
}/*** 创建AES密钥* @param {Number} num defalut:10 生成几位数的key* @returns {String} 返回密钥*/
const createAESKey = (num = 10) => {const library = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*+-./~=()[]{};:'?><,`";let key = ""for (var i = 0; i < num; i++) {let randomPoz = Math.floor(Math.random() * library.length);key += library.substring(randomPoz, randomPoz + 1);}return key
}export {decryptAES,encryptAES,createAESKey
}
使用CryptoJS
import {decryptAES,encryptAES,createAESKey
} from './CryptoJS.js'//获取key
const 钥匙 = createAESKey()
const 账号 = '我是老6'const 加密 = encryptAES(账号, 钥匙)
const 解密 = decryptAES(账号, 钥匙)console.log(加密)
console.log(解密)
3、 JSEncrypt | RSA加密 - 2把钥匙
注意:jsencrypt只能在前端使用,不能在后端使用
- 下载
npm i jsencrypt
- 作用:加密与解密,有2把钥匙,一把公钥,一把密钥,公钥负责加密,密钥负责解密。
- 优点:后端有2把钥匙,一把公钥,一把密钥。把公钥发给前端,前端负责加密数据,后端拿着密钥负责解密数据,这样一来,只用拿着密钥的人知道明文是什么了。
- 缺点:我不知道
- npm地址:https://www.npmjs.com/package/jsencrypt
jsencrypt.js
import JSEncrypt from 'jsencrypt' // 引入jsencrypt库 RSA 加、解密/*** RSA 加、解密* @param {String,default:'getkey',value:'encrypt 加密|decrypt 解密 | getkey 获取公私钥'} type 加解密类型 * @param {String} txt 加解密字符* @param {String} key 密钥* @returns {String} 返回加解密字符*/
const rsa = (type = 'getkey', txt, key) => {const jsencrypt = new JSEncrypt()let resData = null// 加密if (type === 'encrypt') {jsencrypt.setPublicKey(key)resData = jsencrypt.encrypt(txt)// 获取公私key} else if (type === 'getkey') {const prikey = jsencrypt.getPrivateKey()const pubkey = jsencrypt.getPublicKey()resData = {prikey,pubkey}// 解密} else {jsencrypt.setPrivateKey(key)resData = jsencrypt.decrypt(txt)}return resData
}export default rsa
使用rsa加密
import rsa from '. jsencrypt.js'// 公、私钥
const { prikey, pubkey } = rsa()const 密码 = '我是老6'
const 加密 = rsa('encrypt', 密码, pubkey)
const 解密 = rsa('decrypt', 密码, prikey)console.log(加密)
console.log(解密)
4、node-rsa - 后端RSA解加密 (可搭配前端jsencrypt)
注意
- node-rsa只能在后端使用
- jsencrypt只能在前端使用
- 安装
cnpm i node-rsa
node-rsa封装
- 该封装仅后端node环境下可用,前端不可用。
- 该封装可配合前端 jsencrypt一起使用,例如前端jsencrypt的加密数据,可用此封装解密等。
servers/rsa.js
import NodeRSA from "node-rsa"/*** 后端node获取公、私钥* keySize {Number} 生成私钥、密钥大小,与jsencrypt保持一致,默认1024* @returns {Object} { pubkey,prikey} pubkey 公钥 | prikey私钥*/const nodeGetKey = (keySize = 1024) => {const nodeKey = new NodeRSA({ b: keySize })const pubkey = nodeKey.exportKey('public')const prikey = nodeKey.exportKey('private')return {pubkey,prikey}
}/*** 后端node加密* @param {String} txt 加密的文本* @param {String} pubkey 公钥* @returns {String} 返回加密的文本*/
const nodeEncrypt = (txt, pubkey) => {const nodeKey = new NodeRSA(pubkey)nodeKey.setOptions({ encryptionScheme: 'pkcs1' })// 因为jsencrypt自身使用的是pkcs1加密方案, nodejs需要修改成pkcs1。const encrypted = nodeKey.encrypt(txt, 'base64')return encrypted
}/*** 后端node解密* @param {String} hash 加密的文本* @param {String} prikey 私钥* @returns */
const nodeDecrypt = (hash, prikey) => {const nodeKey = new NodeRSA(prikey)nodeKey.setOptions({ encryptionScheme: 'pkcs1' }) // 因为jsencrypt自身使用的是pkcs1加密方案, nodejs需要修改成pkcs1。const decrypted = nodeKey.decrypt(hash, 'utf8')return decrypted}export {nodeDecrypt,nodeGetKey,nodeEncrypt
}