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 小时前
SQLi-Labs Less-3 通关教程(单引号+括号字符型GET注入)
安全·web安全·网络安全
珠海西格2 小时前
聚焦痛点|分布式光伏消纳困境的三大表现及红区治理难点
服务器·网络·分布式·安全·区块链
mingdong06082 小时前
MySQL 的mysql_secure_installation安全脚本执行过程介绍
数据库·mysql·安全
NewCarRen2 小时前
车载安全(二):用于保护V2V和V2I通信的安全技术
安全·汽车
TMT星球2 小时前
开启iPad专业办公时代 WPS for Pad原生桌面级Office正式上线
ios·ipad·wps
admin and root2 小时前
记一次攻防演练redis未授权访问案例
网络·数据库·redis·安全·web安全·渗透测试·src漏洞挖掘
Nefertari_YinC2 小时前
mac搭建基于wda\airtest 的iOS自动化测试环境
软件测试·macos·ios·airtest·ui自动化测试
前端不太难2 小时前
Flutter / iOS 迁移鸿蒙 ArkUI 的真实成本
flutter·ios·harmonyos