文档章节

android、ios等客户端与PHP服务端验证登录,加密通讯

e
 ehovel
发布于 2016/02/26 16:27
字数 793
阅读 699
收藏 10

1、准备工作,生成RSA 私钥 公钥

openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem  私钥生成对应的公钥,我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端

2、服务器端 PHP

            require __DIR__.'/ORG/Rsa.class.php';
	    require __DIR__.'/ORG/MagicCrypt.class.php';
	    //RSA私匙解密出公钥加密的AES key
	    $rsaObject  = new \V1\ORG\Rsa();
	    $appkey = $rsaObject->privDecrypt($_POST['rsakey']);
	    $MagicCryptObject  = new \V1\ORG\MagicCrypt();
	    $MagicCryptObject->MagicCrypt($appkey);//用key解密传输数据  
	    $username = $MagicCryptObject->decrypt($_POST['username']);
	    $password = $MagicCryptObject->decrypt($_POST['password']);
	    $qtime = $MagicCryptObject->decrypt($_POST['qtime']);
        if ($qtime - time() > 3600*24) {
            //return
        }
	    $member = $this->member->where('username=?', $username)->select(false);//获取会员
	    
	    if ($member['password'] == md5(md5($password) . $member['salt'] . md5($password))) {//验证会员
	        //生成token,用rsa私钥加密并返回密文  token规则可以自定义
	        $userToken = md5($member['id'].$member['salt'].$appkey);
	        $appAuth['memberid'] = $member['id'];
	        $appAuth['token'] = $userToken;
	        $appAuth['expire'] = time() + 7*24*3600;//7天有效
	        //存储或更新token 可以考虑不同存储  db redis memcached等
	        $appAuthOld = $this->model('member_appauth')->find($member['id']);
	        if ($appAuthOld) {
	            $this->model('member_appauth')->update($appAuth,array('memberid'),'memberid=' . $member['id']);
	        } else {
	            $this->model('member_appauth')->insert($appAuth);
	        }
	        var_dump($userToken);exit;
	    }

客户端PHP 模拟 测试用的

            require __DIR__.'/ORG/Rsa.class.php';
	    require __DIR__.'/ORG/MagicCrypt.class.php';
	    
	    $appkey = 'myandroid-IEMI-20160101-'.date('YmdHis');//随机字符串 AES加密用 可以是根据客户端设备号/安装时间/请求时间等生成
	    $MagicCryptObject  = new \V1\ORG\MagicCrypt();
	    $MagicCryptObject->MagicCrypt($appkey);//用随机密钥加密传输数据  AES rijndael-128
	    $post['username']  = $MagicCryptObject->encrypt('ehovel');
	    $post['password']  = $MagicCryptObject->encrypt('dpx890406???');
	    $post['qtime']  = $MagicCryptObject->encrypt(time());//客户端请求时间 服务端用来判断有效
	    
	    $rsaObject  = new \V1\ORG\Rsa();
	    $rsakey = $rsaObject->pubEncrypt($appkey);//用rsa公钥加密 $key
	    $post['rsakey'] = $rsakey;
	    
	    //模拟请求
	    $url = 'http://www.testlocal.com/index.php?s=sapi&c=user&a=login';
	    $ch = curl_init();
	    curl_setopt($ch, CURLOPT_URL, $url);
	    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	    //curl_setopt($ch, CURLOPT_HEADER, 1);
	    curl_setopt($ch, CURLOPT_POST, 1);
	    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
	    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
	    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
	    $data = curl_exec($ch);
	    $status = curl_getinfo($ch);
	    $errno = curl_errno($ch);
	    curl_close($ch);
	    print_r($data);exit;

客户端 JAVA 

参考实现 未测
BASE64  http://git.oschina.net/ehovel/codes/emkrvbhx8oq7c91s4tp3y
AES  http://git.oschina.net/ehovel/codes/52i4r0zwvkh1cmopngltf
RSA  http://git.oschina.net/ehovel/codes/2915gjp6t8ih4xkenbqof
RSA  http://git.oschina.net/ehovel/codes/kcey6uvrhzl79b4tqpwg5

