想用rn做个RSA(非对称加密)登录

基本流程就是在服务端生成RSA后,将“公钥”发到客户端,然后客户端用“公钥”加密信息发送到服务端,服务务端用私钥解密。

过程不复杂,问题在于,nodejs和rn都准备用js做RSA加密,本来想用node-rsa做的,可是搞不懂它怎么设置公钥加密

于是直接做node-rsa的基础库http://www-cs-students.stanford.edu/~tjw/jsbn/,简单封装了下做了个demo

客户端:

'use strict';
const React = require('react-native'); var url="192.168.1.103:8082" var RSAClient= require('./rsa-client');//客户端rsa加密
var _publicKey = new RSAClient(); //初始化“公钥”
fetch('http://'+url+'/RSA')
.then((response) => response.json())
.then(
(ret) => {
_publicKey.setPublic(ret.n, ret.e);
}
).done(); //“公钥”加密,加密后的数据是hex编码比较长,所以转成base64
var encrypt=function(val){
var hex2b64 = require('./base64').hex2b64;
return hex2b64(_publicKey.encrypt(val));
}; var login=function(data,doSuccess,doError){
fetch('http://'+url+'/login',
{
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
})
.then(function(response) {return response.json();})
.then(
function(resData){
doSuccess(resData);
}
)
.done();
}; var {
View,
Text,
TextInput,
StyleSheet,
TouchableOpacity
} = React; var Index = React.createClass({
getInitialState: function() {
return {
userName: "",
passWord: "",
encrypted:""
};
},
render:function() {
return (
<View style={{borderColor:'#FA6778',
justifyContent: 'center',
flex:1,
}}> <View style={{flex:1}}>
<Text>encrypted = {this.state.encrypted}</Text> <Text>decrypted = {this.state.decrypted}</Text> </View> <View style={{flex:1.2}}>
<View style={styles.singleLine}>
<TextInput autoCapitalize="none"
style={{flex:1, fontSize: 16,padding: 6,borderWidth: 0,textDecorationLine :'none'}}
placeholder="User Name"
onChangeText={(text) =>
{ this.setState({userName:text});}}
value={this.state.userName}
/> </View>
<View style={styles.singleLine}>
<TextInput placeholder="PassWord"
password ={true}
style={{flex:1, fontSize: 16,padding: 6,borderWidth: 0,textDecorationLine :'none'}}
onChangeText={(text) =>
{ this.setState({passWord:text});}}
value={this.state.passWord}
/>
</View> <TouchableOpacity style={styles.btn}
onPress={
()=>
{
let _pwd= encrypt(this.state.passWord);
login(
{userName:this.state.userName,passWord:_pwd},
(retJson) => {
if(1==retJson.loginState){
this.setState({encrypted:retJson.encrypted,decrypted:retJson.decrypted});
}
}); }
}>
<Text style={{
flex: 1,
fontSize: 18,
alignSelf: 'center',
}}>OK</Text>
</TouchableOpacity> </View> <View style={{flex:1}}></View> </View>);
}
}); var styles = StyleSheet.create({
btn: {
alignSelf: 'stretch',
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '#3333FF',
height: 40,
borderRadius: 5,
margin: 8,
padding: 8,
},
singleLine: {
height: 40,
borderWidth: 1,
borderRadius: 5,
borderColor: 'lightblue',
margin: 15,
},
});
module.exports=Index;

服务端:

var Router= require('router'),
http = require('http'),
fs = require('fs'),
path = require('path');
/*
module.id
module.filename
module.loaded
module.parent
module.children
console.log(module);
*/ var router = Router() //**************RSA BEGIN************************
var RSAService = require('./RSAService');
var _key = new RSAService.rsaKey();
_key.generate(384,"10001");
/*
console.log("Generating RSA Key...");
console.log("_key e");
console.log(_key.e.toString(16));
console.log("_key n");
console.log(_key.n.toString(16));
console.log("_key d");
console.log(_key.d.toString(16));
console.log("_key p");
console.log(_key.p.toString(16));
console.log("_key q");
console.log(_key.q.toString(16));
console.log("_key dmp1");
console.log(_key.dmp1.toString(16));
console.log("_key dmq1");
console.log(_key.dmq1.toString(16));
console.log("_key coeff");
console.log(_key.coeff.toString(16));
*/ var hex2b64 = RSAService.hex2b64;
var b64tohex= RSAService.b64tohex; var publicKey={e:_key.e.toString(16),n:_key.n.toString(16)};//公钥 router.get('/RSA',
function (req, res) {
res.setHeader('Content-Type', 'application/json; charset=utf-8') res.write(JSON.stringify(publicKey));
res.end();
}); router.post('/login', function (req, res) {
var _cnt=0;
var body = '';
req.on('data',
function (data) {
body += data;
_cnt++;
// Too much POST data, kill the connection!
// 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
if (body.length > 1e6)
request.connection.destroy();
}); req.on('end',
function () {
// var post = qs.parse(body);
// use post['blah'], etc.
var _state=1,_pwd='';
var _pObj= JSON.parse(body);
if(_pObj.passWord){
try{
_pwd =_key.decrypt(b64tohex(_pObj.passWord));// key.decrypt(_pObj.passWord, 'utf8');
console.log('_pwd: ', _pwd);
}catch(er){
console.log(er);
_state=0;
_pwd="ERROR";
} res.write(JSON.stringify({loginState:_state,encrypted:_pObj.passWord,decrypted:_pwd}));
}
res.end(); console.log('time='+Date.now());
});
}); var server = http.createServer(
function(req, res) {
console.log(req.url);
router(req, res,
function(req,res){});
}); server.listen(
8082, '::',
function () {
console.log('http server listening on port 8082 time='+Date.now() );
});

