通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

javascript对接golang使用rsa加密

javascript对接golang使用rsa加密

在整合JavaScript与Golang应用程序进行安全通信时,使用RSA加密是一种行之有效的方法,它确保了数据在客户端和服务器之间传输的安全性。这种方法通常涉及生成密钥对、加密数据、解密数据等关键步骤。接下去,将详细介绍生成密钥对的过程。

生成密钥对是整个安全通信过程的基础。在Golang中,可以通过crypto/rsa包来生成RSA密钥对。生成的私钥保留在服务器端,用于解密或签名数据;而公钥则可以安全地发送给客户端(例如,使用Javascript进行操作),用于数据加密。这确保了只有持有对应私钥的服务器能够解密由客户端加密的数据,从而实现安全的数据传输。

一、 RSA加密概述

RSA加密是一种非对称加密技术,它依赖于一对密钥:公钥和私钥。公钥用于加密数据,而私钥则用于解密。这种方法的一个关键优点是,即便公钥是公开的,没有对应的私钥,也无法解密数据,从而保证了通信的安全性。

在使用RSA加密进行JavaScript和Golang之间的数据交换时,首先需要在Golang服务器端生成密钥对,并将公钥发送到客户端(JavaScript)。客户端使用公钥加密数据,然后发送回服务器端。服务器端持有私钥,因此可以解密接收到的加密数据。

二、 GOLANG端的密钥生成与管理

在Golang端,密钥的生成和管理是通过内置的crypto/rsa库完成的。生成RSA密钥对的过程包括指定密钥的位大小(常用的如2048位)、利用随机数生成器创建密钥对。生成密钥对后,公钥可以被导出并发送给JavaScript客户端,而私钥则需安全存储于服务器端。

密钥生成示例

package mAIn

import (

"crypto/rand"

"crypto/rsa"

"crypto/x509"

"encoding/pem"

"os"

)

func main() {

privateKey, err := rsa.GenerateKey(rand.Reader, 2048)

if err != nil {

panic(err)

}

publicKey := &privateKey.PublicKey

savePEMKey("private.pem", privateKey)

savePublicPEMKey("public.pem", publicKey)

}

func savePEMKey(fileName string, key *rsa.PrivateKey) {

var privateKey = &pem.Block{

Type: "RSA PRIVATE KEY",

Bytes: x509.MarshalPKCS1PrivateKey(key),

}

file, err := os.Create(fileName)

if err != nil {

panic(err)

}

defer file.Close()

pem.Encode(file, privateKey)

}

func savePublicPEMKey(fileName string, pubkey *rsa.PublicKey) {

var pemkey = &pem.Block{

Type: "RSA PUBLIC KEY",

Bytes: x509.MarshalPKCS1PublicKey(pubkey),

}

file, err := os.Create(fileName)

if err != nil {

panic(err)

}

defer file.Close()

pem.Encode(file, pemkey)

}

这段代码演示了如何在Golang中生成RSA密钥对,并将它们分别保存为PEM格式的文件。公钥文件可以安全地分发给需要加密数据的客户端。

三、 JAVASCRIPT端加密数据

在客户端,使用JavaScript进行RSA加密时,可以通过Web Cryptography API 或第三方库实现。首先需要获取到从Golang服务器端提供的公钥,然后使用此公钥对数据进行加密。

使用Web Cryptography API示例

async function encryptWithPublicKey(publicKey, data) {

let enc = new TextEncoder();

let encoded = enc.encode(data);

let publicKeyObj = await window.crypto.subtle.importKey(

"spki",

publicKey,

{

name: "RSA-OAEP",

hash: {name: "SHA-256"},

},

true,

["encrypt"]

);

return window.crypto.subtle.encrypt(

{

name: "RSA-OAEP",

},

publicKeyObj,

encoded

);

}

这段代码展示了如何在客户端使用JavaScript的Web Cryptography API 来加密数据。首先,需要将从服务器获取的公钥转换成Web Crypto API可以使用的格式,然后对需要发送的数据进行加密。

四、 在GOLANG端解密数据

接收加密数据后,Golang服务器使用私钥对数据进行解密。由于只有服务器拥有正确的私钥,因此这一过程确保了只有预期的收件人可以阅读信息。

解密数据示例

package main

import (

"crypto/rand"

"crypto/rsa"

"crypto/x509"

"encoding/pem"

"os"

"io/ioutil"

)

func decryptWithPrivateKey(privateKey *rsa.PrivateKey, ciphertext []byte) ([]byte, error) {

return rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, ciphertext, nil)

}

func main() {

privatePem, err := ioutil.ReadFile("private.pem")

if err != nil {

panic(err)

}

block, _ := pem.Decode(privatePem)

if block == nil {

panic("failed to parse PEM block containing the key")

}

privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)

if err != nil {

panic(err)

}

// Assuming `encryptedData` is the data received from the client

decryptedData, err := decryptWithPrivateKey(privateKey, encryptedData)

if err != nil {

panic(err)

}

fmt.Println("Decrypted data:", string(decryptedData))

}

本段示例代码说明了如何在Golang端使用私钥对接收到的加密数据进行解密。解密过程要求严格与加密时使用的参数相匹配,确保数据能够成功解密。

总结

通过在JavaScript客户端与Golang服务器端之间采用RSA加密通信,可以保障数据传输的安全性。本文介绍了整个过程中涉及的关键步骤:生成RSA密钥对、客户端数据加密以及服务器端数据解密。这种方法不仅适用于保护数据的安全,也适用于确保数据交换的完整性和可靠性。

相关问答FAQs:

如何在Javascript中使用RSA加密与Golang对接?
使用RSA算法进行加密通常需要在前端使用Javascript生成公钥-私钥对,然后将公钥传输给Golang后端,后端将使用私钥进行解密。下面提供了一些详细步骤:

1. 前端在Javascript中生成RSA密钥对
前端可以使用开源的js库(如JSEncrypt)生成RSA密钥对。首先,引入相关js库文件,然后使用以下代码生成密钥:

var crypt = new JSEncrypt();
crypt.getKey();
var publicKey = crypt.getPublicKey();
console.log(publicKey); // 打印公钥

2. 将公钥传输给Golang后端
使用AJAX将前端生成的公钥传输给Golang后端,后端将使用该公钥进行加密。

3. Golang后端进行RSA加密
在Golang后端,可以使用RSA库(如crypto/rsa)加载前端传递的公钥,然后使用该公钥进行加密。

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/x509"
    "encoding/pem"
    "fmt"
)

func encrypt(plainText []byte, publicKey []byte) ([]byte, error) {
    block, _ := pem.Decode(publicKey)
    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        return nil, err
    }

    pubKey := pubInterface.(*rsa.PublicKey)
    cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, plainText)
    if err != nil {
        return nil, err
    }
    return cipherText, nil
}

func main() {
    // 假设接收到的前端公钥为publicKey
    publicKey := []byte("-----BEGIN PUBLIC KEY-----\n...") // 这里替换为真实的公钥
    plainText := []byte("Hello World!")

    cipherText, err := encrypt(plainText, publicKey)
    if err != nil {
        fmt.Println("Encryption error: ", err)
        return
    }

    fmt.Printf("Cipher text: %x\n", cipherText)
}

上述代码展示了如何使用前端传递的公钥对明文进行加密。你可以将这个代码块放在合适的函数中,以便根据你的应用需求进行调用。

希望这些步骤对你有所帮助!如果还有任何疑问,请随时提问。

相关文章