使用“ Paseto令牌”生成的“令牌”是否可以解密并像“ JWT令牌”一样查看?

时间:2019-07-16 01:17:17

标签: go encryption oauth jwt sts-securitytokenservice

我正在Golang中为oAuth使用“平台不可知安全令牌”-https://github.com/o1egl/paseto

我不明白,即使阅读README,为什么它比JWT更好

我的主要问题是:

  1. 生成的“令牌”是否可以像“ JWT”那样进行更改并传递经过修改或篡改的数据?
  2. 使用“ paseto”生成的“令牌”是否可以解密并像“ 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")获得“数据”键的值。

但是上述数据是否“可验证”并且不能在用户端被篡改或修改?

就像JWT.io中的JWT调试器一样,人们可以篡改数据并了解算法并传递“修改后的”数据。

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

1 个答案:

答案 0 :(得分:2)

  

1-可以像“ JWT”一样更改生成的“令牌”并传递经过修改或篡改的数据吗?

请注意,在不知道签名密钥(当然应该是秘密的)的情况下,无法使用PASETO或JWT来“更改”令牌。

您提到能够在JWT.io页面中查看的JWT令牌数据的事实是因为数据未加密(因此您无需密钥即可看到它)。

但是令牌已签名,因此,如果您修改任何值并且没有密钥,您将无法对其进行签名,并且令牌接收者会在尝试验证令牌时注意到令牌无效。< / p>

  

2-使用“ paseto”生成的“令牌”是否可以解密并像“ JWT”一样查看?

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

查看此处:

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

令牌的格式为version.purpose.payload

从文档中:

  

有效载荷是一个包含令牌数据的字符串。在本地令牌中,此数据使用对称密码加密。在公共令牌中,此数据未加密。

因此,如果按照发布的代码段中的方式生成令牌(本地令牌,带有对称密钥),则有效负载将被加密(除非知道对称密钥并使用,否则您将无法看到它)一个来解密它。

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