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

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

  •  
  •   revalue · 92 天前 · 4792 次点击
    这是一个创建于 92 天前的主题,其中的信息可能已经有所发展或是发生改变。
    JWT 就是 JSON Web Token 。

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

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

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

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

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

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

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

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