想用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. ubuntu 配置 jdk的一些常见问题

    首先下好压缩包.我用的是tar.gz 然后在/usr下解压,用mv或rename修改下文件夹名字,省得名字太长,然后再配置环境变量. so easy. 然而,  接下来你肯定会用 source /et ...

  2. linux文件权限查看及修改(实用)

    查看Linux文件的权限:ls -l 文件名称 查看linux文件夹的权限:ls -ld 文件夹名称(所在目录) 修改文件及文件夹权限: sudo chmod -(代表类型)×××(所有者)×××(组 ...

  3. Javascript中的字典和散列

    function Dictionary() { var items={}; this.set=function (key,value) { items[key]=value; }; this.remo ...

  4. Node聊天程序实例03:chat.js

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. chat.j ...

  5. SCOI2009粉刷匠

    Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...

  6. 报错记录:getOutputStream() has already been called for this response

    仅作记录:参考文章:http://www.blogjava.net/vickzhu/archive/2008/11/03/238337.html 报错信息: java.lang.IllegalStat ...

  7. Find命令的用法

    1. 在某目录下查找文件 [root@localhost ~]# find /usr/local -name pci.ids* /usr/local/share/pci.ids.gz [root@lo ...

  8. css学习记录

    1 !important 表示此属性需要优先考虑: <head>    <title>Page Title</title>    <style type=&q ...

  9. iOS中的数据持久化方式

    iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...

  10. SSH框架总结

    首先,SSH是由多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框架的系统从职责 ...