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

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

相关推荐
乐迪信息1 小时前
乐迪信息:AI算法盒子实时识别船舶烟雾与火焰异常
大数据·人工智能·算法·安全·目标跟踪
汤愈韬2 小时前
IPSec-NAT穿越原理和配置
网络·网络协议·安全·网络安全·security
JoyCong19983 小时前
ToDesk AI 正式登场:您的智能远程助手,积分新玩法科普
人工智能·安全·电脑·远程工作·远程操作
vortex54 小时前
AI Skill 设计:网络安全审计中的自主性与规范化博弈
人工智能·安全·web安全
zhangfeng11336 小时前
那nvidia orim车载gpu tee安全飞地 和天垓 100 gpgpu的 飞地 ,大概有多大存储量 ,解密流程
人工智能·深度学习·安全·语言模型·gpu算力·芯片
吹个口哨写代码6 小时前
前后端分离的安全补救措施
安全
zhangfeng11337 小时前
天数智芯天垓 100 加密大模型分布式部署安全方案
人工智能·分布式·安全·transformer·gpu算力·芯片
@insist1237 小时前
系统架构设计师-安全架构设计:网络安全威胁分类与典型攻击原理
web安全·系统架构·软考·安全架构·系统架构设计师·软件水平考试
workflower8 小时前
医院核心竞争力的四大重构
人工智能·安全·设计模式·重构·动态规划·scrum
zhangfeng11338 小时前
车载gpu 飞地 只保存密钥 不保存 权重 Orin确实有TEE安全飞地(TSEC/OP-TEE)
服务器·网络·人工智能·安全·transformer·芯片