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: 设备身份 + 高安全签名

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

相关推荐
HackTwoHub2 分钟前
等级保护现场测评系统重磅更新,支持 AI 接入,可录入全品类资产清单,自动化巡检核查,批量导出测评归档文件
运维·人工智能·安全·web安全·网络安全·自动化·系统安全
川石课堂软件测试9 分钟前
安全测试|服务器安全加固方法
服务器·功能测试·测试工具·jmeter·mysql·web安全·单元测试
Sagittarius_A*1 小时前
Command Injection 命令注入漏洞:系统命令拼接缺陷与执行利用技术
网络·安全·web安全·dvwa·命令注入漏洞
武子康2 小时前
Hugging Face AI 驱动入侵真正暴露的是 Dataset Processing 信任边界(攻击链 + 三层隔离 + 行动清单)
人工智能·安全·llm
Android洋芋2 小时前
漏洞挖掘与赏金攻略
网络·安全·web安全
秋雨梧桐叶落莳2 小时前
iOS——3GShare项目总结
学习·macos·ios·objective-c·cocoa
数据知道3 小时前
SDN 与软件定义网络的安全边界在哪里?
网络·安全·网络安全
数据知道3 小时前
VLAN 与安全隔离:从配置错误到 VLAN Hopping 攻击
网络·安全·网络安全·智能路由器
Sagittarius_A*4 小时前
Open HTTP Redirect 开放重定向漏洞:URL 跳转校验缺陷与绕过技术
网络·安全·web安全·http·dvwa·burp suite
头茬韭菜12 小时前
4.4 文件编辑安全 — 权限决策与脏写防护的工程实现
安全