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

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

相关推荐
Koi慢热6 小时前
DayDayMap学术社区体验:卫星网络测绘专题用下来怎么样
网络·人工智能·windows·web安全·网络安全
EasyGBS7 小时前
终结训推割裂!EasyGBS×EasyAIS×DLTM,实现AI算法训推一体闭环落地!
服务器·深度学习·安全
云杂项7 小时前
现代密码学(杨波)【第五版】(个人笔记)
安全·密码学
程序员JerrySUN8 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
2601_9623649710 小时前
红外活体模组,Windows 设备安全身份入口解析
windows·安全·电脑
域智盾系统来啦13 小时前
电脑远程监控软件具备哪些核心能力?电脑远程监控软件企业落地核心知识点汇总
安全·远程工作·电脑远程监控软件
hz5678914 小时前
手术室视频示教系统解决方案:让临床教学突破空间限制
安全·音视频·实时音视频·信息与通信·智能硬件
安全指北针15 小时前
数据安全产品 POC 验证怎么做?一套可落地的评估方法
大数据·安全
Linux运维技术栈15 小时前
如何避免绕过CDN的攻击?基于 CDN 回源请求头鉴权的防御实操与安全性剖析
nginx·安全·cdn
hasty17 小时前
一次同秒竞态,如何把污染制品送进 npm 与 TestPyPI
安全·安全威胁分析·代码复审