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

2020-04-09 22:35:32 +08:00
 revalue
JWT 就是 JSON Web Token 。

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

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

不就是 SHA256 ?难道时带变了?
6657 次点击
所在节点    程序员
48 条回复
geelaw
2020-04-10 01:50:16 +08:00
@ipwx #19 #20 基于 RSA 签名算法并不是“用私钥加密”,根本没有“加密”的概念。

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/660969

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX