亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Java 驗證在 Golang 中創建的簽名

使用 Java 驗證在 Golang 中創建的簽名

Go
千萬里不及你 2023-06-19 15:36:49
我在 Go 中創建一個簽名,例如://I'm reading a file with -----BEGIN RSA PRIVATE KEY-----privateKeyPem := strings.Replace(privateKeyString, `\n`, "\n", -1) //file has '/n' instead of break lines for dev purposesblock, _ := pem.Decode([]byte(privateKeyPem))key, _ := x509.ParsePKCS1PrivateKey(block.Bytes)hashedString := sha256.Sum256([]byte(stringTosign))signature, err = rsa.SignPKCS1v15(rand.Reader, key, crypto2.SHA256, hashedString[:])signatureString := base64.StdEncoding.EncodeToString(signature)Java 程序接收變量 signatureString 并執行以下操作:byte[] keyBytes = Files.readAllBytes(Paths.get("./golangSignerPubKey.der"));X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);KeyFactory kf = KeyFactory.getInstance("RSA");PublicKey publicKey =  kf.generatePublic(spec);Signature signature = Signature.getInstance("SHA256withRSA", "BC");signature.initVerify(publicKey);signature.update(stringUnsigned.getBytes());boolean signatureIsValid = signature.verify(Base64.getDecoder().decode(signatureString.getBytes()));但是 signatureIsValid 布爾值始終為假,我做錯了什么嗎?
查看完整描述

1 回答

?
弒天下

TA貢獻1818條經驗 獲得超8個贊

我能夠驗證簽名。我在這里發帖以防有人遇到同樣的問題:


Go 中的簽名創建:


bytesToSign := []byte (stringToSign)

block, err8 := pem.Decode([]byte(privateKeyPem)) //-----BEGIN RSA PRIVATE KEY----

if err8 != nil {

    logger.Debugf("Error trying decode endorser private key")

}

key, _ := x509.ParsePKCS1PrivateKey(block.Bytes)

h := sha256.New()

h.Write(bytesToSign)

d := h.Sum(nil)

signature, err = rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, d)

if err != nil {

    panic(err)

}

signatureString = base64.StdEncoding.EncodeToString(signature)

Java 中的簽名驗證(接收 signatureString):我在 .pub 文件中有公鑰,并且:


byte[] keyBytes = Files.readAllBytes(Paths.get("./public_key.pub"));

String temp = new String(keyBytes);

String publicKeyPEM = temp.replace("-----BEGIN PUBLIC KEY-----\n", "");

publicKeyPEM = publicKeyPEM.replace("\n-----END PUBLIC KEY-----", "");

BASE64Decoder b64= new BASE64Decoder();

byte[] decoded = b64.decodeBuffer(publicKeyPEM);

X509EncodedKeySpec spec = new X509EncodedKeySpec(decoded);

KeyFactory kf = KeyFactory.getInstance("RSA");

publicKey = kf.generatePublic(spec);

Signature signature = Signature.getInstance("SHA256withRSA", "BC");

signature.initVerify(publicKey);

signature.update(bytesToVerify); //bytesToVerify = bytesToSign in go

byte[] signatureDecoded = Base64.getDecoder().decode(signatureString);

boolean endorserSignatureIsValid = signature.verify(signatureDecoded);

//It is now valid

我無法使用 Base64.getDecoder() (java.lang.IllegalArgumentException: Illegal base64 character a) 來解碼 publicKeyPEM,所以我使用了 BASE64Decoder。不知道為什么。


查看完整回答
反對 回復 2023-06-19
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

我昨天也遇到這個問題,最后解決了。

它可能對其他人有幫助:https ://github.com/xioxu/signature_in_multiple_lang


查看完整回答
反對 回復 2023-06-19
  • 1 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號