在VUE項目中如何用RSA簽名封裝加簽驗簽方法

最近公司進行vue項目用到RSA簽名厂抖,研究了一下網(wǎng)上的一些技術(shù)博客,發(fā)現(xiàn)都是千篇一律,而且實現(xiàn)原理示例代碼都存在或多或少的問題所以自己寫下這篇文章記錄總結(jié)一下RSA加簽榔幸、驗簽的方法愉豺,讓像我這種開發(fā)小白少走彎路篓吁。

一、RSA簽名的原理

RSA簽名需要公鑰和私鑰蚪拦,具體實現(xiàn)原理是:
1杖剪、A保留生成的私鑰冻押,將公鑰留給B;
2盛嘿、A用私鑰將數(shù)據(jù)加簽生成密文洛巢,傳給B;
3次兆、B接到數(shù)據(jù)用公鑰將數(shù)據(jù)加簽狼渊,生成密文與A傳過來的密文進行對比,如果對比的結(jié)果一致类垦,證明消息是A回復(fù)的狈邑。

二、vue項目中RSA加簽蚤认、驗簽具體實現(xiàn)步驟

1米苹、密鑰的生成

密鑰的生成有很多方法最簡單的方法是直接在網(wǎng)上搜索 “RSA密鑰生成”就可以找到專門生成RSA密鑰的網(wǎng)站。而我這里介紹的是使用 支付寶 rsa 密鑰生成工具 生成密鑰 砰琢。如圖:

支付寶 rsa 密鑰生成工具

2蘸嘶、簽名規(guī)則

為了保證數(shù)據(jù)的嚴謹性需要對數(shù)據(jù)進行一下處理,比如排序陪汽,或者在數(shù)據(jù)后面加上一些你與后端約定的一些代碼训唱。如圖:
驗證規(guī)則

3、在VUE中使用jsrsasign進行簽名

1挚冤、安裝jsrsasign
jsrsasign官網(wǎng)

npm install jsrsasign --save

2况增、引入jsrsasign
因為我將加簽、驗簽封裝在了統(tǒng)一的jsrsasign.js文件中所以要在js文件中引用如下代碼

import Vue from 'vue'
import jsrsasign, { KJUR, hextob64, b64utohex } from 'jsrsasign'
Vue.prototype.$jsrsasign = jsrsasign

3训挡、加簽

/**
 * RSA加簽
 * @param {加簽參數(shù)} signData 
 */
export const RSAEncrypt = (signData) => {
  let prk = '' //私鑰
  let signPrivateKey = '-----BEGIN PRIVATE KEY-----' + prk + '-----END PRIVATE KEY-----';
  let data = signData
  //ASCII排序 生成 bar=2&foo=1這種結(jié)構(gòu)
  function sortAsc (o) {
    var n = [];
    for (var k in o) n.push(k);
    n.sort();
    for (var i = 0, str = ''; i < n.length; i++) {
      var v = o[n[i]];
      if (v) {
        if ({}.toString.call(v) == '[object Object]')
          v = sortAsc(v);
        else if ({}.toString.call(v) == '[object Array]')
          v = JSON.stringify(v).replace(/:/g, '=');
      }
      str += '&' + n[i] + '=' + v;
    }
    return str.slice(1);
  }
  // 參數(shù)
  let data1 = sortAsc(data) + 'zaq1'  // sortAsc(data)  'zaq1'為與后端約定好的參數(shù)值
  let sig = new KJUR.crypto.Signature({ "alg": "SHA1withRSA" });//創(chuàng)建sig對象并指定算法名稱(SHA1withRSA)算法要與后端約定好
  sig.init(signPrivateKey);//初始化實例
  sig.updateString(data1)//更新簽名數(shù)據(jù)
  let sign = jsrsasign.hextob64(sig.sign())//簽名得到十六進制密文
  return sign
}

4澳骤、驗簽

/**
 * RSA驗簽
 * @param {加簽的數(shù)據(jù)} signData 
 * @param {加簽之后得到的簽文} data
 */
export const RSADecrypt = (signData, data) => {
  //ASCII排序  生成 bar=2&foo=1這種結(jié)構(gòu)
  function sortAsc (o) {
    var n = [];
    for (var k in o) n.push(k);
    n.sort();
    for (var i = 0, str = ''; i < n.length; i++) {
      var v = o[n[i]];
      if (v) {
        if ({}.toString.call(v) == '[object Object]')
          v = sortAsc(v);
        else if ({}.toString.call(v) == '[object Array]')
          v = JSON.stringify(v).replace(/:/g, '=');
      }
      str += '&' + n[i] + '=' + v;
    }
    return str.slice(1);
  }
  let newSign1 = sortAsc(signData) + 'zaq1'//  'zaq1'為與后端約定好的參數(shù)值

  try {
    let pk = ''//公鑰
    let signPublicKey = '-----BEGIN PUBLIC KEY-----' + pk + '-----END PUBLIC KEY-----';
    let sig2 = new KJUR.crypto.Signature({ "alg": "SHA1withRSA" });//創(chuàng)建sig2對象并指定算法名稱(SHA1withRSA)
    sig2.init(signPublicKey);//初始化實例
    sig2.updateString(newSign1);//更新簽名數(shù)據(jù)
    let result = sig2.verify(b64utohex(data));//進行十六進制字符串的驗簽
    return result;
  } catch (e) {
    console.error(e);
  }
} 

以上便是我對RSA加簽驗簽的小結(jié),希望可以幫助到需要的人澜薄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末为肮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肤京,更是在濱河造成了極大的恐慌颊艳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘分,死亡現(xiàn)場離奇詭異棋枕,居然都是意外死亡,警方通過查閱死者的電腦和手機饭庞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門戒悠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舟山,你說我怎么就攤上這事绸狐÷笨遥” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵寒矿,是天一觀的道長突琳。 經(jīng)常有香客問我,道長符相,這世上最難降的妖魔是什么拆融? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮啊终,結(jié)果婚禮上镜豹,老公的妹妹穿的比我還像新娘。我一直安慰自己蓝牲,他們只是感情好趟脂,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著例衍,像睡著了一般昔期。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佛玄,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天硼一,我揣著相機與錄音,去河邊找鬼梦抢。 笑死般贼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惑申。 我是一名探鬼主播具伍,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼圈驼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起望几,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤绩脆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后橄抹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靴迫,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年楼誓,在試婚紗的時候發(fā)現(xiàn)自己被綠了玉锌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡疟羹,死狀恐怖主守,靈堂內(nèi)的尸體忽然破棺而出禀倔,到底是詐尸還是另有隱情,我是刑警寧澤参淫,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布救湖,位于F島的核電站,受9級特大地震影響涎才,放射性物質(zhì)發(fā)生泄漏鞋既。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一耍铜、第九天 我趴在偏房一處隱蔽的房頂上張望邑闺。 院中可真熱鬧,春花似錦棕兼、人聲如沸检吆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹭沛。三九已至,卻和暖如春章鲤,著一層夾襖步出監(jiān)牢的瞬間摊灭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工败徊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帚呼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓皱蹦,卻偏偏與公主長得像煤杀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沪哺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345