登录
首页 >  Golang >  Go问答

在 Golang 中验证 Java 签名的有效负载时出现了ED25519错误

来源:stackoverflow

时间:2024-02-23 13:27:29 256浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《在 Golang 中验证 Java 签名的有效负载时出现了ED25519错误》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

我有两个独立的应用程序,一个用 java 编写,另一个用 golang 编写。 java应用程序负责生成密钥对,其中的公钥与golang应用程序共享。每当需要对任何有效负载进行签名时,golang 应用程序都会向 java 应用程序发送请求并获取 base64 编码的签名作为回报。该签名需要使用公钥进行验证。 golang应用程序验证总是失败。但是,我能够在 java 应用程序中成功验证。如果密钥生成和签名有效负载也是使用 golang 完成的,那么 golang 中的验证就可以工作。

对于 java,我使用 bouncy castle 库,对于 golang,我使用包 https://pkg.go.dev/crypto/ed25519。

生成密钥

ed25519keypairgenerator keypairgenerator = new ed25519keypairgenerator();
keypairgenerator.init(new ed25519keygenerationparameters(new securerandom()));
asymmetriccipherkeypair asymmetriccipherkeypair = keypairgenerator.generatekeypair();
ed25519privatekeyparameters privatekey = (ed25519privatekeyparameters) asymmetriccipherkeypair.getprivate();
ed25519publickeyparameters publickey = (ed25519publickeyparameters) asymmetriccipherkeypair.getpublic();
string privatekey = base64.getencoder().encodetostring(privatekey.getencoded());
string publickey = base64.getencoder().encodetostring(publickey.getencoded());

签署有效负载

byte[] privatekeycontent = base64.getdecoder().decode(privatekeyinfo);
ed25519privatekeyparameters privatekeyparameters = new ed25519privatekeyparameters(privatekeycontent, 0);

byte[] payload = base64.getencoder().encode(input.getbytes(standardcharsets.utf_8));
signer signer = new ed25519signer();
signer.init(true, privatekeyparameters);
signer.update(payload, 0, payload.length);
byte[] signature = signer.generatesignature();
string encodedsignature = base64.getencoder().encodetostring(signature);

golang验证签名

func verifySignature(payload []byte, publicKeyStr string, signatureStr string) {
    publicKey, error := base64.StdEncoding.DecodeString(publicKeyStr)
    if error != nil {
        fmt.Println(error)
    } else {
        signature, error := base64.StdEncoding.DecodeString(signatureStr)
        if error != nil {
            fmt.Println(error)
        } else {
            isVerified := ed25519.Verify(publicKey, payload, signature)
            fmt.Println(isVerified)
        }

    }
}

正确答案


java 代码不会对消息本身进行签名,而是对 base64 编码的消息进行签名。

我怀疑您的验证失败,因为签名和验证的消息不同。不过,这个问题无法确定,因为您没有在 go 端发布 payload 的内容。

无论如何,如果在 java 端消息本身已签名(通常是这种情况),则验证成功:

string input = "...";
byte[] payload = input.getbytes(standardcharsets.utf_8);

类似地,如果 go 端使用未修改的 java 代码验证 base64 编码的消息(这将是相当不寻常的),则验证成功:

input := "..."
payload := []byte(base64.StdEncoding.EncodeToString([]byte(input)))

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在 Golang 中验证 Java 签名的有效负载时出现了ED25519错误》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>