【发布时间】: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 的加密变体。
标签: go encryption oauth jwt sts-securitytokenservice