• 请不要在回答技术问题时复制粘贴 AI 生成的内容
revalue
V2EX  ›  程序员

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

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

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

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

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

    #0 JWT 不一定具有保密功能,不存在“密文”“加密”的概念。不过楼主有一部分说得没错,验证签名、消息验证码不需要使用 hash 函数,只不过真实世界里的签名、消息验证码都在某些步要用 hash 函数,因为不用 hash 函数的(可证明安全)方案实际效率令人无法忍受。
    jss
    jss
    Apr 10, 2020 via iPhone
    22
    256 不认识也就算了,SHA 不知道是什么?
    KasonPasser
    KasonPasser
    Apr 10, 2020
    23
    现在面试都是考这些基础性的东西了吗?
    Jrue0011
    Jrue0011
    Apr 10, 2020❤️1
    24
    我之前看 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
    useben
    Apr 10, 2020
    25
    面试还会问自己不熟悉的知识的? 难道真的只是问问
    BlackBerry999
    BlackBerry999
    Apr 10, 2020
    26
    @ipwx 非对称加密 不是公钥加密,私钥解密吗?
    BlackBerry999
    BlackBerry999
    Apr 10, 2020
    27
    @ipwx 我明白了,私钥加密是防篡改,公钥加密是防破解。
    exploreXin
    exploreXin
    Apr 10, 2020❤️3
    28
    本想下笔千言,但是又不知道从何介绍起,《深入浅出密码学》,还是推荐楼主看下这本书,书名看起来有点像七天精通 XXX 的烂书,但实际上这是我读过最好的一本介绍密码学的书籍,里面既有易懂得密码学介绍,又有高深的数学理论,看不懂的可以暂时跳过,以后慢慢的反复阅读几遍,就能领会其中的奥秘了,万维网中的加密技术,都不会超出这本书的范畴,并且加密算法绝对不仅仅是 MD5,哈希这几个,加密算法多如牛毛,又复杂的,有简单的,有免费的,有收费的,哪个好哪个坏,只能在具体场景里去评判,才是最客观的。
    shawndev
    shawndev
    Apr 10, 2020
    29
    Secure Hash Algorithm 256, 这样能接受吗
    xFrye
    xFrye
    Apr 10, 2020❤️1
    30
    我好像理解了为什么有的人面试会觉得恼火
    index90
    index90
    Apr 10, 2020
    31
    应该说用到签名算法,哈希只是函数不是算法。
    签名算法可以用 hash+id+secretkey+验证函数,也可以用 RSA 签名算法
    Citrus
    Citrus
    Apr 10, 2020 via iPhone
    32
    @exploreXin 我都不知道你是在黑这本书还是在夸。。。搞得我想买回来看看一探究竟。。。
    shawndev
    shawndev
    Apr 10, 2020
    33
    @index90 这种确定不是叫 hmac,hash based message authentication code 算法吗?
    bk201
    bk201
    Apr 10, 2020
    34
    不太明白,自己原理都不懂,问啥原理?
    mxT52CRuqR6o5
    mxT52CRuqR6o5
    Apr 10, 2020
    35
    迷惑行为
    index90
    index90
    Apr 10, 2020
    36
    @shawndev 对,HMAC 就是基于哈希函数的签名算法
    exploreXin
    exploreXin
    Apr 10, 2020
    37
    @Citrus 可以买一本研究研究 ^_^
    whoami9894
    whoami9894
    Apr 10, 2020
    38
    你可以这样理解 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
    whoami9894
    Apr 10, 2020
    39
    @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
    changePro
    Apr 10, 2020
    40
    "写了几年程序,最近面试几个新同学“ “密文” 哈哈哈哈,笑死我了。
    revalue
    revalue
    OP
    Apr 10, 2020
    41
    @whoami9894 @changePro jwt 用到的就是数字签名,其实没有产生需要被解密的密文。
    上面说 HS 和 RS,区别就是签名的时候用的是 HMAC_SHA256 还是私钥签名。还有验签使用对应的手法就行了。

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