共计 1168 个字符,预计需要花费 3 分钟才能阅读完成。
需要
首先在 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) | |
} |
正文完