Vue(uniapp)内使用RSA加密,对应后端RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING加密模式

RSA加密算法

RSA是非对称加密算法,拥有一个公钥一个私钥,公钥用来加密,私钥用来解密,通常来说非对称加密比对称加密要耗时间。

AES对称加密、解密的速度要比RSA快很多。

其余也不过多赘述,想具体了解直接网上搜一下便知,直接进入正题。

后端加密使用RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING规范时,前端要想对应也需要使用对应的加密规范,这里我们需要引入一个插件:node-forge

引入node-forge插件

在项目里打开终端,输入引入插件命令:

npm install node-forge --save

引入如下图: 

 引入成功后会多出两个文件,如下:此时我们已经把插件引进来了

封装

将代码封装起来,后面好方便引用,找个文件夹新建js文件,我这里是在util里新建文件rsa_ecb.js

 rsa_ecb.js文件内容如下:

let forge = require('../node_modules/node-forge/dist/forge.min.js')

//公钥
let publicKeyAll = ``;
//私钥
let privateKeyAll = ``;

//RSA设置公钥
export function rsa_setPublicKey(publicEncryKey) {
    publicKeyAll = '-----BEGIN PUBLIC KEY-----\n' + publicEncryKey + '\n-----END PUBLIC KEY-----';
}

//RSA设置私钥
export function rsa_setPrivateKey(privateEncryKey) {
    privateKeyAll = '-----BEGIN PRIVATE KEY-----\n' + privateEncryKey + '\n-----END PRIVATE KEY-----';
}

// 公钥加密密钥 的方法
export function rsa_encrypt(proclaimedText) {
    var publicKey = forge.pki.publicKeyFromPem(publicKeyAll)
    var bytes = forge.util.encodeUtf8(proclaimedText)
    var rsaCipherText = forge.util.encode64(publicKey.encrypt(bytes, 'RSA-OAEP', {
        md: forge.md.sha256.create(),
        mgf1: {
            md: forge.md.sha1.create()
        }
    }))
    return rsaCipherText
}

// 私钥解密密钥 的方法
export function rsa_decrypt(rsaCipherText) {
    var privateKey = forge.pki.privateKeyFromPem(privateKeyAll)
    var rsaCipherTextAll = forge.util.binary.base64.decode(rsaCipherText);
    var decrypted = privateKey.decrypt(rsaCipherTextAll, 'RSA-OAEP', {
        md: forge.md.sha256.create(),
        mgf1: {
            md: forge.md.sha1.create()
        }
    })
    console.log(decrypted)
    var proclaimedText = forge.util.decodeUtf8(decrypted)
    return proclaimedText
}

// 私钥解密密钥循环 的方法
export function rsa_Recycle(rsaCipherText) {
    var privateKey = forge.pki.privateKeyFromPem(privateKeyAll)
    var rsaCipherTextAll = forge.util.binary.base64.decode(rsaCipherText);
    var decrypted = privateKey.decrypt(rsaCipherTextAll, 'RSA-OAEP', {
        md: forge.md.sha256.create(),
        mgf1: {
            md: forge.md.sha1.create()
        }
    })
    return decrypted
}

//拼接解密
export function rsa_getProclaimedText(rsaCipherText) {
    var proclaimedText = forge.util.decodeUtf8(rsaCipherText)
    return proclaimedText
}

然后在main.js中引入

//调用RSA方法
import {
    rsa_setPublicKey,
    rsa_setPrivateKey,
    rsa_encrypt,
    rsa_decrypt,
    rsa_Recycle,
    rsa_getProclaimedText
} from '@/util/rsa_ecb.js'
Vue.prototype.rsa_setPublicKey = rsa_setPublicKey
Vue.prototype.rsa_setPrivateKey = rsa_setPrivateKey
Vue.prototype.rsa_encrypt = rsa_encrypt
Vue.prototype.rsa_decrypt = rsa_decrypt
Vue.prototype.rsa_Recycle = rsa_Recycle
Vue.prototype.rsa_getProclaimedText = rsa_getProclaimedText

使用

最后在页面内使用RSA加密,注:这里的公钥和秘钥是我早就准备好的,可以用来测试加密代码是否成功

