iOS/Android/Web Url Encode空格處理

原文連結:http://read01.com/3gDO.html

前言 這裡只是講一個故事,一個發生在我身上的真實的故事。曾經,我以為搞加密很簡單,不就是百度幾個加密演算法回來就可以了嗎?百度上一大堆呢,要什麼加密演算法都有,有什麼困難呢?是啊,理論上是可行的,可是,實際上卻有很多的坑,跳了一個又一個,最後才發現大家已經跳進坑裡面了。 這裡所講的故事是關於URL Encode的故事。想想我們iOS原來都是不管三七二十一,都是直接呼叫寫一個URLEncode方法,然後在加密時就encode一下,服務端decode一下就可以了,但是我們要防篡改,使用了sign… 在安卓端,他們直接呼叫URLEncoder.encode(text, encodeType)這樣的函數來進行encode,可是他們這個函數對空格進行encode後,得到的是+號,而不是%20。我們看到在瀏覽器裡空格是轉換成%20的。另外,安卓這個API並不是對所有的特殊字元都進行轉碼,這樣就有問題了…生成sign簽名時,如果都encode了,那麼結果就會不一樣 iOS端Encode問題 在iOS端,我們直接使用系統NSString的API進行轉碼的話,不會對一些比較特殊的字元進行轉碼。系統NSString的轉碼API: 123 [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 這樣並不對特殊的字元,像`、!、:等字元並不會轉碼,那怎麼辦呢?我們通常會自己寫一個API,呼叫C底層的API,可以指定對哪裡特殊字元也轉碼(給NSString擴充套件): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - (NSString *)hyb_URLEncode { NSString *newString = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR(":/?#@!$ &'*+,;="<>%{}|^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding))); if (newString) { return newString; } return self; } 贊助商 這樣就可以對所有特殊字元都轉碼了。而解碼則是非常簡單的,只是對空格進行特殊處理: 1 2 3 4 5 6 7 8 9 10 11 12 - (NSString *)hyb_URLDecode { NSString *input = self; NSMutableString *outputStr = [NSMutableString stringWithString:input]; [outputStr replaceOccurrencesOfString:@"+" withString:@" " options:NSLiteralSearch range:NSMakeRange(0, [outputStr length])]; return [outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; } 在iOS端,對空格轉碼得到%20,對+轉碼得到%2b,但是在服務端和android端對空格轉碼得到的是+,而對+轉碼得到的也是%2b。問題就出在這裡了… 怎麼生成sign 通常的做法是對所有參數按key排序,然後拼接成a=x&b=y…這樣的字元串,然後md5一下。但是如果encode一下,iOS端和安卓端出現不同的結果,那麼服務端拿到以後是可以得到原串的,但是服務端encode一下所得到的結果會不一樣,那麼校驗sign就會失敗。 但是,如果不對每個value進行轉碼,在服務端就無法通過&來分割了,因為value中有&時,若不轉碼就會出問題,因此encode是必須的。 如何解決 生成sign時,是遍歷所有的key-value,然後拼接,最後md5。那麼,生成sign時,我們只要不對value進行encode,而其他上傳的參數值都encode,這樣就可以解決我們的問題了。 解決方案: 生成sign時,遍歷parameters,對每個value都不進行encode,直接拼接然後md5(前提是一定要Asc或者Desc排序一下)。 而其他參數在拼接時,就正常使用encode,一切就可以解決了!

原文連結:http://read01.com/3gDO.html

iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html的更多相关文章

  1. 仿微信的IM聊天时间显示格式(含iOS/Android/Web实现)[图文+源码]

    本文为原创分享,转载请注明出处. 1.引言 即时通讯IM应用中的聊天消息时间显示是个再常见不过的需求,现在都讲究用户体验,所以时间显示再也不能像传统软件一样简单粗地暴显示成“年/月/日 时:分:秒”这 ...

  2. Lottie在手,动画我有:ios/Android/Web三端复杂帧动画解决方案

      为什么需要Lottie 在相对复杂的移动端应用中,我们可能会需要使用到复杂的帧动画.例如: 刚进入APP时候可能会看到的入场小动画,带来愉悦的视觉享受 许多Icon的互动变化比较复杂多变的时候,研 ...

  3. WEB通知和React Native之即时通讯(iOS Android)

    WEB通知和React Native之即时通讯(iOS Android) 一,需求分析 1.1,允许服务器主动发送信息给客户端,客户端能监听到并且能接收. 1.2,为了方便同一个系统内的用户可以指定某 ...

  4. React Native之配置URL Scheme(iOS Android)

    React Native之配置URL Scheme(iOS Android) 一,需求分析 1.1,需要在网站中打开/唤起app,或其他app中打开app,则需要设置URL Scheme.比如微信的是 ...

  5. ios访问web页面<div>点击事件不起效果,以及alert()显示url的解决办法

    ios访问web页面<div>点击不起效果,在其div上添加style=”cursor:pointer:“ jquery web页面动态append()事件调用方法:$(document) ...

  6. ios Url Encode

    //ios Url Encode //有时候在请求的参数里里特殊符号比如“+”等.而如果没有encode的话那么传过去的还是” ”,面实际上是%2B. -(NSString*)UrlValueEnco ...

  7. Android vs iOS vs Web

    Android vs iOS vs Web UI view Android ViewGroup ImageView TextView iOS UIView ImageView TextView Web ...

  8. 在Android、iOS、Web多平台使用AppGallery Connect性能管理服务

    性能管理(App Performance Management,简称APM)是华为应用市场AppGallery Connect(简称AGC)质量系列服务中的其中一项,可以提供分钟级应用性能监控能力,支 ...

  9. 微软云平台媒体服务实践系列 1- 使用静态封装为iOS, Android 设备实现点播(VoD)方案

    微软的云平台媒体服务为流媒体服务提供了多种选择,在使用流媒体服务为企业做流媒体方案时,首先需要确认要流媒体接收目标,如针对广大iOS, Android移动设备,由于它们都支持HLS 格式的流媒体,基于 ...

随机推荐

  1. DS18B20函数库建立实验

    1.主代码: /* 温度传感器  */#include "DS18B20.h"#include"def.h"u16 get_temp (void){    fl ...

  2. easyUI数据表格datagrid之笔记

    1.用ajax获取数据库数据 /**========================================= * 读取数据库信息,使用ajax的load方法 */function getMe ...

  3. 中缀表达式转后缀表达式(用于求字符串表达式值)(js栈和队列的实现是通过数组的push和unshift方法插值,pop方法取值)

    中缀表达式:就是我通常用的算术或逻辑公式: 后缀表达式:不包含括号,运算符放在两个运算对象后面,所有的计算按运算符出现的顺序,严格从左向右进行,不用考虑运算符优先级: 如,(2+1)*3 转换后,2 ...

  4. ubuntu分区

    参考网址:http://jingyan.baidu.com/article/60ccbceb18624464cab197ea.html

  5. typedef和#define的用法与区别

    typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程 ...

  6. 如何在Mac OSX 10.10上安装GDB

    http://ntraft.com/installing-gdb-on-os-x-mavericks/

  7. 最好用的placeholder插件,jQuery插件EnPlaceholder

    EnPlaceholder插件支持密码框哦!实际对比同类的placeholder插件在ie等浏览器下效果做好! 插件效果预览:http://www.wufangbo.com/demo/jquery/3 ...

  8. 从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构

    Microsoft.AspNet.Identity简介 Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的mem ...

  9. mvn filter autoconfig 产生自动配置

    可以使用filter, 也可以使用autoconfig 详细请见 http://www.openwebx.org/docs/autoconfig.html

  10. php函数mt_rand和rand 速度测试

    今天在写代码时,看到以前的同时写了一个取随机数,用到了mt_rand(2,19) 就顺手搜了一下,mt_rand和rand的区别. 先看官方的解释 mt_rand 和 rand mt_rand — 生 ...