使用“Paseto Token”生成的“token”能否像“JWT Token”一样进行解密和查看?
Posted
技术标签:
【中文标题】使用“Paseto Token”生成的“token”能否像“JWT Token”一样进行解密和查看?【英文标题】:Can "token" generated using "Paseto Token" be decrypted and viewed like "JWT Token"? 【发布时间】:2019-11-24 16:44:14 【问题描述】:我在 Golang 中使用“平台无关安全令牌”进行 oAuth - https://github.com/o1egl/paseto
我无法理解,为什么即使在阅读 README 之后这也比 JWT 好
我的主要问题是:
-
生成的“令牌”能否像“JWT”一样被更改并传递修改或篡改的数据?
使用“paseto”生成的“token”能否像“JWT”一样被解密和查看?
上面的 Paseto 库在其 JSONToken 方法中使用“SET”和“GET”方法。这样我们就可以验证用户的真实性了吗?
示例代码:
symmetricKey := []byte("YELLOW SUBMARINE, BLACK WIZARDRY") // Must be 32 bytes
now := time.Now()
exp := now.Add(24 * time.Hour)
nbt := now
jsonToken := paseto.JSONToken
Audience: "test",
Issuer: "test_service",
Jti: "123",
Subject: "test_subject",
IssuedAt: now,
Expiration: exp,
NotBefore: nbt,
// Add custom claim to the token
jsonToken.Set("data", "this is a signed message")
footer := "some footer"
v2 := paseto.NewV2()
// Encrypt data
token, err := v2.Encrypt(symmetricKey, jsonToken, footer)
// token = "v2.local.E42A2iMY9SaZVzt-WkCi45_aebky4vbSUJsfG45OcanamwXwieieMjSjUkgsyZzlbYt82miN1xD-X0zEIhLK_RhWUPLZc9nC0shmkkkHS5Exj2zTpdNWhrC5KJRyUrI0cupc5qrctuREFLAvdCgwZBjh1QSgBX74V631fzl1IErGBgnt2LV1aij5W3hw9cXv4gtm_jSwsfee9HZcCE0sgUgAvklJCDO__8v_fTY7i_Regp5ZPa7h0X0m3yf0n4OXY9PRplunUpD9uEsXJ_MTF5gSFR3qE29eCHbJtRt0FFl81x-GCsQ9H9701TzEjGehCC6Bhw.c29tZSBmb290ZXI"
// Decrypt data
var newJsonToken paseto.JSONToken
var newFooter string
err := v2.Decrypt(token, symmetricKey, &newJsonToken, &newFooter)
现在,如果您看到代码:jsonToken.Set("data", "this is a signed message")
,我们可以在创建 newJsonToken
变量的末尾处的 Decrypt data 中获取该值。
我们可以通过newJsonToken.Get("data")
获取“data”键的值。
但是上面的数据是“可验证的”,在用户端不能被篡改吗?
就像在 JWT.io 的 JWT 调试器中一样,人们可以篡改数据并知道算法并传递“修改”的数据。
用户也可以对我生成的令牌执行相同的操作吗?他们可以解码和传递被篡改的数据吗?或者他们根本无法解码数据或查看实际数据?
【问题讨论】:
人们如何篡改 JWT 数据?它已签名。您需要知道密钥(是的,如果这不是秘密,那么当然一切都会崩溃)。 如果你可以在jwt.io上查看token的内容,那么它不是加密而只是encoded(base64url编码),因此无需解密,只需解码。如果您需要加密数据,您还可以使用 JWE,即 JWT 的加密变体。 【参考方案1】:1 - 生成的“令牌”能否像“JWT”一样被更改并传递修改或篡改的数据?
请注意,在不知道签名密钥(当然应该是秘密的)的情况下,使用 PASETO 或 JWT 不能“更改”令牌。
您提到能够在 JWT.io 页面中查看 JWT 令牌数据的事实是因为数据未加密(因此您可以在没有密钥的情况下查看它)。
但是令牌是签名的,所以如果您修改任何值并且没有密钥,您将无法重新签名,并且令牌接收者会在尝试验证令牌时注意到令牌无效。
2 - 使用“paseto”生成的“token”能否像“JWT”一样被解密和查看?
这取决于您如何生成 PASETO 令牌。
看这里:
https://tools.ietf.org/id/draft-paragon-paseto-rfc-00.html#rfc.section.2
令牌的格式是version.purpose.payload
。
并且来自文档:
有效负载是一个包含令牌数据的字符串。在本地令牌中,此数据使用对称密码进行加密。在公共令牌中,此数据未加密。
因此,如果您按照发布的代码 sn-p 生成令牌(本地令牌,使用对称密钥),则有效负载将被加密(除非您知道对称密钥,否则您将无法看到它并且用那个来解密它)。
如果您使用公钥/私钥对,那么负载将不会被加密,因此您将能够在没有密钥的情况下看到它(但您将无法更改它并在不知道私钥的情况下再次签名)。
【讨论】:
如果没有秘密签名字符串,用户无论如何都无法传递篡改数据并得到验证。以上是关于使用“Paseto Token”生成的“token”能否像“JWT Token”一样进行解密和查看?的主要内容,如果未能解决你的问题,请参考以下文章