面试遇到个怪像: JWT 没用到哈希算法,也没用到不可逆加密啊 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
revalue
V2EX    程序员

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

  •  
  •   revalue 2020-04-09 22:35:32 +08:00 7031 次点击
    这是一个创建于 2090 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     939 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 22:48 PVG 06:48 LAX 14:48 JFK 17:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86