需求
首先在golang
中生成keypair
,javascript
向golang
发送数据前,先请求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)
}