RSA加密與解密的流程與方法
阿新 • • 發佈:2019-02-13
加密——RSA前端與後臺的加密與解密
什麼是RSA加密
RSA加密演算法是一種非對稱加密演算法,所謂非對稱,就是指該演算法需要一對金鑰,使用其中一個加密,則需要肜另一個才能解密,利用對極大整數做因數分解的難度決定了RSA演算法的可靠性
RSA的演算法涉及三個引數,n、e1、e2
其中,n是兩個大質數 p、q的積,n的二進位制表示所佔用的位數,就是所謂的金鑰長度
e1和e2是一對相關的值,e1可以任意取,但要求與(p-1) * (q-1)互質;再選擇e2,要求(e2 * e1) = 1 (mod(p-1) * (q-1))
(n,e1),(n,e2)就是金鑰對,其中(n,e1)為公鑰,(n,e2為公鑰)
RSA加密解密演算法完全相同,設A為明文,B為密文,則:A = B ^ e2 (mod n) ;B = A ^ e1 (mod n)
e2和e1可以互換使用,即:
A = B ^ e1 (mod n); B = A ^ e2 (mod n)
RSA流程
1.後端生成publicKey與privateKey
2.後端返回publicKey給前端
3.前臺使用publicKey給敏感欄位加密
4.使用post方式傳送資料給後端
5.後端使用publicKey與pvivateKey進行解密。
使用加密庫cryptico為資料加密
1.需要加密時先請求後臺的getrsa介面,後臺會返回加密公鑰
api.js 管理介面地址
// 獲取 rsa
'getrsa': '/api/safe/getrsa',
2.定義加密方法
// services.js 配置請求方式與請求函式名稱
export function getRsa() {
return http.get(apis.getrsa)
}
// 判斷是生產環境才進行加密
export function encrypt(val) {
if (process.env.NODE_ENV === 'production') {
return getRsa().then( res => {
// 定義公鑰為介面返回結果
const publicKey = res
// 例項化加密係數
const rsakey = new RSAKey()
// 根據 rsa加密公式 m^e = c (mod n),使用公鑰(n,e)對m進行加密,m即為加密指數'10001'
rsakey.setPublic(publicKey, '10001')
// 返回加密後的資料
return rsakey.encrypt(val)
})
} else {
// 如果不是生產環境,直接把promise狀態變為已完成,返回成功狀態(即不加密但會對執行加密成功後的函式)。
return Promise.resolve(val)
}
}
3.為資料加密
// 引入加密函式
import { encrypt, postLoginInfo } from 'services'
// 登入
login() {
const params = {}
// 使用Promise.all()方法給資料加密,promise.all()訪求提供了並行執行非同步操作的能力,並且在所有非同步操作執行完畢後才執行回撥。all接收一個數組引數,裡邊的值最終都返回promise物件。然後放進一個數組中傳給then,用values接收
Promise.all([
encrypt(this.password),
encrypt(this.phoneNum)
]).then(values => {
params.pwd = vlaues[0]
params.mobile = values[1]
postLoginInfo(params).then((res) => {
this.$router.push('/')
}).catch((err) => {
console.log(err)
})
}).catch((err) => {
console.log(err)
})
}