使用“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”一样进行解密和查看?的主要内容,如果未能解决你的问题,请参考以下文章

JWT生成token及过期处理方案

token-使用jwt生成token

JWT生成token及过期处理方案

什么是token及怎样生成token

什么是token及怎样生成token

node借助jsonwebtoken生成token以及验证token是否过期