1. 程式人生 > >RSA加密與解密的流程與方法

RSA加密與解密的流程與方法

加密——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)
    })
}