react native rsa

背景:最近在學(xué)習(xí)react native ,由于目前已經(jīng)發(fā)布的app(ios、安卓)有rsa加密的地方,所以 就嘗試用 RN 實(shí)現(xiàn)下,加解密流程是 ?服務(wù)端生成 公、私鑰,然后存儲(chǔ)私鑰,給前端發(fā)送公鑰,前端用公鑰加密后將數(shù)據(jù)傳給服務(wù)端,服務(wù)端解密。此文就不說(shuō)如何解密了。

所用的rsa庫(kù)? 我是直接將git上的庫(kù)(如圖1 的三個(gè)文件)放到我的RN項(xiàng)目文件里。

圖1

首先下載? buffer? 包,此包功能很強(qiáng)大感興趣的可以多了解了解。先用終端進(jìn)入到RN 項(xiàng)目的根目錄下,然后敲入

命令? npm install buffer --save ?

在此說(shuō)明下? --save? 是為了在自己項(xiàng)目主目錄下的package.json里能看到自己依賴的包。如圖( package.json 的截圖 ):紅色框里的buffer就是下載的。另外‘react’ 和‘react-native’ 是項(xiàng)目init時(shí)自帶的 ( 如何init一個(gè)新的項(xiàng)目參考 圖2,圖片截取自 react中文網(wǎng)-搭建開(kāi)發(fā)環(huán)境) 。其余沒(méi)用紅框框的,無(wú)需關(guān)注。項(xiàng)目中rsa并沒(méi)用到(是嘗試其他rsa 加解密時(shí)下載的依賴庫(kù))。

buffer 下載后,會(huì)在 node_modules 目錄里。


package.json 的截圖


圖2

代碼之前先說(shuō)下rsa。

1、我們要堅(jiān)信的認(rèn)為rsa的加密算法一定是一致的。 ?以此,我們找?guī)斓年P(guān)于加解密的算法部分一定是沒(méi)問(wèn)題的,不管什么平臺(tái)的,什么語(yǔ)言的。(前提,這個(gè)庫(kù)只要有人成功過(guò))

2、即使同一個(gè)公鑰,明文相同,加密后的密文也不相同,(這個(gè)地方讓我白白浪費(fèi)了大半天時(shí)間),至于什么原因不同,有興趣的可以google了解下。

3、rsa 加密有兩中,一種是根據(jù)modulus,一種根據(jù)publickey。本文說(shuō)的是根據(jù)modulus,publickey 也有對(duì)應(yīng)的庫(kù),在此就不說(shuō)了。推薦個(gè)庫(kù) node-rsa? 我沒(méi)試過(guò),不知道是否可以。

4、modulus 會(huì)通過(guò)計(jì)算生成 公鑰,這里有個(gè)有個(gè)bignum的概念。jsbn.js ?文件里可以看到。而用publickey 話,直接使用即可。

閑話少說(shuō),上代碼。

import RSAKey from './Utils/RSA/rsa1/rsa'

import {Buffer} from 'buffer'

RSAKey 的引用,根據(jù)它的目錄結(jié)構(gòu)來(lái)。 根目錄-Utils-RSA-rsa1 ? 如圖3 ? RN3 就是該項(xiàng)目的根目錄。 這里目錄引用,主要給初學(xué)者強(qiáng)調(diào)下,如果已經(jīng)了解可以忽略。

buffer 上面已經(jīng)提到,裝在了node_modules目錄里,所以這樣引用就行。


圖3

接著下面的代碼

// 服務(wù)器返回的 modulus 串

let modulusKey1 = 'AICUXv5CXjBmz09IeybFBxNjd0jrqWN/d08mv5UvbAoYEzdDisP+C4C2oAMk9VB3hY9BBswu9efv72UayDpCL7e9RVs0WZ7ghp7rNxDjk99rcDP8K537iqDaLRTcFXPKvgXKnxlrz7AOJblVVfmf68sZDd9JEQvLsCwaJFOYkj/X';

// buffer的創(chuàng)建,這里說(shuō)下,由于我們服務(wù)器返回的是base64,所以buffer的第二個(gè)參數(shù)就是 ‘base64’,具體用法可以參考 buffer ?api

let modulusKey2 = new Buffer(modulusKey1, 'base64');

// 這一步是將服務(wù)器返回的數(shù)據(jù)轉(zhuǎn)成hex,為什么要這么做呢,因?yàn)槲覀冇玫膔sa庫(kù)的參數(shù)是hex格式, 這個(gè) rsa.js 源碼里有提到,或者? __tests__? 文件夾里的index.spec.js 的事例也提到了(第5、6行),事例里的publicKey 就是我說(shuō)的modulus,只是作者起的變量名叫publicKey。

let modulusKey3 = modulusKey2.toString('hex');

// 準(zhǔn)備好參數(shù)對(duì)象,這里提下,n? 和? e 是與rsa modulus 方式必須的參數(shù)。如果你看到 其他平臺(tái)有提到 ‘AQAB’ 和這里的 ?‘10001’ 是一樣的。你可以嘗試將AQAB轉(zhuǎn)成hex格式看看。

let ConsultPublicKey = {n:modulusKey3,e:'10001'};

// 加密的明文

let randomKey = 'aaabbbcccdddeeefffggghhh';

// 創(chuàng)建rsa加、解密對(duì)象

let rsaPublicKey = new RSAKey();

// 設(shè)置秘鑰,這注意下,需要將ConsultPublicKey 對(duì)象轉(zhuǎn)成json字符串,因?yàn)閟etPublicString參數(shù)類型是json字符串。

rsaPublicKey.setPublicString(JSON.stringify(ConsultPublicKey));

// 進(jìn)行加密操作

let randomKeyRsa = rsaPublicKey.encrypt(randomKey);

// 將加密后的數(shù)據(jù) 創(chuàng)建buffer, ? encrypt方法的返回值就hex格式的

let tempBuffer = new Buffer(randomKeyRsa,'hex');

// 將數(shù)據(jù)轉(zhuǎn)成base64

let tempBuffer3= tempBuffer.toString('base64');

// 注釋: tempBuffer3 ?就是服務(wù)端要的加密數(shù)據(jù)了。



我們看下服務(wù)端的代碼。由于服務(wù)端不是我開(kāi)發(fā)的,庫(kù)什么的也不清楚,但是還是那句話,rsa 加密的庫(kù)的算法什么的一定都是統(tǒng)一的。所以你找個(gè)有人成功過(guò)的庫(kù)就Ok了。這里我只貼個(gè)給前端傳的數(shù)據(jù)處理部分的代碼。 如圖4


圖4

以上是代碼部分。

希望以上部分對(duì)你有幫助,如有什么問(wèn)題,留言聯(lián)系。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,547評(píng)論 19 139
  • 軍校時(shí)愛(ài)情是偷偷傳遞的紙條濃情蜜意如醉如癡 畢業(yè)后愛(ài)情是厚厚的牛皮紙信封一種閑愁兩地相思 結(jié)婚后愛(ài)情是一張紅紅的結(jié)...
    成都獨(dú)行俠閱讀 609評(píng)論 0 7
  • 生活中從不缺少美,而是缺少發(fā)現(xiàn)美的眼睛——羅丹 當(dāng)人生處于灰暗的時(shí)候,或許一個(gè)陌生人的出現(xiàn)就能夠改變你的一生(思想...
    INTP邏輯學(xué)家閱讀 708評(píng)論 3 5
  • 兔夫人閱讀 314評(píng)論 2 1

友情鏈接更多精彩內(nèi)容