JavaScript使用JSEncrypt對(duì)數(shù)據(jù)加解密
引言
在 Web 開發(fā)中,數(shù)據(jù)安全是至關(guān)重要的環(huán)節(jié)。當(dāng)涉及用戶密碼、身份證號(hào)等敏感信息的傳輸時(shí),僅僅依賴 HTTPS 可能還不夠——在金融、政務(wù)等高安全場(chǎng)景中,通常需要在應(yīng)用層再做一次加密,以防止中間人攻擊或內(nèi)網(wǎng)抓包導(dǎo)致的數(shù)據(jù)泄露。
RSA 是一種非對(duì)稱加密算法,它使用一對(duì)密鑰:公鑰加密、私鑰解密。前端持有公鑰進(jìn)行加密,后端持有私鑰進(jìn)行解密,即使請(qǐng)求被截獲,攻擊者也無法還原明文數(shù)據(jù)。
1、關(guān)于 JSEncrypt
JSEncrypt 是一個(gè)基于 JavaScript 實(shí)現(xiàn)的 RSA 加密庫,專為瀏覽器環(huán)境設(shè)計(jì),提供了簡(jiǎn)單易用的 API。它的核心特點(diǎn):
- 輕量簡(jiǎn)潔:API 只有幾個(gè)核心方法,學(xué)習(xí)成本低
- 開箱即用:無需復(fù)雜的依賴配置
- 支持標(biāo)準(zhǔn) PEM 格式:可與后端(Java、Python、PHP、Node.js)無縫對(duì)接
2、安裝
- 使用 npm 安裝
npm install jsencrypt --save
- 使用 yarn 安裝
yarn add jsencrypt
3、使用 JSEncrypt
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
const publicKey = 'xxxx';
const privateKey = 'xxxx';
// 加密
export function encrypt(txt) {
if (!txt) {
return txt;
}
const encryptor = new JSEncrypt()
// 設(shè)置公鑰
encryptor.setPublicKey(publicKey)
// 對(duì)數(shù)據(jù)進(jìn)行加密
return encryptor.encrypt(txt)
}
// 解密
export function decrypt(txt) {
if (!txt) {
return txt;
}
const encryptor = new JSEncrypt()
// 設(shè)置私鑰
encryptor.setPrivateKey(privateKey)
// 對(duì)數(shù)據(jù)進(jìn)行解密
return encryptor.decrypt(txt)
}
4、生成公/私鑰
生成公/私鑰,點(diǎn)擊生成密鑰對(duì),將生成的公鑰、私鑰復(fù)制到 js 文件中即可。
注意:公鑰的格式必須完整包含 -----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY----- 標(biāo)記,否則加密會(huì)失敗。
5、注意事項(xiàng)
將公鑰寫死在代碼中雖然簡(jiǎn)單,但存在兩個(gè)問題:
- 公鑰泄露后無法及時(shí)更換
- 無法實(shí)現(xiàn)密鑰輪換
最佳實(shí)踐是在應(yīng)用啟動(dòng)時(shí)或進(jìn)入登錄頁時(shí),從后端動(dòng)態(tài)獲取公鑰。
在 main.js 或 App.vue 中初始化:
// main.js
import { setPublicKey } from '@/utils/rsaEncrypt'
import axios from 'axios'
// 應(yīng)用啟動(dòng)時(shí)獲取公鑰
async function initRSA() {
try {
const response = await axios.get('/api/public-key')
if (response.data.code === 200) {
setPublicKey(response.data.publicKey)
console.log('RSA 公鑰初始化成功')
}
} catch (error) {
console.error('獲取公鑰失敗', error)
}
}
initRSA()
6、常見問題
- 加密返回 null
- 原因一:公鑰格式不正確
確保公鑰包含了正確的頭尾標(biāo)識(shí):
-----BEGIN PUBLIC KEY----- (公鑰內(nèi)容) -----END PUBLIC KEY-----
- 原因二:待加密的數(shù)據(jù)過長(zhǎng)
RSA 加密有長(zhǎng)度限制(密鑰長(zhǎng)度 1024 位時(shí),最多加密 117 字節(jié);2048 位時(shí)最多 245 字節(jié))。如果遇到超長(zhǎng)內(nèi)容需要加密,可以考慮:
- 對(duì)長(zhǎng)文本使用 AES 對(duì)稱加密,再用 RSA 加密 AES 密鑰(混合加密方案)
- 或使用分段加密方案
- Vue 3 中的使用差異
在 Vue 3 中,使用方式和 Vue 2 基本相同,唯一的區(qū)別是 Composition API 的寫法:
<script setup>
import { ref } from 'vue'
import { encrypt } from '@/utils/rsaEncrypt'
const password = ref('')
const encryptedPwd = encrypt(password.value)
</script>
- TypeScript 支持
如果項(xiàng)目使用 TypeScript,可以安裝類型定義:
npm install @types/jsencrypt --save-dev
7、安全性建議
- 必須使用 HTTPS:即使做了應(yīng)用層加密,HTTPS 仍然是傳輸安全的基礎(chǔ)
- 公鑰動(dòng)態(tài)獲?。罕苊鈱⒐€寫死在前端代碼中,通過接口動(dòng)態(tài)獲取
- 定期輪換密鑰:后端定期生成新的密鑰對(duì),降低密鑰泄露風(fēng)險(xiǎn)
- 配合驗(yàn)證碼機(jī)制:防止暴力 破解攻擊
- 前端只加密,不解密:私鑰只保存在服務(wù)端,前端永遠(yuǎn)不應(yīng)該持有私鑰
到此這篇關(guān)于JavaScript使用JSEncrypt對(duì)數(shù)據(jù)加解密的文章就介紹到這了,更多相關(guān)JavaScript JSEncrypt數(shù)據(jù)加解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript如何實(shí)現(xiàn)精準(zhǔn)倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了JavaScript如何實(shí)現(xiàn)精準(zhǔn)倒計(jì)時(shí)功能,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
談?wù)凧avaScript類型系統(tǒng)之Math
Math 對(duì)象并不像 Date 和 String 那樣是對(duì)象的類,因此沒有構(gòu)造函數(shù) Math(),像 Math.sin() 這樣的函數(shù)只是函數(shù),不是某個(gè)對(duì)象的方法。您無需創(chuàng)建它,通過把 Math 作為對(duì)象使用就可以調(diào)用其所有屬性和方法2016-01-01
d3.js中冷門卻實(shí)用的內(nèi)置函數(shù)總結(jié)
D3.js是一個(gè)JavaScript庫,它可以通過數(shù)據(jù)來操作文檔。D3可以通過使用HTML、SVG和CSS把數(shù)據(jù)鮮活形象地展現(xiàn)出來。d3.js其實(shí)提供了很多內(nèi)置的函數(shù),可以卻被大家忽略了,下面這篇文章就來給大家詳細(xì)介紹了d3.js中冷門卻實(shí)用的一些內(nèi)置函數(shù),需要的朋友可以參考借鑒。2017-02-02
JS仿Windows開機(jī)啟動(dòng)Loading進(jìn)度條的方法
這篇文章主要介紹了JS仿Windows開機(jī)啟動(dòng)Loading進(jìn)度條的方法,實(shí)例分析了javascript操作html元素及對(duì)應(yīng)樣式實(shí)現(xiàn)特效的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02

