文档章节

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

e
 ehovel
发布于 2016/02/26 16:27
字数 793
阅读 670
收藏 10
点赞 1
评论 0

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
博文 11
码字总数 1677
作品 0
南京
JavaScript(React Native、Node.js等)移动、服务端通吃的全栈语言

作者:李宁老师 东北大学计算机专业硕士。曾任沈阳东软股份项目经理。51CTO学院签约讲师。从事软件研究和开发超过20年。长久以来一直从事Java、Android、iOS、C++、Swift、Objective-C以及跨...

androidguy
06/29
0
0
iOS中DES与MD5加密方案

MD5算法和DES算法是常见的两种加密算法。 MD5:MD5是一种不可逆的加密算法,按我的理解,所谓不可逆,就是不能解密,那么它有什么用的,它的用处大了,大多数的登录功能都会使用到这种算法。...

珲少
2015/04/03
0
0
通信加密方案 - Cryptography Solution

网络通信中的安全问题是我们时刻需要面对的。通信加密是我们非常常用的方法。是一种匿名密钥协商协议,允许双方(每个都具有椭圆曲线公钥 - 私钥对)在不安全的信道上建立共享秘密,使用和。...

loggerg
07/05
0
0
iOS 终于支持了 PWA,一起来认识一下这个强化版「小程序」 | 科普

iOS 终于支持了 PWA,一起来认识一下这个强化版「小程序」 | 科普 发布于 2018-04-13 文章被以下专栏收录

少数派
07/06
0
0
Objective-C 和 Java 下 DES加解密保持一致的方式

最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,登录的密码要用DES加密,服务器是用Java开发的,客户端要同时支持多平台(Android、iOS),在处理iOS的DES加密...

山哥
2012/04/19
0
5
关于“发送原图”功能问题的记录

本文主要记录一个bug从发现、定位到延期解决的过程。文末添加了已踩过的坑 近期在做“发送原图”功能的时候,遇到一个bug:在Android、Windows、Mac 客户端发送原图,iOS客户端接收,保存原图...

si1ence
2017/12/14
0
0
(转)直接拿来用!最火的iOS开源项目(一)

AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目。AFNetworking是一个轻量级的iOS、Mac OS X网络通信类库,现在是GitHub上第三大Objective-C库。它建立在...

孙启超
2013/06/21
0
0
web应用安全check list

首先对本文所指的web应用做一下定义,包含如下两种类型的应用 B/S应用,即browser通过页面超链接/提交表单/ajax和server交互 C/S应用,即ios/android手机应用或者PC应用通过webservice和ser...

fifadxj
2014/04/24
0
0
100%移植阿里云移动测试技术_竟仅需1周?!——移动测试专有云(3)——内容详解

一、自动化测试服务 Android兼容性测试 Android兼容性测试旨在帮助解决Android应用在不同真机机型上的各类兼容性问题,包括 Crash/ANR分析、6项性能分析、UI检测、3个版本的覆盖安装检测等。...

乐乎无趣
2017/11/02
0
0
谷歌Flutter跨平台应用开发SDK迎来首个发行预览版本

谷歌Flutter跨平台应用开发SDK迎来首个发行预览版本 2018-06-22 12:26编辑: 枣泥布丁分类:程序人生来源:程序师 跨平台Google Flutter预览版本 招聘信息: 图像处理及模式识别工程师 C/C+...

枣泥布丁
06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Git 基础 - 远程仓库的使用

远程仓库的使用 要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库。远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写。同他人协作开发某...

谢思华
11分钟前
0
0
面试宝典-悲观锁和乐观锁

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。 乐观锁(Optimistic...

suyain
12分钟前
0
0
崛起于Springboot2.X之集成MongoDb使用mongoTemplate CRUD(27)

1、pom依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version></dependency><dependency> <groupId>log4j</......

木九天
22分钟前
0
0
切分log日志

新建logback.xml放到resource里面 <?xml version="1.0" encoding="utf-8"?><configuration> <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> <......

talen
28分钟前
0
0
spring @Resource 和 @Autowired 的使用区别

这两个 注解 @Resource 和 @Autowired , 常识都知道 @Resource 是 JAVAEE 自带的,@Autowired 是 spring 的自定义注解。 一般情况下, 使用 bean的时候, 这两个注解 随便使用一个即可。 但...

之渊
33分钟前
0
0
springboot集成elasticsearch客户端问题记录

1背景说明 服务端ES版本为5.5.2,springboot版本为1.5.6。 工程中添加如下依赖 2问题记录 2.1 NetworkPlugin类找不到 报错java.lang.ClassNotFoundException: org.elasticsearch.plugins.Net...

zjg23
34分钟前
1
0
快速构建ceph可视化监控系统

前言 ceph的可视化方案很多,本篇介绍的是比较简单的一种方式,并且对包都进行了二次封装,所以能够在极短的时间内构建出一个可视化的监控系统 本系统组件如下: ceph-jewel版本 ceph_expor...

万建宁
35分钟前
0
0
Java构造器使用注意

public class 父类A {int age = 10;protected void say() {System.out.println("父类A");}public 父类A() {override();}public void override() {Syst...

咸鱼AI
35分钟前
0
0
TensorFlow 线性分类

构造直线 z = 2 * x - 3 * y + 4 x0*w0+x1*w1+b=0 x1=-x0* w0/w1-b/w1 斜率 k= -w0/w1 截距 -b/w1 随机生成数据,加入一定的偏差,用直线将二维平面分为两部分 使用线性模型拟合参数 损失函数...

阿豪boy
38分钟前
0
0
翻译冒泡排序测试

翻译一个冒泡排序: var a = [1,3,2,4,6,5];var f = 0;var n = a.length ;for( var i =1; i<= n; i++) { for( var j = n-1 ; j >= i; j --) { if(a[j] < a[j+1]) { ......

钟元OSS
39分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部