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. Yocto开发笔记之《串口驱动调试》(QQ交流群:519230208)

    QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 ======================================================== 串口驱动各 ...

  2. TextView 选择文字

    final CharSequence edit = text2.getText(); text2.setCursorVisible(true); text2.setOnTouchListener(ne ...

  3. Android学习笔记——ListView

    该工程的功能是实现在一个activity中显示一个列表 以下代码是MainActivity.java中的代码 package com.example.listview; import java.uti ...

  4. Json数据可视化

    主要借助JSON.stringfy( value [, replacer] [, space] ). 一.参考文献 1.json数据可视化: http://www.cnblogs.com/lvdaba ...

  5. 适合于图像处理方向的SCI期刊杂志列表【转】

    适合于图像处理方向的SCI期刊杂志列表[转]   表1. 适合于图像处理方向的SCI期刊杂志列表 ISSN 期刊名 出版周期 1057-7149 IEEE TRANSACTIONS ON IMAGE ...

  6. hdu 4006 The kth great number(优先队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006 题目大意: 第一行 输入 n k,后有 n 行,对于每一行有两种状态 ,①“I x” : 插入 ...

  7. Xcode设置

    1. 在Search Paths中设置相对路径 径是以.xcodeproj文件为基准,./表示与.xcodeproj同级,../表示上一级 2. 链接动态链接库 设置链接库,在Build Settin ...

  8. PetaPoco 使用总结(一)

    PetaPoco 使用总结(一) 前段时间,公司的一个项目希望用一个ORM 的框架,通过对比 Dapper 和 PetaPoco ,虽然Dapper 功能很强大,速度更快. 但是最终还是选择了比较简单 ...

  9. 数据库操作事务IsolationLevel 枚举

      成员名称 说明   Chaos 无法覆盖隔离级别更高的事务中的挂起的更改.   ReadCommitted 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复 ...

  10. Saltstack grains组件

    grains是Saltstack最重要的组件之一,grains的作用是收集被控主机的基本信息,这些信息通常都是一些静态的数据,包括CPU.内核.操作系统.虚拟化等,在服务器端可以根据这些信息进行灵活定 ...