iOS 网络安全认证:Token / MD5 / RSA 简明指南

在做 iOS 网络请求时,接口安全基本绕不开三个方案:

  • Token
  • MD5 签名
  • RSA 签名

很多刚接触后台接口的同学会有一个疑问:这三种到底有什么区别?什么时候用哪个?

这篇文章不讲太多理论,用最简单的方式把这三个方案讲清楚,并给出 Alamofire 实战示例


一、Token 认证(最常见)

Token 基本是所有 APP 的标配。

工作流程很简单

  1. 用户登录
  2. 服务器返回 Token
  3. 客户端把 Token 存在 Keychain
  4. 之后每次请求都带上 Token

服务器通过 Token 判断用户身份。

请求示例(Alamofire)

Swift 复制代码
let token = Keychain.load("user_token") ?? ""

let headers: HTTPHeaders = [
    "Authorization": "Bearer \(token)"
]

AF.request(
    "https://api.xxx.com/user",
    headers: headers
).responseDecodable(of: UserModel.self) { response in
    
    switch response.result {
    case .success(let user):
        print(user)
        
    case .failure(let error):
        print(error)
    }
}

这种方式的优点是 实现简单、通用性高

绝大多数普通 APP 其实只用 Token 就够了。


二、MD5 签名(防止参数被篡改)

有些接口除了登录验证,还希望确保 请求参数没有被修改

这时候常见的做法就是 MD5 签名

基本思路

服务器和客户端约定一个密钥:

Swift 复制代码
appSecret

请求时客户端会:

  1. 对参数按 key 排序
  2. 拼接成字符串
  3. 加上 appSecret
  4. 计算 MD5
  5. 得到 sign

服务器用同样规则算一遍,如果一致说明参数没有被篡改。

举个例子

参数:

Swift 复制代码
uid = 1001
orderId = 123

排序后:

Swift 复制代码
orderId=123&uid=1001

拼接密钥:

Swift 复制代码
orderId=123&uid=1001your_app_secret

最后生成 MD5:

Swift 复制代码
sign

请求示例(Alamofire)

Swift 复制代码
let params: [String: Any] = [
    "uid": "1001",
    "orderId": "123"
]

let sortedStr = params
    .sorted { $0.key < $1.key }
    .map { "\($0.key)=\($0.value)" }
    .joined(separator: "&")

let sign = (sortedStr + "your_app_secret").md5()

AF.request(
    "https://api.xxx.com/order",
    method: .post,
    parameters: params,
    headers: ["sign": sign]
).response { response in
    print(response)
}

这种方案实现成本不高,在 开放 API 或普通业务接口里用得很多。


三、RSA 签名(更高安全级别)

如果是 金融、钱包、资产类应用,仅靠 MD5 一般不够。

这时候通常会用 RSA 非对称签名

原理很简单

客户端生成一对密钥:

Swift 复制代码
公钥
私钥

处理流程:

  1. 私钥保存在本地 Keychain
  2. 公钥上传到服务器
  3. 每次请求用 私钥签名
  4. 服务器用 公钥验证

这样服务器可以确认:

  • 请求确实来自这台设备
  • 请求内容没有被篡改

请求示例(Alamofire)

Swift 复制代码
let params: [String: Any] = [
    "rid": "123"
]

let signStr = sortedParamString(params: params)

let sign = RSAUtils.sign(
    content: signStr,
    privateKey: deviceKeychain["localPrivateKey"]!
)

let headers: HTTPHeaders = [
    "rid": "123",
    "sign": sign,
    "pk": deviceKeychain["localPublicKey"]!
]

AF.request(
    "https://api.xxx.com/safeApi",
    headers: headers
).response { response in
    print(response)
}

这种方案一般用于 支付、钱包、金融系统


四、实际项目怎么选

简单给一个常见的组合:

普通 APP

复制代码
Token

稍微有安全要求

复制代码
Token + MD5

金融 / 钱包

复制代码
Token + RSA

不要一上来就上最高级安全方案,很多时候 复杂度会远高于收益


五、总结

这三种认证方式其实各有分工:

Token: 用户身份验证

MD5: 请求参数防篡改

RSA: 设备身份 + 高安全签名

在实际项目里,根据业务安全级别组合使用即可。

相关推荐
编程范式2 小时前
SwiftUI 中图片如何适配可用空间
ios
Flynt1 天前
npm v12 来了:allowScripts 默认关闭,我的项目差点跑不起来
安全·npm·node.js
songgeb2 天前
启发式 UI 自动化:从线性剧本到每步读屏决策
ios·测试
冬奇Lab6 天前
Skill 系列(02):Skill 安全风险——三类攻击面的实战测试
人工智能·安全·开源
壹方秘境6 天前
我用Go语言开发了一个跨平台的HTTPS抓包和调试工具
前端·后端·ios
Aphasia3119 天前
VPN 与内网穿透
安全
Mr_愚人派10 天前
当"Claude"不再是 Claude:一次第三方 API 代理引发的 AI 身份伪造排查实录
人工智能·安全
DaLi Yao11 天前
【无标题】
人工智能·安全
Alsn8611 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
网络研究院11 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展