NSMutableURLRequest POST 消息中的 Base64 问题?

2024-01-01

我的应用程序和服务器之间存在通信问题。我使用 RNCryptor 来加密消息,然后对其进行 Base64 编码并在请求中传输到服务器。这是在 DATA 标头和 http 正文中作为发布数据完成的。我认为我在通过 POST 转换和传输 Base64 编码消息的方式上犯了错误。

如果我通过标头收到加密消息,它每次都会完美解密。但是,如果我通过 POST 数据获取消息,我会得到不同的结果。大多数时候,它会失败,否则它会部分解密(前几个字母),大约有二十分之一成功解密。

Objective-C 代码是:

- (NSString *)sendEncryptedTestMessage:(NSString *)address{
    NSString* messageContent    = @"Hello my name is Bob.";
    NSError * error             = nil;
    NSString* responseString2   = nil;

    NSData*   postData = [RNEncryptor encryptData:[messageContent dataUsingEncoding:NSUTF8StringEncoding]
                                    withSettings:kRNCryptorAES256Settings
                                        password:@"123456"
                                           error:&error];

    NSString* messageServer     = [NSString base64forData:postData];
    NSString* postMessage       = [@"message=" stringByAppendingString:messageServer];
              postData          = [postMessage dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; // problem here I think

    NSString* postLength        = [NSString stringWithFormat:@"%ld",(unsigned long)[postData length]];

    NSURL*    URLToRequest      = [NSURL URLWithString:address];

    NSMutableURLRequest* semisystem = [[[NSMutableURLRequest alloc] initWithURL:URLToRequest] autorelease];

    [semisystem setHTTPMethod:@"POST"];

    [semisystem setHTTPBody:postData];
    [semisystem setValue:postLength                           forHTTPHeaderField:@"Content-Length"];
    [semisystem setValue:self.activationURL                   forHTTPHeaderField:@"EncryptionKey"];
    [semisystem setValue:messageServer                        forHTTPHeaderField:@"data"];

    NSURLResponse* response;
    NSData* data = [NSURLConnection sendSynchronousRequest:semisystem
                                         returningResponse:&response
                                                     error:&error];

    responseString2 = [NSString stringWithFormat:@"%.*s", (int)[data length], [data bytes]];
    return responseString2;
}

PHP代码:

function decrypt2($b64_data,$password)
    {
           // back to binary
            //$bin_data = mb_convert_encoding($b64_data, "UTF-8", "BASE64");
            $bin_data = base64_decode($b64_data);
            // extract salt
            $salt = substr($bin_data, 2, 8);
            // extract HMAC salt
            $hmac_salt = substr($bin_data, 10, 8);
            // extract IV
            $iv = substr($bin_data, 18, 16);
            // extract data
            $data = substr($bin_data, 34, strlen($bin_data) - 34 - 32);
            $dataWithoutHMAC = chr(2).chr(1).$salt.$hmac_salt.$iv.$data;
            // extract HMAC
            $hmac = substr($bin_data, strlen($bin_data) - 32);
            // make HMAC key
            $hmac_key = pbkdf2('SHA1', $password, $hmac_salt, 10000, 32, true);
            // make HMAC hash
            $hmac_hash = hash_hmac('sha256', $dataWithoutHMAC , $hmac_key, true);
            // check if HMAC hash matches HMAC
            if($hmac_hash != $hmac) {
                echo "HMAC mismatch".$nl.$nl.$nl;
               // return false;
            }
            // make data key
            $key = pbkdf2('SHA1', $password, $salt, 10000, 32, true);
            // decrypt
            $ret = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);      
        return $ret;
    }
$passkey = "123456";

$messageBase64                  = $_POST['message'];// THIS barely works
$messageBase64              = $_SERVER['HTTP_DATA'];// THIS WORKS
$message                = decrypt2($messageBase64,$passkey);

提前谢谢了!


我知道这是一个老问题,但很长一段时间我都使用相同的解决方案,问题是我们在向服务器发出请求之前没有正确编码 url。文档说:

  According to RFC 3986, the reserved characters in a URL are:
  reserved    = gen-delims / sub-delims
  gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

