乐趣区

关于rsa:在golang与javascript中使用RSA

需要

首先在 golang 中生成 keypairjavascriptgolang发送数据前,先申请 publickey API 获取 publickey,而后基于publickey 加密数据,最初将被加密的数据发送给golang

实现

一、golang 生成 keypair

var (
    privateKey *rsa.PrivateKey
    publicKey  *rsa.PublicKey
    publicKeyString string
)

if pri, err := rsa.GenerateKey(rand.Reader, 32); err != nil {panic(err)
} else {
    privateKey = pri
    publicKey = &pri.PublicKey
}

// 将 publicKey 转换为 PKIX, ASN.1 DER 格局
if derPkix, err := x509.MarshalPKIXPublicKey(publicKey); err != nil {return err} else {
    // 设置 PEM 编码构造
    block := pem.Block{
        Type:  "RSA PUBLIC KEY",
        Bytes: derPkix,
    }
    // 将 publicKey 以字符串模式返回给 javascript
    publicKeyString = string(pem.EncodeToMemory(&block))
}

二、javascript 应用 publickey 加密数据

  • 装置jsencrypt

    npm install jsencrypt
  • 获取publickey

    const [pk, setPK] = useState('')
    useEffect(() => {fetch(`${url}`, {method: 'GET'})
          .then(r => r.json())
          .then(d => {if (d.hasOwnProperty('public_key'))
                  setPK(d.public_key)
              else
                  alert('API 返回值短少必要字段!')
          })
          .catch(e => {alert(e)})
    }, [])
  • 加密用户数据

    let encryptor = new JSEncrypt() // 新建 JSEncrypt 对象
    encryptor.setPublicKey(pk) // 设置 publickey
    let ciphertext = encryptor.encrypt(data) // 加密 data

三、golang 应用 privatekey 解密数据

// 解码 base64 字符串
bytes, err := base64.StdEncoding.DecodeString(ciphertext)
if err != nil {panic(err)
}

// 解密
plaintext, e := rsa.DecryptPKCS1v15(rand.Reader, privateKey, bytes,)
if err != nil {panic(e)
}
退出移动版