ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

行为验证码 iOS 接入指南:Swift 与 Objective-C 双端集成(滑动拼图 / 点选文字)

行为验证码 iOS 接入指南:Swift 与 Objective-C 双端集成(滑动拼图 / 点选文字) 后端应用安全图像处理【免费下载链接】captcha行为验证码(滑动拼图、点选文字)前后端(java)交互包含h5/Android/IOS/flutter/uni-app的源码和实现项目地址https://gitcode.com/gh_mirrors/captc/captcha点击查看免费下载导读本文是行为验证码项目captcha在 iOS 端的官方接入指南覆盖Swift与Objective-C两套完整 Demo分别位于 view/ios/captcha_swift 与 view/ios/captcha_oc从 CocoaPods 依赖引入、验证码组件初始化、接口地址配置到 secretKey AES 加密与二次校验传参的完整调用链均有源码级讲解。读完本文你将能够在一个 iOS 工程中直接集成滑动拼图blockPuzzle与字符校验clickWord两种行为验证能力并理解前后端交互的接口协议与加密规则。一、接入前须知验证码类型与整体交互流程本项目的 iOS 端验证码组件通过枚举CaptchaType区分两种校验模式puzzle 0滑动拼图clickword 1字符校验点选文字以 Swift 端 CaptchaView.swift 的枚举定义为例enum CaptchaType: Int { case puzzle 0 //滑动拼图 case clickword 1 //字符校验 }Objective-C 端则在 CaptchaRequest.h 中以NS_ENUM定义了相同语义typedef NS_ENUM(NSUInteger,CaptchaType){ puzzle 0,//滑动拼图 clickword 1//字符校验 };整体交互分为三步获取验证码请求/captcha/get接口返回背景图originalImageBase64、拼图jigsawImageBase64、token、secretKey点选文字还会返回wordList待点选文字列表用户交互用户在客户端完成滑动或点选客户端把坐标点序列化为 JSON 字符串校验请求/captcha/check接口携带token与pointJson加密或明文后端校验通过后回调返回校验结果字符串。二、Swift 端接入captcha_swift2.1 引入 Pod在 Podfile 中引入以下依赖与文档保持一致Alamofire、CryptoSwift、SwiftyJSON、HandyJSON分别负责网络请求、AES 加解密、JSON 解析与模型映射pod CryptoSwift, ~ 1.0 pod Alamofire, ~4.7.2 pod SwiftyJSON, ~ 4.1.0 pod HandyJSON, ~ 5.0.0-beta.12.2 使用方式一行代码弹出验证码视图并通过completeBlock回调接收校验结果// case puzzle 0 //滑动拼图 // case clickword 1 //字符校验 let type CaptchaType(rawValue: sender.tag) ?? .puzzle CaptchaView.show(type) { (v) in print(v) }CaptchaView.show(_:completeBlock:)是组件的静态入口源码见 CaptchaView.swift其内部创建全屏CaptchaView并挂载到UIApplication.shared.windows[0]上class func show(_ type: CaptchaType, completeBlock block: escaping ((String) - Void)){ let view CaptchaView(frame: UIScreen.main.bounds, type: type) view.completeBlock block UIApplication.shared.windows[0].addSubview(view) }视图加载后会自动调用requestData()拉取验证码数据见 CaptchaView.swift请求成功后通过didSet把返回的originalImageBase64/jigsawImageBase64解码为UIImage并刷新界面失败时重置模型并重新渲染。2.3 事件回调参数说明completeBlock回调函数可自定义回调内容根据自己服务定制回调的触发时机有两处CaptchaView.swift校验成功completeBlock(successStr)传入二次校验用的拼接/加密字符串随后延时 1 秒自动关闭验证码视图校验失败同样回调随后展示验证失败提示并自动刷新重新出题用户主动关闭close()方法会以空字符串回调并移除视图。2.4 请求处理与接口地址配置Swift 端请求层拆分为两个文件CaptchaRequest.swift 请求接口及处理 AJBaseRequest.swift 网络请求基类对应仓库路径为 CaptchaRequest.swift 与 AJBaseRequest.swift。其中 CaptchaRequest.swift 封装了两个接口captchaAccept(_:success:failure:)GET/POST 请求/captcha/get参数为captchaTypeblockPuzzle/clickWord与distinguishSignatureVerificationMethod ios并把originalImageBase64、jigsawImageBase64、token、secretKey、result、wordList组装成CaptchaResponseData模型返回captchaCheck(_:pointJson:token:success:failure:)请求/captcha/check参数为pointJson加密后的坐标、captchaType、token校验成功后同样返回CaptchaResponseData。接口地址配置在AJBaseRequest类中替换kServerBaseUrl即可//IP地址 //let kServerBaseUrl https://captcha.anji-plus.com/api //let kServerBaseUrl http://10.108.11.46:8080/api let kServerBaseUrl https://captcha.anji-plus.com/captcha-api从 AJBaseRequest.swift 可以看到网络层基于 Alamofire 的SessionManager默认请求超时 20 秒POST 请求使用JSONEncoding.default并以application/json头提交响应解析时统一以repCode 0000判定业务成功把repData交给上层回调。这意味着你需要部署自己的后端服务Java 后端参考 core/captcha并把kServerBaseUrl指向你自己的服务地址。2.5 校验注意事项secretKey 与坐标加密请求验证码接口返回的repData中带secretKey参数。当secretKey有值时需要对坐标 JSON 进行 AES 加密加密 key 即为secretKey不加密时pointJson直接为坐标 JSON 序列化后的字符串。Swift 端逻辑如下CaptchaView.swiftCaptchaRequest.captchaAccept(currentType, success: { (model) in self.repModel model //secretKey有值 代表需要进行加密 if(self.repModel.secretKey.count 0){ self.needEncryption true } else { self.needEncryption false } self.getRequestView(self.currentType) }) { (error) in self.repModel CaptchaResponseData() self.getRequestView(self.currentType) }点选文字场景先把多次点击的坐标组成数组并序列化let pointEncode ESConfig.jsonClickWordEncode(pointsList) var pointJson ; //请求数据有secretKey 走加密 否则不走加密 if(self.needEncryption){ pointJson ESConfig.aesEncrypt(pointEncode, self.repModel.secretKey) } else { pointJson pointEncode; }加密实现位于 ESConfig.swift采用AES-128-ECB PKCS7 填充密文转 Base64class func aesEncrypt(_ req: String, _ secretKey: String XwKsGlMcdPMEhR1B) - String{ var encryptedBase64 do { //使用AES-128-ECB加密模式 let aes try AES(key: secretKey.bytes, blockMode: ECB(), padding: .pkcs7) let encrypted try aes.encrypt(req.bytes) encryptedBase64 encrypted.toBase64() ?? } catch { } return encryptedBase64; }注默认参数XwKsGlMcdPMEhR1B仅是本地兜底值实际加密 key 一律以后端返回的secretKey为准。2.6 二次校验传参校验通过后completeBlock回调出去的successStr是业务方上报给自有服务端做二次校验的凭证。拼接规则为token --- pointStrtoken是 get 请求获取的pointStr是坐标序列化的字符串如果需要加密则对拼接后的整体字符串做 AES 加密// token是get请求获取的 pointStr是坐标序列化的字符串 //如果需要加密 将字符串进行拼接加密 var successStr \(token)---\(pointStr); if(self.repModel.secretKey.count 0){ successStr ESConfig.aesEncrypt(successStr, self.repModel.secretKey) } success(successStr)该逻辑在 CaptchaView.swift 的requestCheckData(pointJson:token:pointStr:)中先调用/captcha/check完成前端校验成功后组装修饰字符串并通过completeBlock回传失败则回传空字符串并展示失败态。三、Objective-C 端接入captcha_oc3.1 引入 PodOC 工程使用 AFNetworking JSONModel 组合pod AFNetworking pod JSONModel3.2 使用方式同样一行代码弹出验证码// case puzzle 0 //滑动拼图 // case clickword 1 //字符校验 [CaptchaView showWithType: sender.tag 0 ? puzzle: clickword CompleteBlock:^(NSString * result) { NSLog(result: %, result); }];3.3 事件回调参数说明completeBlock回调函数可自定义回调内容根据自己服务定制回调语义与 Swift 端一致校验成功后返回拼接/加密的二次校验字符串失败或用户关闭时返回空字符串业务方根据返回值自行决定后续流程。3.4 请求处理与接口地址配置OC 端请求层同样拆分为两个文件#import CaptchaRequest.h //请求接口及处理 #import AFAppDotNetAPIClient.h //网络请求基类仓库路径为 CaptchaRequest.h / CaptchaRequest.m 与 AFAppDotNetAPIClient.h / AFAppDotNetAPIClient.m。CaptchaRequest.m 封装了获取验证码接口captchaAccept:FinishedBlock:请求captcha/get以及校验接口captchaCheck:PointJson:Token:FinishedBlock:请求captcha/check两者的请求参数与 Swift 端一致captchaTypedistinguishSignatureVerificationMethod ios并以repCode 0000判定成功把repData反序列化为CaptchaRepModel。接口地址配置在AFAppDotNetAPIClient类中替换AFAppDotNetAPIBaseURLString即可static NSString * const AFAppDotNetAPIBaseURLString https://captcha.anji-plus.com/captcha-api/;从 AFAppDotNetAPIClient.m 可见该基类基于 AFNetworking 的AFHTTPSessionManager配置了AFJSONRequestSerializerJSON 格式请求、15 秒超时并放宽了acceptableContentTypes以兼容常见 JSON 文本响应具体请求转发由 HttpToolManager.m 统一封装。3.5 校验注意事项secretKey 与坐标加密与 Swift 端相同的规则secretKey有值时对坐标 JSON 做 AES 加密key 取secretKey无值时pointJson为坐标 JSON 明文。OC 端示例以单个点为例注意y在拼图场景固定为 5与后端约定的偏移量校验一致NSDictionary *dic {x: (point.x), y: 5}; NSString *pointEncode [ESConfig jsonEncode:dic]; NSLog(序列化 %,pointEncode); NSString *pointJson pointEncode; //请求数据有secretKey 走加密 否则不走加密 if(self.captchaModle.secretKey.length 0){ pointJson [pointEncode aes256_encrypt:pointEncode AESKey:self.captchaModle.secretKey]; } NSLog(加密 %,pointJson); [self requestDataPointJson:pointJson Token:self.captchaModle.token PointStr:pointEncode];其中序列化工具[ESConfig jsonEncode:]实现在 ESConfig.m基于NSJSONSerialization开启NSJSONWritingFragmentsAllowed支持裸 JSON 片段输出AES 加密工具aes256_encrypt:content AESKey:实现在 NSStringAES256.m密文同样以 Base64 字符串返回。3.6 二次校验传参// token是get请求获取的 pointStr是坐标序列化的字符串 //如果需要加密 将字符串进行拼接加密 NSString *successStr [NSString stringWithFormat:%---%,token, pointStr]; if(self.captchaModle.secretKey.length 0){ successStr [successStr aes256_encrypt:successStr AESKey:self.captchaModle.secretKey]; } [self showResultWithSuccess:result SuccessStr:successStr];四、前后端接口约定与加密规则要点结合两端源码与 Java 后端实现core/captcha可以提炼出 iOS 接入必须遵守的接口契约1. 获取验证码captcha/get参数值captchaTypeblockPuzzle滑动拼图或clickWord点选文字distinguishSignatureVerificationMethodios网关校验处理标识可自行配置返回repData字段originalImageBase64背景图、jigsawImageBase64拼图仅滑动拼图、token、secretKey、wordList点选文字的词组列表数组。2. 校验captcha/check参数值pointJson坐标 JSON明文或 AES 加密后的密文captchaTypeblockPuzzle/clickWordtoken获取验证码时返回的 tokendistinguishSignatureVerificationMethodios3. 加密规则当secretKey非空对坐标 JSON 使用 AES 加密Swift 为 AES-128-ECB PKCS7OC 为 AES256 实现key 为secretKey当secretKey为空pointJson直接传坐标 JSON 序列化字符串二次校验字符串固定格式token---pointStr如需加密则整体加密后再交给业务服务端。4. 坐标语义滑动拼图坐标为滑块最终停留位置y固定传 5见两端源码中的y: 5/5点选文字坐标为用户依次点击文字的屏幕坐标点集合Swift 端在 CaptchaView.swift 中按wordList数量依次收集tapViewList全部点完后触发校验。五、两个 Demo 的工程结构速览Swiftcaptcha_swift 的核心代码集中在 Base网络基类、请求封装、AES 工具、证书信任与 catchaviewCaptchaView视图与手势逻辑依赖托管在 Podfile。OCcaptcha_oc 的核心代码集中在 HttpTools请求封装与网络客户端、configAES 与序列化工具、viewCaptchaView以及 modelCaptchaRepModel响应模型依赖托管在 Podfile。两个工程都内置了可直接运行的示例控制器ViewController接入时可直接参考其初始化与回调写法。六、接入注意事项小结服务地址必须替换上线前把kServerBaseUrlSwift或AFAppDotNetAPIBaseURLStringOC替换为自建后端服务地址并与 Java 后端core/captcha的接口路径保持一致加密一致性iOS 端加密方式必须与后端解密方式匹配AES-ECB PKCS7 / Base64否则校验必然失败点选文字顺序点选验证码要求按wordList给出的顺序点击客户端收集坐标的顺序即提交顺序乱序提交会被后端判定失败回调为空串的处理用户关闭验证码视图时completeBlock会以空字符串回调业务方应将其视为验证未完成而非成功HTTP 与 HTTPS若自建服务为 HTTP 明文需在 OC 的AFAppDotNetAPIClient/ Swift 的CertificateTrust中放开 ATS 限制或配置证书信任见 CertificateTrust.swift运行环境Swift 工程依赖 Alamofire 4.x / CryptoSwift 1.x 等版本OC 工程依赖 AFNetworking / JSONModel请以 Podfile.lock 中的锁定版本为准避免大版本升级带来的 API 不兼容。至此无论你的 iOS 工程使用 Swift 还是 Objective-C都可以按照上述流程完成滑动拼图与点选文字两类行为验证码的接入、地址配置与加密校验并与 Java 后端完成端到端联调。赞分享后端应用安全图像处理【免费下载链接】captcha行为验证码(滑动拼图、点选文字)前后端(java)交互包含h5/Android/IOS/flutter/uni-app的源码和实现项目地址https://gitcode.com/gh_mirrors/captc/captcha点击查看免费下载相关推荐如何快速给 SillyTavern 接上第一个 AI 后端新手完整指南如何快速给 SillyTavern 接上第一个 AI 后端新手完整指南 你第一次打开 SillyTavern 时角色卡和聊天界面都在但点发送就会卡住—后端应用安全图像处理深度学习入门完整指南小白友好的开源教程《动手学深度学习》深度学习入门完整指南小白友好的开源教程《动手学深度学习》 想学深度学习教程总是东一榔头西一棒子视频看完没代码代码扒下来又没讲解。《动手学深度学习》D2后端应用安全图像处理AJ-Captcha 行为验证码接入指南滑动拼图与文字点选的前后端集成与二次校验实战AJ Captcha 行为验证码接入指南滑动拼图与文字点选的前后端集成与二次校验实战 本指南以 view/doc/docs/README.md https:/后端应用安全图像处理上一篇智慧教育平台电子教材PDF快速下载完整指南下一篇Simple Live在一个App里看完四大直播平台的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进