Tag: 网络

强制–一个比认证更大的问题

认证的技术解决方案与权力结构的政治滥用正交 在发布iPhone X之前,已经对FaceID对专制政府的安全价值进行了一些评估,并评估了它的实际安全性(事实证明是相当安全的)。 在宣布FaceID身份验证机制时,似乎有必要解决对安全威胁的错误理解。 尤其令人沮丧的是,人们对强制在不同级别如何工作以及为什么“威权政权”的险恶威胁无法适用于身份验证机制安全的不良威胁模型感到困惑。 人们普遍问“这种技术将如何使威权政权滥用”,但是人们提出了这个问题,他们选择烦恼的技术,以及他们用来构建威胁模型的幻想逻辑,都需要现实的冷水。 您无法用技术 解决社会问题 您的威胁模型是错误的……没有……是更多错误的了。 很少有人会面对民族国家的对手(对不起西方的隐私权主义者,您不在任何人的视野之内。)尽管如此,大多数这样做的人都明确签署了协议(外国服务部门,情报部门,恐怖组织,跨国犯罪集团),有些只是落入其中(持不同政见者)。 前者很好,他们有玩游戏的资源和专业知识。 后一组通常没有。 他们缺乏安全培训,安全经验(尽管他们很难获得安全经验),并且基本上无法获得安全援助。 他们通常使用可用的平台进行组织,协调和消息传递(请参阅:Facebook,Facebook,Twitter等其他社交媒体平台以及带有Facebook的手机。) 持不同政见者团体使用Facebook的原因非常重要(除了梅特卡夫定律之外): 曝光 -持不同政见者群体必须是可见的且公开的,否则,不仅他们无法接触到目标受众,而且冒着被标记为恐怖分子的风险(因此,大多数隐蔽的通信技术非常适合他们-他们需要广告牌和宣传单,而不是当然,每个人都应该(并且需要)安全的临时通信保密性。 扩张 -没有增长的持不同政见者群体正在消亡。 组织必须坚持下去,而且自然流失(即使没有被死刑队追捕,例如Raqqa被无声地屠杀)。人们失去了兴趣,工作受到阻碍,优先级发生变化,等等。坚持并保持不变的规模,组织必须不断招募新成员(至少与休假人数一样。)对于希望实现变革的异见团体,他们需要招募的新成员多于休假。 接触与扩展的结合意味着通常,持不同政见者必须承担该政权的秘密警察进入其行列的风险(有110年历史的秘密警察手册在其中)。 持不同政见者意味着接受风险,并试图将机芯发展到足够大的程度,以至于它可以迫使变化(从而消除这种风险)。 持不同政见者-他们的力量是数字,他们的安全是可见性。 持不同政见者是Facebook和YouTube,其加密货币是TLS 赋予异议人士和异议团体权力的技术几乎总是会成为Facebook(以及Twitter,WhatsApp或任何占主导地位的地区的使者[见:梅特卡夫定律])。 持不同政见者的安全来自于公众的注意,可以保护他们免遭秘密报复。 当秘密警察对持不同政见的团体采取行动时,这些个人将面临国家一级的胁迫。 他们将在独自旅行时消失。 他们将在警察拘留期间自杀,“ 以使警察难堪 。”他们将自己抛弃在高楼大厦上, 而不是当面抓捕 -无法进行尸体解剖,他们的尸体在24小时内如常被火化。 可以肯定的是,他们会在头部后方开枪两次自杀。 如果他们在秘密警察的报复中存活足够长的时间,他们将入狱数十年…… 被俘虏的持不同政见者的通常目标是保持沉默24-48小时,时间长得足以使他们的战友逃脱。 如果有关于拘留的法律,可能会“遭受酷刑7天,或监禁30年。” 持不同政见者不会在任何时候想到“如果只有我的手机受到身份验证机制的保护,而该机制无法通过肉体强迫我违反我的意愿而受到欺骗。”在许多情况下,胁迫就像父母告诉孩子一样。去他们的房间。 实力较弱的政党只会合作。 强者尽其所能,弱者尽其所能。 安全技术并非没有目的或用途 技术的作用肯定有一个地方可以帮助保护异议人士,例如更好地保护他们的Facebook帐户,使用Tor的某些功能以及更好的移动电话保护功能,以防止数据被盗用和帐户被接管。 但是安全技术援助异议人士的能力必须应付这样一个事实,即一些异议人士将与安全部队合作,而另一些将成为安全部队的代理。 从字面上看,移动电话的身份验证机制是异议者数字生活中最不重要的领域,需要加以保护。 关于iPhone FaceID的最愚蠢的做法之一是,它将使专制政权滥用人权。 这种荒谬的见解表明,对独裁政权的认识极度缺乏。 这是一种幻想想法,其根源在于政治问题具有技术解决方案的信念,然后错误地将其应用于技术堆栈的错误部分。 持不同政见者在威权国家面临的风险将无法通过手机认证机制解决。 强迫某人解锁设备的功能是非常通用的功能,锁的细节无关紧要。 例如,当您到达美国边境时,警官说“解锁手机”时,您要么遵守,要么不遵守。 您的手机是否被32字符密码,FaceID或四位数PIN锁定的细节完全无关紧要。 ¹ [1]是的,在某些时候,关于生物识别技术与PIN /密码的法律问题在美国有时是相关的,但它们与威权政权从未相关。 […]

为什么我们放弃传统的iOS网络

在开始讨论之前,我将先声明免责声明:这不是您的典型的I-a-a-fant-new-thing科技博客,具有非典型,晦涩的图案。 不,这是一篇有关采用常见的基本范式并将其应用于我们以前可能从未想到过的地方的文章,或者更准确地说,是在我们忘记了它们与之相关的地方。 软件产品往往会经历总结能力成熟度模型的相同阶段,转化为软件开发。 我们通常会坚持不懈地进行尝试并进行创新。 这是因为我们不想浪费时间和金钱来为尚未得到的答案过度设计解决方案。 我们希望将精力集中在发明新事物上,因此我们会避免为重新发明轮子做任何努力。 在我开发和制造的所有移动产品中,其中一个轮子始终存在: 网络。 在MINDBODY,我们已经维护和扩展了许多不同的移动产品超过四年。 同样,大多数软件产品具有相同的根源,我们的移动应用程序也不例外。 根据年龄的不同,每种产品在某种程度上都很大程度上依赖于许多人认为是事实上的开源网络库: AF网络 Alamofire MKNetworkKit 这些功能强大且受社区支持的第三方可解决任何Cocoa开发人员的大部分联网问题-Cocoa HTTP库的全地形轮胎。 但是,我们是一家企业,以此类推完整的圆圈,不能在Peterbilt上打一堆全地形轮胎并且期望行驶很远。 多年来,我们一直在不断改进这些常见要求: 将具有不同范例和传输格式的多个API整合到一个网络会话中的能力。 在单个会话中应用不同级别的授权和其他一次性装饰的能力。 具有满足以上两个要求的具有不同主机/客户端配置的多个会话的能力。 最重要的是,我们渴望拥有SOLID基础。 建立一个全新的网络层听起来很昂贵,冒险且彻头彻尾,这在很大程度上缩小了故障间隔。 最终,这意味着我们需要从以下两个问题的明确答案入手: 我们如何设计新车轮,以及如何将东西砸在行驶的汽车上? 设计车轮 曾经有人告诉我,“只有在第三次失败之后,新架构才能成功。”作为坚定地支持这一说法的人,我将转变话题,并略谈一下Node.js。 为什么选择Node.js? 不,我不会开始赞扬JavaScript及其动态的,松散类型的,嵌套回调的荣耀。 Node.js如此流行的原因是容易和简单,通常要付出代价。 但是在某些情况下,语言和平台为出色的模式提供了基础。 在我们的案例中,我们决定招待Express.js及其中间件模式的实现。 没有花哨的全局请求管理器到处都是路由规则,序列化模式,全局请求标头,过于简化的嵌入式授权机制,缓存策略等; 没有请求操作会承担太多责任,无法尝试使摆锤向模块化方向摆动太远; 无需花三个小时阅读有关所有工作原理的文档。 网络管道架构 当简化为体系结构时,我们发现针对任何给定请求有四个主要参与者: 管道 中间件的集合 请求 响应 在我们的Swift实现中, 会话与请求管道同义。 管道中显示的任何更改或全局行为将影响该会话内的所有请求。 会话客户端使用提供的URLSessionConfiguration管理单个管道,并且它直接接受URLRequests作为输入。 这意味着,网络架构是Apple网络库之上非常薄的一层 。 客户端只是简单地通过串行队列来收集请求,通过提供的中间件链来处理它们(每个请求可以不同),最后将它们传输到URLSession。 这满足了我们的第一个要求。 中间件范式 中间件组件具有基于具体实现的职责范围,但是它们都可以做三件事: 修改请求 冻结/清空输出管道 用错误使响应短路 中间件被定义为一个简单的协议,并且可以从任何地方定义和注入自定义中间件。 […]

使用网络链接调节器实用程序

通过iOS和macOS上的Network Link Conditioner,您可以在网络条件下测试应用程序,例如用户在使用应用程序时可能遇到的情况。 它允许您模拟网络条件,例如3G,边缘或高延迟DNS。 在iOS上使用网络链接调节器 您可以在iOS的“设置”应用程序的开发人员页面中找到“网络”部分。 除了启用多路径网络,您还可以导航到默认情况下禁用的网络链接调节器。 您可以在此处阅读有关多路径网络的更多信息。 可以在“网络链接调节器”页面上找到默认预设的列表。 您可以通过点击其中之一来选择预设。 启用该开关,以在所选预设上测试您的应用。 可以通过导航到“ Add a profile页面来定义适合您需求的自定义预设。 在MacOS上使用网络链接调节器 在MacOS上使用该实用程序之前,您需要为当前Xcode版本安装其他工具。 通过导航到Xcode Main Menu > Open Developer Tool > More Developers Tools您可以在登录后下载这些工具。 在下载的.dmg内,您可以找到许多有趣的实用程序。 可以在“ Hardware文件夹中找到“网络链接调节器”。 通过双击该应用程序,您可以在“系统偏好设置”中安装该实用程序。 该应用程序与iOS版本非常相似,还包含一系列自定义预设。 这些可用于模拟一系列网络条件。 除此之外,您还可以在“ Manage Profiles页面中定义自己的预设。 选择预设并启用开关后,您可以在仿真网络预设的同时开始在模拟器中测试Mac OS应用或iOS应用。 这个故事最初发布在: https://www.avanderlee.com/debugging/network-link-conditioner-utility/

使用Moya 101进行测试

Moya非常谨慎,以确保测试是小菜一碟。 但是,据某些人称,其测试文档有些分散。 因此,我决定写这篇文章,重点是与Moya进行测试。 我将尝试从Moya的文档中收集到的所有问题以及我自己的贡献来回答这里提出的所有问题。 最终,本文可以用作编写更认真的文档的起点¹。 在我们开始之前:我将假设您… 已经知道如何使用Moya。 如果没有,跳进去,很有趣! 有自己的TargetType 。 我将其称为APIService 。 不要指望本文教给您有关测试的知识。 我也不是高手。 知道(或可以理解)XCTest的一些非常基础的知识。 我选择的是……因为™ 。 准备? 存根 如您所知,在创建APIService时,需要为所有目标提供APIService 。 存入电话时将使用此数据。 但是,显然,如果没有您的明确要求,就不会发生这种替换。 您只需要很好地要求: ¹我实际上要敢于在非我的库中编写文档,然后等待有关本文的一些反馈。 我不是很精通它,或者在测试中。 但我渴望提供帮助。 期待着听到您的意见!

监控iOS HTTPS网络流量

为了探索Apple的“查找我的朋友” API,我被引导监视来自我的iPhone 6s的网络请求,并实际上找到一些相当有趣的响应。 对于本指南,我已使用Mac OSX和iPhone 6s的Charles应用程序,尽管本指南和Charles应用程序可以应用于任何其他OS和硬件。 使用说明 步骤1:下载 在https://www.charlesproxy.com/cn/download/上下载副本并安装在您的计算机上。 请注意,此应用程序的价格为50美元(包括4个许可),但可以免费试用30天。 首次运行时,您将开始看到SSL请求以其加密形式发送,我们将需要对自己执行SSL“中间人攻击”以查看未加密的数据 步骤2:在Mac上安装根证书颁发机构(CA) 去: 帮助> SSL代理>保存Charles Root证书 双击安装证书,这将打开“钥匙串访问”,然后搜索“ Charles Proxy CA”,右键单击证书>“获取信息”,打开“信任”菜单,然后从下拉列表中选择“使用此证书时”为“永远信任”。 返回到Charles App并转到菜单 代理> SSL代理设置… 将主机“ *”和端口“ *”添加到“位置”列表。 确保重新启动浏览器 ,使其现在使用新的根证书。 这将允许您监视Charles在计算机上的SSL请求! 步骤3:设定手机 您将需要通过电子邮件将上面保存的证书发送到iOS设备上的有效电子邮件帐户, 并使用Apple Mail App(不幸的是,未安装Safari中建议的http://chls.pro/ssl不会安装证书)。 单击电子邮件中的附加证书,然后将显示以下视图,安装配置文件: 接下来,找出您计算机的IP(将在网络设置中),并确保您的iOS和台式机计算机设备都连接到同一网络,然后导航到 设置应用> Wi-Fi> WifiName设置> HTTP代理>手动 然后输入服务器:10.xxx(在上面找到计算机的本地地址)和端口:8888 然后回到Charles App并在弹出窗口中单击“允许”以寻求许可 现在,您应该看到来自设备的请求!

输入安全网络层2.0

有很多关于使用Swift以安全类型进行网络层的文章。 无论使用哪种网络API,这些方法都依赖于返回正是我们期望的数据类型。 这个想法是利用Swift的类型推断/泛型能力来避免强制转换返回的类型。 在这篇文章中,我们将通过强耦合我们要获取的端点和它必须返回的数据类型来尝试进一步发展。 快速提醒 假设我们要获取“ dog.ceo ”端点之一。 通常从定义路线开始。 枚举对此非常有用: 让我们尝试滥用这种机制:在仍然使用相同端点的同时,我们尝试明确告诉编译器结果是“ Result ”。 如预期的那样,失败fails。 我们确实拥有一个编译时类型的安全网络层😏,并对我们的API进行了少量更改。 很酷。 感谢您的阅读,并随时提供反馈! 敬请关注。

在Swift中使用ReachabilityManager处理可访问性的Internet连接

移动开发人员通常会遇到设备的连接问题,情况很多。 设备可能会失去其互联网连接,连接状态可能会意外更改并可能重新连接。 因此,作为IOS开发人员。 我需要可以期待这种状态的改变。 我们的应用必须处理这种状态更改,以干净的方式正确响应这些事件。 因此,我在我的Swift应用程序中使用了Ashley mills / Reachability.swift的库,我正在努力处理这种情况。 ashleymills / Reachability.swift Reachability.swift –用闭包 github.com 在Swift中重写了Apple的Reachability。 但是还有更多,我也需要处理许多实现细节。 所以我建立了一个Manager类,混合了所有可能的状态。 这是ReachabilityManager类; 因此,让我们深入研究细节。 我们想知道我们的应用程序连接在三种可能的情况下何时发生变化。 当应用未连接时, 通过Wifi连接该应用时, 通过WWAN连接应用程序时。 Manager包括Reachability提供的一种通知机制,用于观察上述的可达性更改。 因此它通知我的其他班级来管理错误状态,UI更改或更新(本文中不包括)。 您可以在那里进行自己的实现以捕获更改。 最后,如果您需要在应用启动时检查连接或您的应用需要特定情况,则可以在AppDelegate#didFinishLaunchingWithOptions中调用ReachabilityManager 。 守卫ReachabilityManager.isUnreachable()== true否则{return} 您可以使用静态方法(.ie isReachable)。 简单。 感谢您的阅读。

铬网络

我们的iOS应用程序的网络堆栈最近已切换为Chromium网络堆栈。 其背后的关键原因是我们希望在iOS和Android之间共享代码。 其他 主要原因包括: 可以访问较低级别的网络堆栈以进行优化和报告,并避免系统库中的错误 能够打开/关闭功能。 SDCH / Brotli / SPDY / H2 / QUIC / IPv6支持。 同步和异步联网API。 集成新网络堆栈的最简单方法是拦截NSURLProtocol并通过Chromium堆栈处理请求。 在理想的情况下,我们希望抽象出NSURLSession层并轻松切换到Chromium网络堆栈。 需要注意的 几点 : 框架大小。 该框架需要仔细剥离以减小二进制大小。 (例如,由于H2不在,因此无需支持SPDY) 守卫。 获取门禁的请求应通过原始网络堆栈。 关闭URLCache。 禁用内部cookie处理,以使cookie具有与其他堆栈/ webview同步的统一存储。 Chromium网络堆栈设计文档 下面是一个简短的摘要: 主要接口是URLRequest和URLRequestContext ,前者表示URL,后者包含满足URL请求的上下文,包括cookie,主机解析器,代理解析器,http缓存等。 网络请求 剖析 启动URLRequest时,首先决定要创建哪种URLRequestJob 。 您可以通过URLRequest::Interceptor和URLRequest::ProtocolFactory定制请求。 URLRequestHttpJob查询CookieMonster以标识cookie并随后创建一个HttpTransaction 。 该事务将首先检查HttpCache ,如果未命中,我们将创建一个HttpNetworkTransaction来处理请求。 事务被提供给HttpNetworkSession以包含执行HTTP请求的上下文状态。 HttpNetworkTransaction要求HttpStreamFactory创建HttpStream 。 工厂返回一个HttpStreamRequest并处理如何建立连接的所有逻辑。 建立连接后,将包装直接HttpStream与网络对话的HttpStream子类。 HttpStreamFactory进行代理解析,以确定是否需要代理。 端点将检查SpySession中是否有可用的SpdySessionPool. 连接管理 套接字池从实现中提取套接字请求,从而使我们对套接字进行“后期绑定”。 套接字请求可以通过新连接的套接字或空闲的套接字来实现(重用以前的http事务) 支持的仪器 […]

服务器API层설계(1/2)

iOS版(ViewController)版的것이다。 를를목표목표용해왔는데용해왔는데용해왔는데용해왔는데용해왔는데를를를를를를를를를를에에해봤해봤해봤해봤해봤해봤해봤해봤해봤 이제。여여여해해해해쉽게트트트트트트트만든만든다。 최종적인API인터페이스레이어는다이다 이제추가해나가면서사된다。 。다젝트에서로젝트에서사용다한면이여이여기저기있다。 하고재재용성을용성을하고하고하고2편으로이해봐야겠정리해봐야겠다。

迅捷网络层-更新

首先,我要对拍手的每个人表示感谢,对我以前的文章发表评论:“在Swift中编写网络层:面向协议的方法”。 经过评论中的反馈和更多研究后,我认为解决本文中建议的改进将是有益的。 我们可以对项目进行两个简单的修改,以改善其功能。 在我们先前的URLSession实现中,我们使用了URLSession.shared 。 此代码有效,但不是最佳方法。 每次发出请求时,我们都会实例化一个新会话。 建议有一个URLSession和多个任务。 以前的实现。要解决此问题,我们将在使用默认配置创建路由器时实例化会话。 您可以使用3种不同类型的配置来创建会话。 我建议您从Raywenderlich.com阅读本文。 使用此代码,我们可以创建一个会话并执行多个任务。 这里的另一个优势是,我们可以调整路由器初始化代码以具有会话参数,通过使用模拟,我们将使编写测试变得更加容易。 为此,我要感谢Koen Punt和ilya stroganov的评论。 我不知道URLQueryItem已经编码了我们的参数。 这是一个快速更新,只需删除 .addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)。 并做了。 我永远不会表现出我所了解的一切。 我在Medium上写作时正在学习所有这些内容。 有时候,我会引用自己的帖子来提醒如何实现目标。 具有终身学习者的态度将使人成长。 我喜欢分享自己的发现,并希望能在此期间帮助某人。 话虽如此,如果有任何主题,您可能希望我发表评论,请在评论中提及。 再次感谢您的所有👏🏾。 在Swift⚡️中继续学习和思考。