V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
revalue
V2EX  ›  程序员

面试遇到个怪像: JWT 没用到哈希算法,也没用到不可逆加密啊

  •  
  •   revalue · Apr 9, 2020 · 7222 views
    This topic created in 2216 days ago, the information mentioned may be changed or developed.
    JWT 就是 JSON Web Token 。

    写了几年程序,最近面试几个新同学,随便问了下 JWT 原理,发现他们老是说“哈希哈希”。

    我就奇了怪了,难道是我知识有问题。上网看了下文章,有小部分文章的确提到“哈希”这个字眼,这就是在服务器验证 jwt token 是否被篡改的时候。这应该是个“比对”密文的过程吧,但是“比对”不意味着就是用哈希啊,也不意味着不可逆加密啊。

    不就是 SHA256 ?难道时带变了?
    Supplement 1  ·  Apr 11, 2020
    史上最菜面试官,诚邀各位硬核解答
    48 replies    2020-04-11 09:11:22 +08:00
    eminemcola
        1
    eminemcola  
       Apr 9, 2020
    SHA256 确实是一种 hash 呀
    wsy2220
        2
    wsy2220  
       Apr 9, 2020
    无言以对
    luckyrayyy
        3
    luckyrayyy  
       Apr 9, 2020
    安全散列算法(英语:Secure Hash Algorithm,缩写为 SHA )
    散列和哈希和摘要,指的都是同一种东西吧。
    chendy
        4
    chendy  
       Apr 9, 2020
    SHA256 不是一种哈希算法?
    revalue
        5
    revalue  
    OP
       Apr 9, 2020
    上面好像打错了,“JWT 签名算法中,一般有两个选择,一个采用 HS256,另外一个就是采用 RS256 。”
    yxwzaxns
        6
    yxwzaxns  
       Apr 9, 2020 via iPhone
    老哥是搞前端的么,是的话可以理解你发的帖子
    malusama
        7
    malusama  
       Apr 9, 2020
    HS256 中用到的 SHA256 是否是一种哈希算法?
    paragon
        8
    paragon  
       Apr 9, 2020
    你都知道 JWT 是 JSON Web Token 难道不知道 HMAC 是 Hash-based message authentication code ?
    revalue
        9
    revalue  
    OP
       Apr 9, 2020
    @malusama 哈哈哈 看到了好像是
    @yxwzaxns 是前端出身,史上最菜面试官
    HuHui
        10
    HuHui  
       Apr 9, 2020 via Android
    装逼失败了么?
    hoyixi
        11
    hoyixi  
       Apr 9, 2020
    很多东东,不翻译成中文,直接用英文,少了很多扯皮和迷惑
    loading
        12
    loading  
       Apr 9, 2020 via Android
    被你这么一搅,我已经不懂 jwt 了。
    revalue
        13
    revalue  
    OP
       Apr 9, 2020
    @HuHui 装逼失败。再看看呗
    wangyzj
        14
    wangyzj  
       Apr 9, 2020
    习惯问题
    md5 说成 hash 我也不习惯
    Keyes
        15
    Keyes  
       Apr 9, 2020 via iPhone
    亲,咱们这边的建议去了解一下数字签名呢
    w830I8ikCnasfN4q
        16
    w830I8ikCnasfN4q  
       Apr 9, 2020
    数字签名 正解
    ragnaroks
        17
    ragnaroks  
       Apr 9, 2020
    搜索的时候加上"-csdn"
    upupddd
        18
    upupddd  
       Apr 10, 2020 via iPhone
    不 是时代变了
    ipwx
        19
    ipwx  
       Apr 10, 2020   ❤️ 1
    数字签名:内容 + 根据内容算出来的签名码。签名码的计算方法各有不同,但是主旨都是为了保证只有内容的生产者才能计算出正确的签名码。篡改内容的人,无法为篡改后的内容算出正确的签名码。

    HMAC 的签名码计算方法,粗略可以理解为:哈希函数(内容 + secret key)

    当然还有别的计算方法。比如使用非对称加密。比如 RSA 签名:RSA 加密(内容)

    最后就是,这个世界上有很多不同的已经被发明出来的哈希函数。除了已经被淘汰(比如 md5 ),还有 rsa256, rsa512 等等。
    ipwx
        20
    ipwx  
       Apr 10, 2020
    补充:RSA 签名中,私钥用来加密,公钥用来解密。私钥只有内容生产者知道,公钥所有人都知道。私钥加密的信息只有公钥才能正确解开,反之亦然。篡改者不知道私钥,保证了他无法伪造签名。具体可以去了解一下 https 。
    geelaw
        21
    geelaw  
       Apr 10, 2020   ❤️ 1
    @ipwx #19 #20 基于 RSA 签名算法并不是“用私钥加密”,根本没有“加密”的概念。

    #0 JWT 不一定具有保密功能,不存在“密文”“加密”的概念。不过楼主有一部分说得没错,验证签名、消息验证码不需要使用 hash 函数,只不过真实世界里的签名、消息验证码都在某些步要用 hash 函数,因为不用 hash 函数的(可证明安全)方案实际效率令人无法忍受。
    jss
        22
    jss  
       Apr 10, 2020 via iPhone
    256 不认识也就算了,SHA 不知道是什么?
    KasonPasser
        23
    KasonPasser  
       Apr 10, 2020
    现在面试都是考这些基础性的东西了吗?
    Jrue0011
        24
    Jrue0011  
       Apr 10, 2020   ❤️ 1
    我之前看 Spring Security 官方文档的时候,才知道 JWT 其实只是 JOSE 的一部分。。

    JSON Web Token (JWT)
    JSON Web Signature (JWS)
    JSON Web Encryption (JWE)
    JSON Web Key (JWK)

    A JWT is a namedtuple result produced by either decrypting or verifying a JWE or a JWS 。。。
    useben
        25
    useben  
       Apr 10, 2020
    面试还会问自己不熟悉的知识的? 难道真的只是问问
    BlackBerry999
        26
    BlackBerry999  
       Apr 10, 2020
    @ipwx 非对称加密 不是公钥加密,私钥解密吗?
    BlackBerry999
        27
    BlackBerry999  
       Apr 10, 2020
    @ipwx 我明白了,私钥加密是防篡改,公钥加密是防破解。
    exploreXin
        28
    exploreXin  
       Apr 10, 2020   ❤️ 3
    本想下笔千言,但是又不知道从何介绍起,《深入浅出密码学》,还是推荐楼主看下这本书,书名看起来有点像七天精通 XXX 的烂书,但实际上这是我读过最好的一本介绍密码学的书籍,里面既有易懂得密码学介绍,又有高深的数学理论,看不懂的可以暂时跳过,以后慢慢的反复阅读几遍,就能领会其中的奥秘了,万维网中的加密技术,都不会超出这本书的范畴,并且加密算法绝对不仅仅是 MD5,哈希这几个,加密算法多如牛毛,又复杂的,有简单的,有免费的,有收费的,哪个好哪个坏,只能在具体场景里去评判,才是最客观的。
    shawndev
        29
    shawndev  
       Apr 10, 2020
    Secure Hash Algorithm 256, 这样能接受吗
    xFrye
        30
    xFrye  
       Apr 10, 2020   ❤️ 1
    我好像理解了为什么有的人面试会觉得恼火
    index90
        31
    index90  
       Apr 10, 2020
    应该说用到签名算法,哈希只是函数不是算法。
    签名算法可以用 hash+id+secretkey+验证函数,也可以用 RSA 签名算法
    Citrus
        32
    Citrus  
       Apr 10, 2020 via iPhone
    @exploreXin 我都不知道你是在黑这本书还是在夸。。。搞得我想买回来看看一探究竟。。。
    shawndev
        33
    shawndev  
       Apr 10, 2020
    @index90 这种确定不是叫 hmac,hash based message authentication code 算法吗?
    bk201
        34
    bk201  
       Apr 10, 2020
    不太明白,自己原理都不懂,问啥原理?
    mxT52CRuqR6o5
        35
    mxT52CRuqR6o5  
       Apr 10, 2020
    迷惑行为
    index90
        36
    index90  
       Apr 10, 2020
    @shawndev 对,HMAC 就是基于哈希函数的签名算法
    exploreXin
        37
    exploreXin  
       Apr 10, 2020
    @Citrus 可以买一本研究研究 ^_^
    whoami9894
        38
    whoami9894  
       Apr 10, 2020
    你可以这样理解 JWT:
    jwt_payload = urlsafe_base64_enc(HEADER + DATA) + HMAC_SHA256(urlsafe_base64_enc(HEADER + DATA), SECRET_KEY)
    HMAC 的意义是保证了不知道 SECRET_KEY 的情况下可以拿到 DATA 明文,但无法篡改
    当然这是 HS 的情况,另一种 RS 则是通过 RSA 私钥签名,公钥验证
    whoami9894
        39
    whoami9894  
       Apr 10, 2020
    @whoami9894 #38
    笔误了
    jwt_payload = urlsafe_base64_enc(HEADER + DATA) + urlsafe_base64_enc(HMAC_SHA256(HEADER + DATA, SECRET_KEY))
    当然这只是一个示例,实际上 JWT 是对 HEADER 和 DATA 分别编码,然后用"."连接三段 HEADER, DATA 和 SIGN
    changePro
        40
    changePro  
       Apr 10, 2020
    "写了几年程序,最近面试几个新同学“ “密文” 哈哈哈哈,笑死我了。
    revalue
        41
    revalue  
    OP
       Apr 10, 2020
    @whoami9894 @changePro jwt 用到的就是数字签名,其实没有产生需要被解密的密文。
    上面说 HS 和 RS,区别就是签名的时候用的是 HMAC_SHA256 还是私钥签名。还有验签使用对应的手法就行了。

    是这样么?基础不牢地动山摇
    dongisking
        42
    dongisking  
       Apr 10, 2020
    本来我也想支持 LZ 的,看了这篇文章才知道 HS256 原来 H 就是 hash,长知识了哈哈
    mtdhllf
        43
    mtdhllf  
       Apr 10, 2020
    你把 jwt 用 base64 解开,就能看到内容跟对应的 hash 指纹了如{hash:abcd,data:{我是数据}},hash 是后台通过算法生成的,一般都加了盐,不是标准算法.一旦前端改了,hash 值就会对不上,后台就会知道
    Shura
        44
    Shura  
       Apr 10, 2020
    写了几年程序不想着补一下基础吗?
    jakezh
        45
    jakezh  
       Apr 10, 2020 via iPhone
    嗯 是遇到过不少不懂装懂的面试官
    有一次遇到一个狂问 sql 的 结果我还得给他普及一下 B+树是什么
    Newyorkcity
        46
    Newyorkcity  
       Apr 10, 2020
    @Jrue0011 老哥你读文档有作笔记吗?它那个文档好长啊,读着读着我就忘记了连贯不起来了。。
    holinhot
        47
    holinhot  
       Apr 11, 2020
    签名与校验
    Jrue0011
        48
    Jrue0011  
       Apr 11, 2020
    @Newyorkcity 我没有。。。用到才去翻文档。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   824 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 132ms · UTC 19:23 · PVG 03:23 · LAX 12:23 · JFK 15:23
    ♥ Do have faith in what you're doing.