客户端/服务端 RSA文件http://files.cnblogs.com/files/Grart/rsa.rar

React Native + Nodejs 使用RSA加密登录的更多相关文章

  1. LoadRunner 12 模拟 RSA加密 登录的实现(JS)

    LR 12 中 web_js_run API 非常坑,只能调用一个 JS 文件:更坑的是,不能通用 一个JS调用另外一个JS:(可能有,但在网上找了N个国家,都没有找到!如有,还请朋友告之,谢谢.) ...

  2. RSA加密登录

    1.首先下载前端JS加密框架:jsencrypt 2.后台添加解密帮助类:RSACrypto(参考文章最后) 3.在登录页面先引入jquery.min.js,在引入jsencrypt.min.js 4 ...

  3. app与后台的token、sessionId、RSA加密登录认证与安全解决方案

    一.登录机制 粗略地分析, 登录机制主要分为登录验证.登录保持.登出三个部分.登录验证是指客户端提供用户名和密码,向服务器提出登录请求,服务器判断客户端是否可以登录并向客户端确认. 登录认保持是指客户 ...

  4. React Native 接入微博、微信、QQ 登录功能

    在 App 开发中我们经常需要在用户登录模块接入 SNS 登录组件,这样会大大提高用户的注册体验.特别当一个不是刚性需求 App 推广的时候,这样会很大的降低用户体验的成本,没有人愿意忍受输入邮箱.手 ...

  5. 用户登录密码RSA加密后传输的实现,非明文密码传输

    在用户登录页面,用户输入密码后,在传送到服务器端时,为防止在密码传送过程中,被如360这种东东给拦截到, 需要在传送前对密码进行加密,然后再传送! 利用RSA加密,在客户端使用公钥对密码进行加密,在服 ...

  6. React Native绑定微信分享/登录/支付(演示+实现步骤+注意事项)

    React Native(以下简称RN)绑定微信分享/微信登录/微信支付的实现演示+源码+注意事项!微信的调用大同小异,本文实现了微信的分享功能,其他功能可以在链接文档里面找到具体的方法. 本文分文三 ...

  7. NodeJS笔记(五) 使用React Native 创建第一个 Android APP

    参考:原文地址 几个月前官方推出了快速创建工具包,由于对React Native不熟悉这里直接使用这2个工具包进行创建 1. create-react-native-app(下文简称CRNA): 2. ...

  8. python RSA加密解密及模拟登录cnblog

    1.公开密钥加密 又称非对称加密,需要一对密钥,一个是私人密钥,另一个则是公开密钥.公钥加密的只能私钥解密,用于加密客户上传数据.私钥加密的数据,公钥可以解密,主要用于数字签名.详细介绍可参见维基百科 ...

  9. react native android 上传文件,Nodejs服务端获取上传的文件

    React Native端 使用react-native-image-picker 做出选择图片的操作,选择完成后,直接将图片Post至服务器,保存在服务器的某个地方(保存图片的路径需要公开显示),并 ...

随机推荐

  1. 23.mysql集群(master-master)

    参考: http://blog.csdn.net/mr__fang/article/details/8692480 http://www.2cto.com/database/201201/116756 ...

  2. 元素定义了position:fixed;后怎么居中

    div{ position:fixed; width:1200px; margin:0 auto; top:0; bottom:0; left:0; right:0; }

  3. java中观察者模式Observable和Observer

    25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的 ...

  4. 调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令

    gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...

  5. excle表格生成网页

    用Dreamweaver可以方便生成和excle表格一样的代码. 复制excle,粘贴

  6. SPSS数据分析—二分类Logistic回归模型

    对于分类变量,我们知道通常使用卡方检验,但卡方检验仅能分析因素的作用,无法继续分析其作用大小和方向,并且当因素水平过多时,单元格被划分的越来越细,频数有可能为0,导致结果不准确,最重要的是卡方检验不能 ...

  7. Scrapy爬虫导图(持续完善中)

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.

  8. aliyun source.list

    电信的网络越来越不靠普.ubuntu环境使用下面的source.list deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted un ...

  9. Scala练习(二)

    3.计算指定目录下以".txt"为扩展名的文件个数.注:随便建个目录,建几个.txt文件即可. 4.计算"input_4.txt"文件中搜索词的出现次数,并按次 ...

  10. iOS:使用代理模式监听开关状态改变事件

    记一次解决跨控制器监听开关状态改变的尝试. 为了统一设置UITableViewCell里的内容,自定义了UITableViewCell类的一个基类,命名为SettingCell.SettingCell ...