几种前端加密解密的方法

2 篇文章 0 订阅
1 篇文章 0 订阅

以 Vue 作为例子
1.CryptoJS加密解密
首先引用CryptoJS的库
https://cdn.staticfile.org/crypto-js/3.1.9/crypto-js.min.js

加密:

const key = CryptoJS.enc.Utf8.parse("1234123412ABCDEF");  //十六位十六进制数作为密钥
const iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412'); //十六位十六进制数作为密钥偏移量
let srcs = CryptoJS.enc.Utf8.parse('this is test');//需要加密的数据
let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
let a1 =  encrypted.ciphertext.toString().toUpperCase();

解密:

let encryptedHexStr = CryptoJS.enc.Hex.parse(a1);
let srcs1 = CryptoJS.enc.Base64.stringify(encryptedHexStr);
let decrypt1 = CryptoJS.AES.decrypt(srcs1, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
let decryptedStr = decrypt1.toString(CryptoJS.enc.Utf8);
let b1 = decryptedStr.toString()

2.jsrsasign
先引用jsrsasign的库
https://cdn.staticfile.org/jsrsasign/8.0.12/jsrsasign-all-min.js

需要一对公钥和私钥

let priK='你的公钥'
let pk=‘你的私钥’

加密

                let src = "测试原文";// 加密的数据
                let pub = KEYUTIL.getKey(pk);
                let enc = KJUR.crypto.Cipher.encrypt(src,pub);
                console.log(hextob64(enc));

解密

                let prv = KEYUTIL.getKey(priK);
                let dec = KJUR.crypto.Cipher.decrypt(hextob64(enc),prv);
                console.log(dec);

创建签名

				let signature=new KJUR.crypto.Signature({alg:"SHA1withRSA",prvkeypem:priK});
				signature.updateString(src);
				let sign = hextob64(signature.sign());

解签

				let signatureVf = new KJUR.crypto.Signature({alg: "SHA1withRSA", prvkeypem: pk});
                signatureVf.updateString(src);
                let b = signatureVf.verify(b64tohex(sign));

3.jsencrypt
npm install jsencrypt
import JSEncrypt from ‘jsencrypt/bin/jsencrypt’
首先同样需要一对公钥和私钥

// 加密
                let encryptor = new JSEncrypt()
                let publicKey = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0keMaeU1uF/RKwk8MN/4BYCD9
                                NT2UGqJfgQ+Uau0JpxzlJ7jrCwuZPWHR/Jjkt46J8IfbbqL47WLNxIPgt/JZaqan
                                pqTkJvXv519SbyOfWNvDENfygI8m117C7AjOejXVxIoUA+OTvnetliCEkGKnmS6m
                                1noS6r6uBr8tfPf5fwIDAQAB`
                encryptor.setPublicKey(publicKey) // 设置公钥
                let rsaPassWord = encryptor.encrypt('我是测试的数据'); // 对需要加密的数据进行加密
                console.log('我的加密数据是',rsaPassWord);

                // 解密
                let secretWord = rsaPassWord  //假如后台已经拿到了加密数据
                let decrypt = new JSEncrypt() // 新建JSEncrypt对象
                let privateKey = `MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALSR4xp5TW4X9ErC
                                Tww3/gFgIP01PZQaol+BD5Rq7QmnHOUnuOsLC5k9YdH8mOS3jonwh9tuovjtYs3E
                                g+C38llqpqempOQm9e/nX1JvI59Y28MQ1/KAjybXXsLsCM56NdXEihQD45O+d62W
                                IISQYqeZLqbWehLqvq4Gvy189/l/AgMBAAECgYB5ffr+sgUuAQIGVuyWvQmzZTlt
                                BKh1AOKlPZH8+2CXcRAZAvwBcUIRjeJGRh2dLf/Cwcq3Ep6mvBoRdpqA1WNCMdtu
                                rkkJQlYE0eEJ6cKSQQZpbSnLBDfd4wEwUIHVAZVBwNgJB1r14sk/cPs6WiH9YQ+A
                                cBD1VgXOrburIEOFQQJBAOuzFt1LI03LZEnh3TsUPZ2ybuvShUjXP0LYB9Msn0EZ
                                UOwYmhpOWzNNhzBNE2bUjXDz8eMcTcKfiAG0+i7P1KECQQDEHz/8NDMAqQ+l1uOj
                                uRwZu0ewK29mh60ukqjbh0ShxK1zGGaiqr8vECam4VDLMyFp9igbsKS3AmmMPtvD
                                KPofAkAbK8sP+bB5MGBAUCRTwjKUMlStJNium/mz9/l286bsN0Hn5bImJDBJSr+x
                                5sC80vX3NngFCWdBb2ibYcSRju3hAkAe38CF5n3E89hXxh1t770hu97MN/pAjMlR
                                lJrqfD/sq3aWsNevcevI7+T1znCWnIT9Flg4C7XSbZnKDzcvYOsHAkEAhX3rHD4l
                                2rO49MXV7HGONhdHaPCSbQ2BQKgV7GHYKAqqlaBcZFwc5c8bG3XjeDopK4SmQyNE
                                Q25FAm6vAF0OcA==`
                decrypt.setPrivateKey(privateKey)
                let getWord = decrypt.decrypt(secretWord) // 解密
                console.log('我是解密后的原本内容',getWord)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端加密有以下几种方式: 1. 对称加密:使用相同的密钥进行加密和解密,常见的算法有DES、3DES、AES等。实现方式如下: ```javascript // 加密 function encryptByAES(message, secretKey) { const key = CryptoJS.enc.Utf8.parse(secretKey); const encrypted = CryptoJS.AES.encrypt(message, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } // 解密 function decryptByAES(ciphertext, secretKey) { const key = CryptoJS.enc.Utf8.parse(secretKey); const decrypted = CryptoJS.AES.decrypt(ciphertext, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return decrypted.toString(CryptoJS.enc.Utf8); } ``` 2. 非对称加密:使用公钥和私钥进行加密和解密,常见的算法有RSA、DSA等。实现方式如下: ```javascript // 生成公钥和私钥 const keyPair = window.crypto.subtle.generateKey( { name: "RSA-OAEP", modulusLength: 2048, publicExponent: new Uint8Array([1, 0, 1]), // 65537 hash: "SHA-256" }, true, ["encrypt", "decrypt"] ); // 加密 async function encryptByRSA(message, publicKey) { const encodedMessage = new TextEncoder().encode(message); const encrypted = await window.crypto.subtle.encrypt( { name: "RSA-OAEP" }, publicKey, encodedMessage ); return window.btoa(String.fromCharCode(...new Uint8Array(encrypted))); } // 解密 async function decryptByRSA(ciphertext, privateKey) { const decodedCiphertext = Uint8Array.from( atob(ciphertext), c => c.charCodeAt(0) ); const decrypted = await window.crypto.subtle.decrypt( { name: "RSA-OAEP" }, privateKey, decodedCiphertext ); return new TextDecoder().decode(decrypted); } ``` 3. 散列加密:将数据转化为固定长度的散列值,常见的算法有MD5、SHA-1、SHA-256等。实现方式如下: ```javascript // 计算MD5散列值 function hashByMD5(message) { return CryptoJS.MD5(message).toString(); } // 计算SHA-256散列值 function hashBySHA256(message) { return CryptoJS.SHA256(message).toString(); } ``` 4. 混淆加密:通过混淆代码或者加入噪音的方式来增强安全性,常见的方式有代码混淆、字符替换等。实现方式如下: ```javascript // 字符串替换 function replaceChars(str) { return str.replace(/a/g, "@").replace(/e/g, "3").replace(/i/g, "1"); } // 代码混淆 function obfuscateCode(code) { // 实现方式可以使用自己的加密算法,这里只是示例 return code.split("").reverse().join(""); } ``` 需要注意的是,以上示例代码只是参考实现,实际情况需要根据具体需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值