使用"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 更好
我的主要问题是:
- 生成的"token"能否像"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
变量的末尾解密数据中获取该值。
我们可以使用 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 密钥对,则有效载荷将不会被加密,因此您可以 查看它 而无需密钥(但您在不知道私钥的情况下将无法更改它并再次签名)。
我在 Golang 中为 oAuth 使用 "Platform agnostic Security Token" - https://github.com/o1egl/paseto
我无法理解为什么即使阅读了 README
也比 JWT 更好我的主要问题是:
- 生成的"token"能否像"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
变量的末尾解密数据中获取该值。
我们可以使用 newJsonToken.Get("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 密钥对,则有效载荷将不会被加密,因此您可以 查看它 而无需密钥(但您在不知道私钥的情况下将无法更改它并再次签名)。