V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
copymaster
V2EX  ›  问与答

[不懂就问]JWT 中 header 和 signature 真的有必要存在吗?直接使用 payload 部分对称加密不好吗

  •  1
     
  •   copymaster · 333 天前 · 1386 次点击
    这是一个创建于 333 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看 jwt 就觉得很疑惑,毋庸置疑 jwt 使用非常广,但我怎么也没想明白 header 和 signature 这两部分返回给客户端有什么用,到头来还是客户端再发回来后端做校验 直接使用对称加密,比如 aes,来加密返回给客户端不好吗?客户端修改之后回来再解密肯定出错

    我能想到的使用 jwt 加 salt 而不使用对称加密的唯一原因就是性能考虑,关于这一点我也不是很确定

    第 1 条附言  ·  333 天前
    感谢各位解答疑惑,之前没想到 jwt 中的数据是给客户端看的,还以为只是一个令牌
    不过我现在又有新的想法了:
    用户登录的时候额外多生成一个 key 发送给服务器,服务器吧这个 key 放到加密的 token(这个密钥只有后端有)中,一些敏感数据就可以使用对称加密算法来通信了
    13 条回复    2021-08-01 09:54:53 +08:00
    future0906
        1
    future0906  
       333 天前
    一个是签名,一个是加密,两个不是同一个东西。加密完以后客户端还怎么读 payload 和 header 的内容?
    oott123
        2
    oott123  
       333 天前 via Android   ❤️ 1
    > 客户端修改之后回来再解密肯定出错
    不正确。事实上如果不带 AEAD 的加密算法,是无法保证原文不被修改的。

    > jwt 为什么不加密

    Although JWTs can be encrypted to also provide secrecy between parties, we will focus on signed tokens. Signed tokens can verify the integrity of the claims contained within it, while encrypted tokens hide those claims from other parties. When tokens are signed using public/private key pairs, the signature also certifies that only the party holding the private key is the one that signed it.

    以上说明来自官网介绍 https://jwt.io/introduction
    ZeawinL
        3
    ZeawinL  
       333 天前 via Android
    我觉得 JWT 只是一种规范。
    会指定算法名称,是因为加密或者签名,它不依赖于攻击者不知道你用的什么算法。
    Puteulanus
        4
    Puteulanus  
       333 天前
    像一楼说的,加密了客户端不就没法读了
    客户端要是不用读那给他全文干啥,存在服务端给它个 session id 不就完了,连加密都省了
    nvkou
        5
    nvkou  
       333 天前 via Android
    保持完整性比加密重要。对称加密你要一用户一密钥吗?还是一 session 一密钥呢?服务开销大不大?密钥交换怎么解决?重放攻击能挡得住不?
    由于 jwt 是可信端签发的单向数据,仅作签名验证权威性和保证完整性就足够了,没人逼你在 jwt 放用户余额等业务数据。
    完整的 jwt 还含有多种 token 来保障业务需求,比如服务端主动过期 session 。业务合适的话 jwt 方案不失为一套快速解决方案。个人还是倾向 saml 。
    Microkernel
        6
    Microkernel  
       333 天前
    JWT 是为了客户端能看不能改
    Rocketer
        7
    Rocketer  
       333 天前 via iPhone
    如果不需要给客户端读,只是原样返回的话,那没必要用 jwt,直接发个 token 就行了,token 里可以密文存储用户身份,别人都不知道怎么解密,只有你自己能看
    ysc3839
        8
    ysc3839  
       333 天前 via Android
    JWT 可以把 payload 加密,不加密的是为了让客户端也能读取里面的数据。
    lululau
        9
    lululau  
       333 天前 via iPhone   ❤️ 1
    想想为什么会存在 iss,就明白为什么非对称加密(签名和校验)在某些场景下是必须的了
    skinny
        10
    skinny  
       333 天前
    更主要的原因是没必要,基本功能是身份验证,表示确实是这个人发的,但你加密了 payload 也需要 js 解密,而 js 通常是通过 https 发给客户端的,流量已经被加密了,再加密也是多此一举,如果你的环境连 https 都无法保证秘密和安全了,加密也没有用,攻击者可以改你的 js 或相关的流量;如果你说你走别的渠道分发客户端代码,并使用双向认证,你分发的渠道还是会面临这个问题,当然,这可能可以提高攻击者的成本和难度,但这需要一系列的安全加固,任何一个地方出现问题就白干了(木桶效应)。
    skinny
        11
    skinny  
       333 天前
    @skinny 当然,https 不能信任了,签名也白搭,所以只需要最基本的验证,还有是防止重放这些
    copymaster
        12
    copymaster  
    OP
       333 天前
    @skinny 之前是没想到 payload 是给客户端看的,一直以为是给后端看的...
    copymaster
        13
    copymaster  
    OP
       333 天前
    @Puteulanus session 生命周期太短,而且使用 jwt 就是为了后端不保存
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3302 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:17 · PVG 12:17 · LAX 21:17 · JFK 00:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.