我正在Golang中为oAuth使用“平台不可知安全令牌”-https://github.com/o1egl/paseto
我不明白,即使阅读README,为什么它比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调试器一样,人们可以篡改数据并了解算法并传递“修改后的”数据。
用户也可以对我生成的令牌执行相同操作吗?他们可以解码并传递被篡改的数据吗?还是根本无法解码数据或查看实际数据?
答案 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
。
从文档中:
有效载荷是一个包含令牌数据的字符串。在本地令牌中,此数据使用对称密码加密。在公共令牌中,此数据未加密。
因此,如果按照发布的代码段中的方式生成令牌(本地令牌,带有对称密钥),则有效负载将被加密(除非知道对称密钥并使用,否则您将无法看到它)一个来解密它。
如果您使用公钥/私钥对,则有效负载将不会被加密,因此您可以看到它而无需密钥(但是您将无法更改它)然后在不知道私钥的情况下再次签名。