我正在尝试创建一个JWE解密函数,但在确定如何使用Go Jose接口时遇到了困难。我已经使用密码分析了加密(对于这个用例,我更喜欢密码):
token := jwt.NewWithClaims(
jwt.SigningMethodHS256,
claims,
)
ss, err := token.SignedString("thisisatestpassphraserighthere")
if err != nil {
panic("COULD_NOT_GENERATE")
return
}
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err)
}
publicKey := &privateKey.PublicKey
encrypter, err := jose.NewEncrypter(
jose.A128CBC_HS256,
jose.Recipient{Algorithm: jose.RSA_OAEP, Key: publicKey},
nil,
)
if err != nil {
return
}
object, err := encrypter.Encrypt([]byte(ss))
if err != nil {
errRes = s.Error(codes.Internal, err, nil)
return
}
key, err := object.CompactSerialize()
if err != nil {
errRes = s.Error(codes.Internal, err, nil)
return
}
fmt.Println(key)上面的代码创建一个JWT,对它进行编码,压缩它并返回键。然而,现在还不完全清楚如何用密码解密它。
JWE在Jose文档上有一个示例:https://godoc.org/gopkg.in/square/go-jose.v2#example-Encrypter--Encrypt
所以我考虑到了这一点:
object, err = jose.ParseEncrypted(Key)
if err != nil {
panic(err)
}
decrypted, err := object.Decrypt(...)在椭圆内,我不知道该放什么。我似乎无法根据密码来决定如何传递密钥。
发布于 2019-12-05 17:54:19
我好像做错了几件事。首先,rsa.GenerateKey使用随机值。这是完全错误的:-p以下是如何使用令牌将JWT加密为JWE的:
rcpt := jose.Recipient{
Algorithm: jose.PBES2_HS256_A128KW,
Key: "mypassphrase",
PBES2Count: 4096,
PBES2Salt: []byte{ your salt... },
}
enc, err := jose.NewEncrypter(jose.A128CBC_HS256, rcpt, nil)
if err != nil {
panic("oops")
}
jewPlaintextToken, err := enc.Encrypt(jwtToken)
if err != nil {
panic("oops")
}
key, err := object.CompactSerialize()
if err != nil {
panic("oops")
}你就是这样解密的:
// Decrypt the receive key
jwe, err := jose.ParseEncrypted(jewPlaintextToken)
if err != nil {
panic("oops")
}
decryptedKey, err := jwe.Decrypt("mypassphrase")
if err != nil {
panic("oops")
}如果有人发现此方法存在任何重大问题/安全问题,请提及。
发布于 2019-12-05 15:07:15
在椭圆中的
,我不知道该放什么。我似乎无法根据密码来决定如何传递密钥。
从文档中的JWE示例中,您必须传递私钥。有关解密,请参见下面部分。
https://godoc.org/gopkg.in/square/go-jose.v2#JSONWebEncryption.Decrypt
// Generate a public/private key pair to use for this example.
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err)
}
// Parse the serialized, encrypted JWE object. An error would indicate that
// the given input did not represent a valid message.
object, err = ParseEncrypted(serialized)
if err != nil {
panic(err)
}
// Now we can decrypt and get back our original plaintext. An error here
// would indicate the the message failed to decrypt, e.g. because the auth
// tag was broken or the message was tampered with.
decrypted, err := object.Decrypt(privateKey)
if err != nil {
panic(err)
}
fmt.Printf(string(decrypted))https://stackoverflow.com/questions/59197770
复制相似问题