欢迎光临
我们一直在努力

签名算法HS256 和 RS256是什么?有什么区别?

一、先理解背景:为什么需要“签名算法”

当服务器把一段信息发给客户端时,比如登录后返回一个 JWT(JSON Web Token),里面可能包含:

  • 用户ID
  • 用户权限
  • 过期时间

{
"user_id": 123,
"role": "admin",
"exp": 1710000000
}

客户端可以修改这段内容吗?

如果用户把 “role”: “admin” 改成 “super_admin”,服务器怎么知道?

所以必须有一个机制:确保这段数据没有被篡改。

解决方法就是:给数据加一个“签名”。

签名算法(Signing Algorithm)

  • HS256
  • RS256

二、JWT 的整体结构

JWT 长这样:header.payload.signature

例如:xxxxx.yyyyy.zzzzz
三部分:

  • Header(头部)
    说明算法
  • {
    “alg”: “HS256”,
    “typ”: “JWT”
    }

  • Payload(数据)
    用户信息
  • {
    "user_id": 123,
    "role": "admin"
    }

  • Signature(签名)
    服务器计算出来的一段加密字符串。
  • 这个签名就是:签名 = 算法(header + payload + 密钥)
    HS256 和 RS256 的区别就是:密钥体系不同。

    三、HS256:对称加密(一个钥匙)

    先想象一个现实场景:你和朋友有一个 秘密密码。
    例如:密码:abc123
    你写一封信,然后用这个密码生成一个签名。
    朋友收到信之后:
    也用 同一个密码 重新计算签名。
    如果结果一致:说明信没被改。
    这就是 HS256 的逻辑
    特点:

    签名 和 验证
    用的是同一个密钥

    流程:

    1. 服务器生成 token

    服务器有一个密钥:

    secret = "my-secret-key"

    签名计算:

    signature = HMACSHA256(
    base64(header) + "." + base64(payload),
    secret
    )

    得到:

    xxxxx.yyyyy.signature

    发给客户端。

    2 客户端带 token 请求
    客户端请求:

    Authorization: Bearer token

    3 服务器验证
    服务器再次计算:

    signature2 = HMACSHA256(data, secret)

    如果

    signature == signature2

    说明数据没有被篡改。

    HS256核心特点

    只有一个密钥:secret
    它既用于:

    • 签名
    • 验证

    这叫:对称加密 / 对称签名

    结构:

    Server
    │
    │ secret
    ▼
    Sign + Verify

    四、RS256:非对称加密(两把钥匙)

    现在换一个现实类比:

    银行保险箱。

    有两把钥匙:

    一把私钥 一把公钥

    规则:

    私钥:只有银行有 公钥:任何人都可以有

    关键特性:

    私钥签名 公钥验证

    这就是 RS256

    五、RS256 的流程

    系统有两把钥匙:

    private key (私钥) public key (公钥)

    关系:

    私钥签名 公钥验证

    1 服务器生成 token
    服务器使用:private key
    生成签名:signature = RSA-SHA256(data, privateKey)
    得到 token:xxxxx.yyyyy.signature
    2 客户端携带 token
    请求 API:Authorization: Bearer token
    3 服务端验证
    验证使用:public key
    计算:verify(data, signature, publicKey)
    如果成功:说明签名来自 对应私钥。

    六、最核心区别

    对比HS256RS256
    密钥数量 一个 两个
    类型 对称 非对称
    签名 secret private key
    验证 secret public key
    安全模型 所有人共享一个密钥 私钥永远不外泄

    项目场景的真实开发

    绝大多数都用 RS256
    因为它解决了一个 非常关键的问题:密钥分发问题
    举个真实场景:
    有三个服务:

    Auth Server(登录服务)
    API Server(业务服务)
    Gateway(网关)

    如果使用 HS256
    所有服务都必须知道:

    secret

    问题:

    只要一个服务泄露 secret:
    任何人都能伪造 token

    而 RS256:

    只有 Auth Server 有:private key
    其他服务只有:public key
    即使 API Server 被攻破:
    攻击者也只能:验证 token
    但无法伪造 token。
    因为:没有 private key
    这就是 非对称签名的巨大优势。

    赞(0)
    未经允许不得转载:171主机测评 » 签名算法HS256 和 RS256是什么?有什么区别?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址