var key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvVrLJUKw9K6rEatuuSfRRc23bQgIP6LLCEpwI/sW5weMfgV6S6lLZwcvAuqWJW8fbLM6YuoQghcIvASVBwEw5f4KHN7TpIgShOR5Je7Ua22rLZz0OcEJ4ZBVqhS7TWT0GHpC2ZZrL2uB/3OEJVX4cUX+ElPIAKawpKG+UO6IMvc0C1AvG5NX+ATGeox5QIl7oF0dt0oa3aXWLR1GZfF1gKW6otuaj53rp1/DgzcWGxYXOPzEfCu/fu3eX3rva22JsCWZlObsmnzMtpd/C0S1YfgY0zldStCt3La1as+i5sPKpJA0uH1Ow163NBg05jvdWIuRHZfCPV4BjosgalhSXQIDAQAB'
this.rsa_setPublicKey(key);
var miyao = this.rsa_encrypt('Hello,中国是世界上第一古老大国');
console.log(miyao)
var decryptText='MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9WsslQrD0rqsRq265J9FFzbdtCAg/ossISnAj+xbnB4x+BXpLqUtnBy8C6pYlbx9sszpi6hCCFwi8BJUHATDl/goc3tOkiBKE5Hkl7tRrbastnPQ5wQnhkFWqFLtNZPQYekLZlmsva4H/c4QlVfhxRf4SU8gAprCkob5Q7ogy9zQLUC8bk1f4BMZ6jHlAiXugXR23ShrdpdYtHUZl8XWApbqi25qPneunX8ODNxYbFhc4/MR8K79+7d5feu9rbYmwJZmU5uyafMy2l38LRLVh+BjTOV1K0K3ctrVqz6Lmw8qkkDS4fU7DXrc0GDTmO91Yi5Edl8I9XgGOiyBqWFJdAgMBAAECggEACAg97cqybu6p2woGnFwQCIH9ceaRUwG40xU1RJF2Gz66uu3IjkUUKb6oQ9tnmxbnoljH9UIwiRQpDrCzEaT/SgJIs4jQOX58Kp72dKF46UWxqTGrOnfxz1usBpbyiwnpQNCO3WQAD/bjgM6JoHvRGhz59hUPutdXTuR9ijlUFbVMCTF0bRrxu+lUNykiiqpsdZSQWiBpZvwkfZ3zLdwbiqPS0LfUl644Vy8gijpQs04R9MleixvULvflXTVR0Ce6shyBpC/1NuIacoHYiui9QdFZq5cFmL9UMkVSW0W6KHWxKUefU281NJVhn8v18eN5QafRYmv4CDUZjGk/WeUkEQKBgQDs69hHy3cPgzG+8lXYuVkhLwoc6ic5x+Njl164clERfHB7VbvktpoWgip6YV2QMjAHbk/q8aLBDzYCC665Z769bLIy/gcfg1Ls4K379Gde1BYxo7cDGypWOYDOkFisb8Lsv52TiE90t0KTlR+zxIktcQSNbDBEBMrTnLvxfUkY9wKBgQDMmlvCnGp6qBxRhj9Pgq4KJJ07Htas1eTAgxoy/Oadl/kSrn3i1LREn+qJd8eSpxP9HIKNP+kye93FBRfP2NAOBx2ZW2xhRaNOSHDIRMorOOxDjb3qOvu2J6zRzZCdfgQIWUXR5Yo/XIoSM0SXbi7l8nqUPxe0Wf14NhBm/lOOSwKBgBiOpZ9jdpbUCW76XW2WYKew4YJ3vtMdZfNnuDi0GLUQSfRuwYgGaVhV66M9vl345cOPapc2rqEGO5ngrh6nozytLJdef0yD5y+IZmBMR/6rSxWgG5Ml2LCRS0md6qMM/o5dmi61nU7CxBLaDSwr/fAI2+jwwtv6BzAB+fUhAFenAoGBAMnUpxoGBH+0oCLHpGKBzb9RuQyd8jUS1pIVgd20XqYtSVVlbec53g4oFku/Lc78JBq2ag5+ckMLr4vv5zpwbWS5Hjiu1+3orRzHFwJn4Wrbvy0wgJyzzKQ25SMdfj/uFHpL3jUdEtBIMCeeDVa4KWlKViMxTefqMcDIzEtdLP2bAoGASTR5I8O7WBDAOb21fya+GqBfi9uHXC+pzDNWZ4jeRTRTwhGvvV5Qn+j2yNkUja5d1P++dZYJEVvfKTdMYsHALNUlkhi4HjjDbvr42lyzg4tJILebHlEHkY3R8yn1d7cB5nzibGS1E6OJOU12f1JFhGRvYpM0VSFT8C4bCmdqZnM='
this.rsa_setPrivateKey(decryptText)
var text = this.rsa_decrypt(miyao)
console.log(text);

使用后浏览器输出如下:

 最后注意:公钥是用来对数据加密的,私钥是用来解密的,如果需要解密必须要有私钥

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
前端Vue RSA加密示例代码如下: ```javascript 前端Vue RSA加密 import JSEncrypt from 'jsencrypt' // 创建RSA加密实例 const encrypt = new JSEncrypt() // 设置RSA公钥 const publicKey = 'YOUR_RSA_PUBLIC_KEY' encrypt.setPublicKey(publicKey) // 要加密的数据 const data = 'YOUR_DATA_TO_ENCRYPT' // 使用RSA公钥进行加密 const encryptedData = encrypt.encrypt(data) // 将加密后的数据发送到后端进行解密 ``` 后端Java解密示例代码如下: ```java import java.security.KeyFactory; import java.security.PrivateKey; import java.security.spec.PKCS8EncodedKeySpec; import javax.crypto.Cipher; import org.apache.commons.codec.binary.Base64; public class RSADecrypt { public static String decrypt(String encryptedData, String privateKeyStr) throws Exception { // 将Base64编码后的私钥字符串转换为PrivateKey对象 byte[] privateKeyBytes = Base64.decodeBase64(privateKeyStr); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); // 使用私钥进行解密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] encryptedBytes = Base64.decodeBase64(encryptedData); byte[] decryptedBytes = cipher.doFinal(encryptedBytes); // 返回解密后的数据 return new String(decryptedBytes); } } ``` 请将 `YOUR_RSA_PUBLIC_KEY` 替换为你的RSA公钥,然后在前端加密后的数据发送到后端后端调用 `RSADecrypt.decrypt()` 方法进行解密,并将 `YOUR_DATA_TO_ENCRYPT` 替换为你要加密的数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值