在做 iOS 网络请求时,接口安全基本绕不开三个方案:
- Token
- MD5 签名
- RSA 签名
很多刚接触后台接口的同学会有一个疑问:这三种到底有什么区别?什么时候用哪个?
这篇文章不讲太多理论,用最简单的方式把这三个方案讲清楚,并给出 Alamofire 实战示例。
一、Token 认证(最常见)
Token 基本是所有 APP 的标配。
工作流程很简单
- 用户登录
- 服务器返回 Token
- 客户端把 Token 存在 Keychain
- 之后每次请求都带上 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
请求时客户端会:
- 对参数按 key 排序
- 拼接成字符串
- 加上 appSecret
- 计算 MD5
- 得到 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
公钥
私钥
处理流程:
- 私钥保存在本地 Keychain
- 公钥上传到服务器
- 每次请求用 私钥签名
- 服务器用 公钥验证
这样服务器可以确认:
- 请求确实来自这台设备
- 请求内容没有被篡改
请求示例(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: 设备身份 + 高安全签名
在实际项目里,根据业务安全级别组合使用即可。