V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
revalue
V2EX  ›  程序员

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

  •  
  •   revalue · 2020-04-09 22:35:32 +08:00 · 6577 次点击
    这是一个创建于 1690 天前的主题,其中的信息可能已经有所发展或是发生改变。
    JWT 就是 JSON Web Token 。

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

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

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

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

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

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

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

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