2. 基础概念:密钥、权限、令牌、签名、加密

好,咱们正式开始搭地基。这一章讲的是整个模型里最底层的五个概念。我见过不少团队,一开始就急着画接口、写代码,结果到后面发现「诶?密钥和令牌到底谁管谁?」—— 又得回头重来。所以,先把这几个东西掰扯明白,后面省大事。

2.1 密钥:你手里的那把锁

密钥说白了就是一串秘密数据。它可以是 128 位、256 位的随机字节,也可以是 RSA 的私钥文件。它的作用很简单:证明「你是你」,或者保护「你的东西」不被别人看见或篡改。

我个人习惯把密钥分成两种场景来看:

  • 对称密钥:加密和解密用同一把。快,但分发麻烦。我跟 A 共享一个密钥,如果 A 把密钥泄露了,整个世界都能解密我的消息。
  • 非对称密钥对:公钥加密,私钥解密。公钥可以随便发,私钥打死不外传。你在网上购物用的 HTTPS,底层就是这套逻辑。
实战锦囊:我在项目中见过有人把 512 位的 RSA 密钥当宝贝用。嗯,现在 RSA 至少 2048 位起步,不然等于没锁。千万别省那点算力。

2.2 权限:谁可以做什么

权限不是一个能「握在手里」的东西,它是一条规则:「用户 X 可以对资源 Y 执行操作 Z」。你想想看,如果你设计了接口但没有权限控制,任何调用方调用你的接口都能删库 —— 那你的密钥再强也没用。

我常用的权限模型就这么几种:

模型 说明 适用场景
ACL(访问控制列表) 每个资源绑定一个用户/操作列表 文件系统、小规模系统
RBAC(基于角色) 用户 → 角色 → 权限,三层结构 企业内部系统、管理员面板
ABAC(基于属性) 根据用户、资源、环境属性动态判断 云服务、微服务架构
核心原则:权限和密钥要分开管理。密钥只负责「你是谁」,权限负责「你能干什么」。别混在一起,否则后续改动会特别痛苦。

2.3 令牌:一次性的通行证

令牌()就像演唱会门票。它本身不证明你是谁,但它证明你在某个时间段内,可以入场。在接口设计里,令牌通常是个加密的字符串,由服务端签发,客户端保存并在请求中携带。

常见的令牌类型:

  1. JWT(JSON Web ):自包含的令牌,里面存着用户 ID、过期时间、签名。服务端不需要查库就能校验。
  2. Opaque :就是一段随机字符串,服务端必须去数据库查才能知道它代表谁。
  3. Refresh :长期有效(比如 7 天),用来刷新短期的 Access 。

我曾经踩过一个坑:JWT 里放了太多敏感信息,比如用户手机号、身份证号。其实 JWT 的 payload 只是 Base64 编码,不是加密的。只要拿到 JWT,任何人都能解码出来。从那以后,我都在 JWT 里只放 `user_id` 和 `scope`。

⚠️ 重要提醒:令牌一定要有过期时间。没有过期时间的令牌,一旦泄露,就等于把门钥匙扔大街上。最短过期时间取决于你的业务,一般 Access 15 分钟到 2 小时,Refresh 不超过 7 天。

2.4 签名:证明这个消息没被改过

签名和加密是两回事。签名的作用只有一个:防篡改、防抵赖。

举个例子:我发给你一条消息「转账 1000 元」,如果我给这个消息附上我的私钥签名,那你只需要用我的公钥验证一下就知道:第一,这确实是我发的;第二,消息内容没人改过。

在接口设计里,签名通常用在:

  • API 请求签名:客户端用密钥对请求参数 + 时间戳 + 随机数做签名,服务端验签。防重放、防伪造。
  • JWT 令牌签名:服务端签发 JWT 时用密钥签名,客户端拿回来验签就知道 JWT 是否被篡改。
  • 消息队列中的签名:保证生产者和消费者之间的消息完整。
签名算法选择:我一般优先用 HMAC-SHA256(对称签名,速度快)或者 ECDSA(非对称签名,安全性高)。别再用 MD5 做签名——那东西早就不安全了。

2.5 加密:让第三只眼看不见

加密解决的是「保密性」问题。签名和加密经常配合使用:先加密确保内容别人看不懂,再签名确保内容没被改过。

我画一个简单的对比表,帮你快速区分:

概念 目的 能不能看到原文
签名 防篡改、验证身份 能(签名不隐藏原文)
加密 保证只有授权方阅读 不能(原文被混淆)

实际开发中,我建议你这么用:

  1. 传输层:用 TLS 加密整个通道。这是最基础的,别省。
  2. 数据持久化:敏感字段(如密钥、令牌)用 AES-256-GCM 加密后存数据库。
  3. 端到端加密:如果数据经手多个系统,用非对称加密 + 对称密钥包裹。
⚠️ 坑别踩:我曾经见过一个项目,把用户密码用 Base64 编码就叫「加密」了。Base64 只是编码,不是加密。真正的加密必须用算法(AES、RSA、ChaCha20 等)+ 保密密钥。

2.6 五者之间的关系:一张图说清楚

下面这张 SVG 图把五个概念串在一起,标出了它们的核心关系和流向。你看完这张图,就知道整个知识体系的骨架长什么样了。

密钥权限模型核心概念关系图 密钥 权限 令牌 签名 加密 签发 对消息签名 加密数据 携带身份 先签名再加密 核心依赖关系 密钥是基础,用于签发令牌、签名、加密。令牌携带身份,关联权限。签名和加密常用在同一套密钥上。

2.7 总结一下

这一章讲的东西,就是你今后设计的「原料」:

  • 密钥:安全的根,一切信任的基础。
  • 权限:业务规则,决定能干什么。
  • 令牌:临时凭证,承载身份和授权信息。
  • 签名:确保消息完整性,防篡改。
  • 加密:确保消息机密性,防窃听。

记住一个原则:密钥自己是不会说话的,它需要签名、加密、令牌这些「工具」去发挥作用。而权限决定了这些工具能被谁用、怎么用。把这五个概念的关系烂熟于心,你后面的接口设计才不会跑偏。