我有兩個獨立的應用程式,一個是用 Java 撰寫的,另一個是用 golang 撰寫的。Java 應用程式負責生成密鑰對,其中的公鑰與 golang 應用程式共享。每當需要對任何有效負載進行簽名時,golang 應用程式都會向 Java 應用程式發送請求并獲得 base64 編碼的簽名作為回報。此簽名需要使用公鑰進行驗證。golang 應用中的驗證總是失敗。但是,我能夠在 Java 應用程式中成功驗證。如果密鑰生成和有效負載簽名也使用 golang 完成,則 golang 中的驗證有效。
對于 Java,我使用 Bouncy Castle 庫和使用包https://pkg.go.dev/crypto/ed25519的 golang 。
生成密鑰
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)
}
}
}
uj5u.com熱心網友回復:
Java 代碼不對訊息本身進行簽名,而是對 Base64 編碼的訊息進行簽名。
我懷疑您的驗證失敗,因為簽名和驗證的訊息不同。但是,這不能肯定地回答,因為您沒有payload在 Go 端發布 的內容。
在任何情況下,如果在 Java 端對訊息本身進行簽名(通常是這種情況),則驗證成功:
String input = "...";
byte[] payload = input.getBytes(StandardCharsets.UTF_8);
同樣,如果 Go 端使用未修改的 Java 代碼驗證 Base64 編碼的訊息,則驗證成功(這將是相當不尋常的):
input := "..."
payload := []byte(base64.StdEncoding.EncodeToString([]byte(input)))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422111.html
標籤:
上一篇:將結構編組到yaml時,Golang如何避免鍵“on”上的雙引號
下一篇:消除函式中多個條件檢查的優雅方法
