React Native 使用 nodejs 原生 Crypto 模块加/解密

node原生有 crypto 模块,基本支持各种加密方式,奈何 React Native并不支持这些模块,可以使用以下方式破解

rn-nodeify

此类库是用 hack 方法添加 nodejs 核心模块 github

react-native-crypto

此类库支持在 React Native 中使用 node 的 crypto 模块 github

安装

    npm i --save eshint
    npm i --save react-native-crypto
    npm i --save react-native-randombytes
    react-native link react-native-randombytes
    npm i --save-dev tradle/rn-nodeify
    ./node_modules/.bin/rn-nodeify --hack --install
    #rnpm link

应用

    import './shim.js';
    import crypto from 'crypto';
    import AESCrypt from './AESCrypt';
    import RSACrypt from './RSACrypt';
    ...
    componentDidMount(){

        //AES加密
        var iv = new Buffer.from("xxxxxxxxxxxxxxxx")
        var key = 'xxxx'
        var data = {
            username: 'zhang',
            pwd: '123'
        }
        var encryptResult = AESCrypt.encrypt(key, iv, JSON.stringify(data))
            this._basicAlert('AES加密结果',encryptResult.toString(), 
            [
            {text: '解密', onPress: () => {
                var decryptResult = AESCrypt.decrypt(key, iv, encryptResult)
                this._basicAlert('AES解密结果',decryptResult,[{text: '关闭'},])
            }},
            {text: '关闭'},
            ]
        )
        const public_key = '';
        const private_key = '';
        //RSA加密解密
        var msg = JSON.stringify(data)
        var rsaEncryptResult = RSACrypt.encrypt(public_key, msg)
        this._basicAlert('RSA加密结果',rsaEncryptResult + "", 
            [
            {text: '解密', onPress: () => {
                var rsaDecryptResult = RSACrypt.decrypt(privateKey, rsaEncryptResult);
                this._basicAlert('RSA解密结果',rsaDecryptResult,[{text: '关闭'},])
            }},
            {text: '关闭'},
            ]
            )
        }
        _basicAlert = (title, msg, action) => {
                Alert.alert(
                    title,
                    msg,
                    action,
                    { cancelable: false }
                )
        }
    }
    ...

Troubleshooting

由于网络原因,在执行安装过程中,部分模块可能安装不完全,在运行程序时出现“XX”模块找不到的错误,此时需再执行以下命令

npm i --save-dev tradle/rn-nodeify
./node_modules/.bin/rn-nodeify --hack --install -o

# 附:
## AESCrypt模块
import './shim.js'
import crypto from 'crypto'


var AESCrypt = {};

AESCrypt.decrypt = function(cryptkey, iv, encryptdata) {
    encryptdata = new Buffer(encryptdata, 'base64').toString('binary');
    var decipher = crypto.createDecipheriv('aes-128-cbc', cryptkey, iv);
    var decoded  = decipher.update(encryptdata, 'binary', 'utf8');

    decoded += decipher.final('utf8');
    return decoded;
}

AESCrypt.encrypt = function(cryptkey, iv, cleardata) {
    var encipher = crypto.createCipheriv('aes-128-cbc', cryptkey, iv);
    var encryptdata  =   encipher.update(cleardata, 'utf8', 'binary');
    encryptdata += encipher.final('binary');
    var encode_encryptdata = new Buffer(encryptdata, 'binary').toString('base64');
    return encode_encryptdata;
}

module.exports = AESCrypt;
## RSACrypt模块
import './shim.js'
import crypto from 'crypto'


var RSACrypt = {};

RSACrypt.decrypt = function( privateKey, encryptdata) {
    let decoded = crypto.privateDecrypt(private_key, es).toString()
    return decoded;
}

RSACrypt.encrypt = function(publicKey, cleardata) {
    let encode_encryptdata = crypto.publicEncrypt(public_key,new Buffer(cleardata))
    return encode_encryptdata;
}

module.exports = RSACrypt;
# 参考
<https://www.jianshu.com/p/da790ff4efb0>

转载于:https://my.oschina.net/rc6688/blog/1795032

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值