以下是如何对字符串进行编码:/

CFStringRef encodedString =
    CFURLCreateStringByAddingPercentEscapes(
    kCFAllocatorDefault,
    (__bridge CFStringRef)(originalString),
    NULL,
    CFSTR(":/?#[]@!$&'()*+,;="),kCFStringEncodingUTF8);

并再次获取字符串:

    NSString* stringEncoded = CFBridgingRelease
   (CFURLCreateWithString(kCFAllocatorDefault, encodedString, NULL));

我认为这是我们能做的最好的事情,因为我们确保字符串被正确编码,并且在请求期间符号不会被其他东西替换。 这是参考资料:

http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFURLRef/Reference/reference.html#//apple_ref/c/func/CFURLCreateStringByAddingPercentEscapes http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFURLRef/Reference/reference.html#//apple_ref/c/func/CFURLCreateStringByAddingPercentEscapes

http://developer.apple.com/library/ios/#documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/WorkingWithHTTPAndHTTPSRequests/WorkingWithHTTPAndHTTPSRequests.html http://developer.apple.com/library/ios/#documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/WorkingWithHTTPAndHTTPSRequests/WorkingWithHTTPAndHTTPSRequests.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSMutableURLRequest POST 消息中的 Base64 问题? 的相关文章

  • Objective-C 继承中@synthesize/@property 的使用

    如果您有一个带有实例变量 foo 的类 A 该类具有 property synthesize 指令 并且类 B 继承自类 A 那么它是否还需要 property synthesize foo 我问的原因是因为当我尝试使用 B 类的 foo
  • UIImage initWithContentsOfFile 不起作用

    我有问题 我想避免 UIImage imageNamed 所以我做了 UIImage prodImg UIImage alloc initWithContentsOfFile myimage png controller productIm
  • 如何获取未知大小 NSArray 的前 X 个元素?

    在 ObjectiveC 中我有一个 NSArray 我们称之为NSArray largeArray 我想要一个新的NSArray smallArray仅包含前 x 个对象 或者如果largeArray 的大小已经 这种方法 NSArray
  • 从 CocoaPods 添加 pod 时,架构 x86_64 的重复符号

    我正在尝试使用谷歌分析 https developers google com analytics devguides collection ios v3 进入我的应用程序 但通过 CocoaPod 添加后立即收到此错误 以前我的 Pod
  • 如何在 UILabel.text 中添加制表符空间

    我有一个 UILabel 实例 比如 mylabel 我想做的是这样的 mylabel text Age tLimit tYear instead of mylabel text Age Limit Year 但当我尝试时 t 未被识别 如
  • 使用 Objective-C 将 HTML 文本转换为纯文本

    我有巨大的NSString里面有 HTML 文本 该字符串的长度超过 3 500 000 个字符 我怎样才能将此 HTML 文本转换为NSString里面有纯文本 我正在使用扫描仪 但它运行速度太慢 任何想法 这取决于您的目标 iOS 版本
  • 将 NSDecimalNumber 转换为 NSString

    我正在从如下所示的对象中检索密钥 po obj TypeID 3 TypeName Asset 键值的检索方式如下 NSString typeId NSString obj objectForKey TypeID typeId 不是 NSS
  • 在 xcode 中使用线程调用函数

    我在 xcode 中创建了一个线程 并且给出了从该线程调用的函数名称 但我的问题是 给 call 的函数名称没有被调用 知道何时在该函数中放置断点 code NSThread myThread myThread start self per
  • iOS App Today 扩展未上传到物理设备

    我正在为我的应用程序创建一个今日小部件http budgt ch http budgt ch因为一些用户要求快速访问关键功能 初步 扩展在 iOS 模拟器上运行良好 安装如下 1 安装最新的容器应用程序 2 安装以 今天 为容器的扩展 但是
  • 最近打开的应用程序[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有什么方法可以获取最近打开的应用程序 例如 4 个 的列表吗 如果是这样 怎么办 可可麦克 看看LaunchServices LSSh
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • 使用 iPhone 中的地图视图读取当前位置名称

    我读取了当前位置的纬度和经度值 然后成功将该位置固定在 iPhone 中 现在我想使用这个纬度和经度值读取该地名 我使用以下代码来读取查找当前位置 void mapView MKMapView mapView1 didUpdateUserL
  • 在横向中自动调整 UITableCells 内容的大小

    在 UITableView 中 我通过 UILabels 将内容添加到单元格中 定义最佳尺寸 与单元格宽度允许的一样大 我注意到只有tableView contentSize width是可靠的 因为cell contentView bou
  • 如何知道我的应用程序使用了多少 iCloud 空间?

    有没有办法查看我的应用程序正在备份到 iCloud 的内容以及它消耗了多少内存 Settings gt iCloud gt Storage Backup gt Manage Storage将显示正在备份的总计内容 iOS 会备份位于应用程序
  • 导入 RNCryptor 后架构 armv7 的未定义符号

    我导入了 RNCryptor 可以在这里找到 https github com rnapier RNCryptor https github com rnapier RNCryptor进入我的应用程序 但是 我在日志中收到了三个错误 Und
  • 在 OS X 上创建和使用静态库

    好的 我正在尝试创建一个 Cocoa 库 静态 并使用 但我不断收到错误 我创建了一个超基本的静态库 TSXLib 其中仅包含一个额外的类 import
  • 如何将 UILabel 的值绑定到实例变量?

    我是 mac objective c 的新手 我的问题是 我想知道是否可以将 UILabel 文本绑定到变量 而不必在值更改时手动设置文本 例如 在 Mac OS 上 当我打开新的 Finder 窗口并删除文件时 任务栏中的全局可用空间就会
  • 在 iOS 上将 NSString 转换为 NSDate 的正确方法?

    我一直在使用此方法将常规 NSString 对象转换为 NSDate 但尝试向 Apple 提交更新 但遭到拒绝 在 iOS 中还有什么其他方法可以做到这一点 NSString date str 2011 08 12T12 20 00Z N
  • UIPanGestureRecognizer 对坐标的限制

    我在主 UIView 中添加了一个子视图 称为panel 并且我向其中添加了gestureRecognizer 因为我希望它只能在Y轴上拖动并且只能在某些限制下 即160 300 超过300它不能拖动 我以这种方式实现了手势处理 IBAct
  • 水平 UICollectionView 单行布局

    我正在尝试使用以下命令设置简单的水平布局UICollectionView 兜圈子却没有达到预期的结果 所以任何指针或例子将不胜感激 我粘贴经常更改的代码但没有成功可能没什么意义 该图像显示两行 第一行是单个项目 尺寸正确并且在中心正确对齐

随机推荐

  • PySpark DataFrame:自定义爆炸函数

    如何使用udfs实现自定义爆炸功能 以便我们可以获得有关项目的额外信息 例如 除了项目之外 我还想要项目的索引 我不知道该怎么做的部分是当 udf 返回多个值时 我们应该将这些值放置为单独的行 如果您需要自定义爆炸函数 那么您需要编写获取数
  • 如何在此处地图中实现当前位置蓝色图标

    我正在与这里是地图SDK https developer here com mobile sdks documentation android starter topics maps html我需要为当前位置显示一个带有圆形动画的蓝色图标
  • 如何将远程调试器附加到 Python 进程?

    我厌倦了插入 import pdb pdb set trace 写入我的Python程序并通过控制台进行调试 如何连接远程调试器并从文明的用户界面插入断点 use Winpdb http winpdb org 它是一个平台无关图形化 GPL
  • 根据属性计算类的实例

    计算特定属性值的实例数 我创建了一个类 名称为 bird 该类的每个实例都有两个属性 creed 可以是 C or D 值 以及 life 从值 100 开始 并随着程序执行而改变 该程序模拟两只活鸟的随机遭遇 鸟改变了life每次相遇之后
  • 在 VB.NET 中检查使用 process.start() 启动的文件中的更改

    我正在开发一个基于 vbnet c NET 的应用程序 它可以使用不同的应用程序 excel word 等 打开文件 该应用程序是使用启动的Dim app As Process Process Start ProcessProperties
  • 将 Excel 文件加载到 numpy 二维数组中

    有没有更简单的方法将 Excel 文件直接加载到 Numpy 数组中 我看过numpy genfromtxtnumpy 文档中的自动加载功能 但它不直接加载 excel 文件 array np genfromtxt Stats xlsx V
  • C# 到 Mono GetConsoleWindow 异常

    我在将应用程序设置为单声道时遇到一些问题 它给了我一个 GetConsoleWindow 异常 我认为当你在 Windows 上运行它时 这会打开一个新窗口 但在 Mono 中 在带有 Gnome 的 CentOS 6 上 它给了我这个例外
  • 错误 NoMethodError:ActionView::Base:Class 的未定义方法 `debug_rjs='

    该项目是使用 Rails 3 0 9 构建的 现在我更新了 gems 和 Gemfile gt source http rubygems org gem rails 3 1 1 Bundle edge Rails instead gem r
  • java:是否有一个框架允许动态加载和卸载jar(但不是osgi)?

    我想要一种机制 允许动态加载和卸载 jar 以及调用 jar 中的激活器类 我不想使用 OSGi 因为它的导入 导出机制很麻烦 有一个项目叫做Java插件框架 http jpf sourceforge net 这可能就是您正在寻找的 在他们
  • Spring Webflux上传大图像文件并使用WebClient以流方式发送文件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 spring webflux 功能风格 我想创建一个接受大图像文件的端点 并使用 webClient 以流方式将该文件发送
  • 使用 z 索引的事件冒泡

    JSFiddle https jsfiddle net uLap7yeq 19 https jsfiddle net uLap7yeq 19 Problem 考虑两个元素 canvas 和 div 它们位于相同的树深度上并且具有相同的父元素
  • 如何使用 google auth 区分 firebase 中的登录和注册用户?

    我正在使用 firebase 来验证用户身份 如果新用户使用google facebook提供商登录 它会创建一个用户并自动登录 用户登录后 如何区分signIn和signUp var provider new firebase auth
  • Django 模板中的注释值

    是否可以访问模板中查询集的注释值 例如 我有以下查询集传递给我的模板 context videos Videos objects annotate view count Count views order by view count 100
  • 使用 POST 请求触发 Github 操作(Github REST API)

    我有一个托管在 GitHub 组织中的私有 GitHub 存储库 该存储库包含一个 GitHub Action 其中包含workflow dispatch选项 参见GitHub 文档 https docs github com en act
  • tabHost 的 setCurrentTab

    我问我们是否可以从另一个类 而不是包含 tabhost 和 tabspecs 的类 调用 tabhost 上的 setCurrentTab 我们可以把 tabHost setCurrentTab 1 在除此之外的另一类中 public cl
  • 当前位置返回 0

    我正在开发的 Xcode 应用程序需要获取用户 iOS 设备的纬度和经度 虽然目前我得到的两个值都是 0 它不需要获得该位置的许可 而且我使用的是真实设备而不是模拟器 NSLocationAlwaysUsageDescription在我的
  • UIPageViewControllerDatasource 调用向左滑动和向右滑动方法

    If viewControllerBeforeViewController viewControllerAfterViewController任一方法都返回 nil 计数器部分也会被调用 这种行为是预期行为吗 无论如何我都可以阻止这件事发生
  • 如何在应用程序中使用 Flurry?

    我想在我的应用程序中使用 flurry 及其功能 我如何在 flurry 中注册自己以及如何在我的 Android 应用程序中使用它 Thanks 其实很简单 1 前往 flurry com 并注册您的应用程序 这将生成一个唯一的跟踪代码
  • 程序生成 3000 个正方形

    我需要构建一个包含 3000 个正方形的小部件 手动执行此操作会花费很长时间 也许你们中的一些人知道生成 square 类 3000 次的最简单方法 我还需要能够改变每个方块的内容 例如颜色 标题等 谢谢朋友 div class squar
  • NSMutableURLRequest POST 消息中的 Base64 问题?

    我的应用程序和服务器之间存在通信问题 我使用 RNCryptor 来加密消息 然后对其进行 Base64 编码并在请求中传输到服务器 这是在 DATA 标头和 http 正文中作为发布数据完成的 我认为我在通过 POST 转换和传输 Bas