需要注意的是,在初始化Cipher对象时,一定要指明使用"RSA/ECB/PKCS1Padding"格式如Cipher.getInstance("RSA/ECB/PKCS1Padding");打开rsa_public_key.pem文件,将上面代码的RSA_PUBLICE替换成其中内容即可。

客户端 IOS 

iOS上没有直接处理RSA加密的API,网上说的大多数也是处理X.509的证书的方法来实现,不过X.509证书是带签名的,在php端openssl_pkey_get_private方法获取密钥时,第二个参数需要传签名,而android端实现X.509证书加密解密较为不易,在这里我们利用ios兼容c程序的特点,利用openssl的api实现rsa的加密解密,代码如下:

参考 http://www.lvtao.net/dev/android_ios_php_openssl.html

 

© 著作权归作者所有

共有 人打赏支持
e
粉丝 0
博文 16
码字总数 4088
作品 0
南京
私信 提问
面向对象的 WebAPI 框架 XXL-HEX V1.1.0 发布

新版本 V1.1.0 新特性速览 1、面向对象: 一个API接口对应 "一个Handler" 和 "Requset对象/Response对象"; 针对Web API开发 (如 Android、IOS 等APP接口开发, 或者 unity3d 等游戏接口开发), ...

许雪里
2016/09/16
1K
7
XXL-HEX v1.2.0,面向对象的 WebAPI 框架

版本1.2.0新特性 1、Client端,新增Javascript版本实现:前端JS可使用提供的Client,直接调用XXL-HEX的加密API接口; (示例文件见 "xxl-hex/xxl-hex-example/src/main/webapp/jsclient.html...

许雪里
2016/10/06
1K
0
二手车电商平台项目用户端系统三期建设

【业务需求】 开发IOS及Android版的车辆检测APP。 1.登录验证:提供登录及短信验证,密码找回功能,密码找回需验证码及短信配合。 2.车主登记:登记车主的驾驶证和行驶证信息,提供手工录入及...

wing-hwang
2017/08/09
6
8
恩布企业 IM iOS 客户端 0.9.7 发布

恩布企业 IM 的 iOS 苹果开源手机客户端 EntboostChat 发布 0.9.7 版本。 iOS苹果手机端主要更新内容: 增加IOS手机文件收发功能 增加网络通讯加密,确保信息安全 个人及聊天头像显示优化 修...

akee
2015/04/14
1K
0
Phonegap各类商业插件

【Phonegap商业插件服务】[目前插件已经支持到Phonegap最新版本] 1.phonegap-百度社会化分享-andriod插件 v2.0 【该插件支持微信分享和朋友圈分享,qq好友分享,微博分享】 2.phonegap百度社...

夜澜小雨
2015/07/15
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

tomcat线程模型

Connector结构 BIO模式 NIO模式

grace_233
22分钟前
1
0
Javascript

变量定义 以$,_,字母开头 大小写敏感 var 关键字声明变量 声明未赋值undefined 数据类型 字符串,数字,布尔,数组,NULL,undefined 变量均为对象 函数 无默认值 var声明的是局部变量 函数外声明...

关元
24分钟前
1
0
文件系统、服务、防火墙、SELINUX——安全四大金刚

一提到安全,大家都会想到防火墙,和文件系统权限。而实际工作环境中,我们在Linux的安全配置,会涉及到四个级别。我们思考一个场景,你要在百度盘中存放一个文件,这个动作需要考虑下面四个...

Linux就该这么学
25分钟前
1
0
从源码角度理解Java设计模式——门面模式

一、门面模式介绍 门面模式定义:也叫外观模式,定义了一个访问子系统的接口,除了这个接口以外,不允许其他访问子系统的行为发生。 适用场景:子系统很复杂时,增加一个接口供外部访问。 优...

我叫刘半仙
35分钟前
2
0
新鲜出炉,2019最新大厂面试题总汇!

在这个互联网技术快速迭代的时代,每个程序员都知道技术对于职业发展的重要性,那些技术好的程序员不仅薪资高,而且大多数集中在一线互联网企业工作,让人感觉非常高大上的同时,也想去大厂做...

Java架构资源分享
43分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部