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

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

使用 RSA 驗證和簽署從 NodeJS 到戈朗的 JSON 網絡令牌,反之亦然?

使用 RSA 驗證和簽署從 NodeJS 到戈朗的 JSON 網絡令牌,反之亦然?

Go
天涯盡頭無女友 2022-09-12 16:05:12
我在 Golang 中生成了一個私鑰,該私鑰應該用于對頒發給 NodeJS 中編碼的其他服務的 JSON Web 令牌進行簽名。在令牌進行任何交換之前,NodeJS 服務應存儲 Golang 客戶端的公鑰。我的問題是,我不知道如何導出rsa。公鑰轉換為與NodeJS npmjs.com/package/jsonwebtoken 一起使用的格式,并在另一個方向上執行相同的操作;這意味著為 Golang 客戶端提供 NodeJS 服務的公鑰來驗證傳入的令牌。編輯:有問題的代碼 https://github.com/zarkones/XENA 在文件 /xena-apep/main.go 第 16 行和第 36 行下查找。編輯2:以下是有問題的代碼:var privateIdentificationKey = generatePrivateKey() // Generating the private key.identify(id.String(), privateIdentificationKey.publicKey) // Won't work because of the type miss-match./* Generates a private key. */func generatePrivateKey() *rsa.PrivateKey {    secret, err := rsa.GenerateKey(rand.Reader, 4096)    if err != nil {        fmt.Println(err)    }    return secret}/* Makes Xena-Atila aware of its existence. */func identify(id string, identificationKey string) {    insertionPayload := []byte(`{"id":"` + id + `","identificationKey":"` + identificationKey + `","status":"ALIVE"}`)    request, err := http.NewRequest("POST", centralizedHost+"/v1/clients", bytes.NewBuffer(insertionPayload))    request.Header.Set("Content-Type", "application/json")    if err != nil {        fmt.Println("Unable to connect to the centralized host.")    }    client := &http.Client{}    response, err := client.Do(request)    defer response.Body.Close()}
查看完整描述

1 回答

?
largeQ

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

來自 node-jsonwebtoken 的 和 和 方法 需要 PEM 編碼的密鑰。因此,節點 JS 端將提供 PEM 編碼的公鑰或需要 PEM 編碼的密鑰(X.509/SPKI 格式或 PKCS#1 格式)。jwt.sign()jwt.verify()


密鑰導出和導入在包中的 Go 中實現,PEM 編碼在包中實現,RSA 在包中實現。crypto/x509encoding/pemcrypto/rsa


使用 Go 中發布的方法生成私鑰和公鑰是:GeneratePrivateKey()


privateKey := GeneratePrivateKey()

publicKey := &privateKey.PublicKey

可以在 Go 中導出 X.509/SPKI 格式的 PEM 編碼公鑰,例如:


func ExportSPKIPublicKeyPEM(pubkey *rsa.PublicKey) (string){

    spkiDER, _ := x509.MarshalPKIXPublicKey(pubkey)

    spkiPEM := pem.EncodeToMemory(

        &pem.Block{

            Type:  "PUBLIC KEY",

            Bytes: spkiDER,

        },

    )

    return string(spkiPEM)

}

或者,可以使用 導出 PKCS#1 格式的 PEM 編碼公鑰。為此,必須指定。MarshalPKCS1PublicKey()TypeRSA PUBLIC KEY


導出的密鑰可以使用 ASN.1 解析器進行檢查,例如,使用以下命令聯機檢查:https://lapo.it/asn1js/


在 Go 中可以導入 X.509/SPKI 格式的 PEM 編碼公鑰,例如:


func ImportSPKIPublicKeyPEM(spkiPEM string) (*rsa.PublicKey) {

    body, _ := pem.Decode([]byte(spkiPEM )) 

    publicKey, _ := x509.ParsePKIXPublicKey(body.Bytes)

    if publicKey, ok := publicKey.(*rsa.PublicKey); ok {

        return publicKey

    } else {

        return nil

    }   

}

可以使用 PKCS#1 格式的 PEM 編碼公鑰進行導入。ParsePKCS1PublicKey()


查看完整回答
反對 回復 2022-09-12
  • 1 回答
  • 0 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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