使用"Paseto Token"生成的"token"能否像"JWT Token"一样被解密查看?

Can "token" generated using "Paseto Token" be decrypted and viewed like "JWT Token"?

我在 Golang 中为 oAuth 使用 "Platform agnostic Security Token" - https://github.com/o1egl/paseto

我无法理解为什么即使阅读了 README

也比 JWT 更好

我的主要问题是:

  1. 生成的"token"能否像"JWT"一样被修改并传递修改或篡改的数据?
  2. 使用"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 变量的末尾解密数据中获取该值。

我们可以使用 newJsonToken.Get("data").

获取 "data" 键的值

但是上面的数据是"verifiable"并且不能在用户端被篡改或修改吗?

就像在 JWT.io 的 JWT 调试器中一样,人们可以篡改数据并知道算法并传递 "modified" 数据。

用户也可以对我生成的令牌执行相同的操作吗?他们可以解码并传递篡改数据吗?或者他们根本无法解码数据或查看实际数据?

1 - Can "token" generated be altered like "JWT" and pass modified or tampered data?

请注意,令牌不能 "altered" 在不知道签名密钥(当然应该是秘密的)的情况下使用 PASETO 或 JWT。

您提到能够 查看 JWT.io 页面中的 JWT 令牌数据是因为数据未加密(因此您可以在没有密钥的情况下看到它).

但令牌已签名,因此如果您修改任何值但没有密钥,您将无法重新签名,并且令牌接收方在尝试验证令牌时会注意到令牌无效.

2 - Can "token" generated using "paseto" be decrypted and viewed like "JWT"?

这取决于您如何生成 PASETO 令牌。

看这里:

https://tools.ietf.org/id/draft-paragon-paseto-rfc-00.html#rfc.section.2

令牌的格式为 version.purpose.payload

来自文档:

The payload is a string that contains the token's data. In a local token, this data is encrypted with a symmetric cipher. In a public token, this data is unencrypted.

因此,如果您像发布的代码片段中那样生成令牌(本地令牌,带有对称密钥),则负载将被加密(除非您知道对称密钥,否则您将无法看到它,并且用那个解密它)。

如果您使用 public/private 密钥对,则有效载荷将不会被加密,因此您可以 查看它 而无需密钥(但您在不知道私钥的情况下将无法更改它并再次签名)。