背景
是为了解决服务之间通信加密,或想免除服务间鉴权但是又担心服务被恶意调用的问题.
原理
A 服务和 B 服务通过各自生成一对公钥和私钥,将各自的公钥发送给对方.A 服务通过 ECDH 算法传入 A 服务的私钥和 B 服务的公钥会协商出一个共享公钥 shareKey. 然后将 A 服务的公钥发送给 B 服务,B 服务同理也可协商出共享公钥.预期的结果是 AB 两个服务协商出的shareKey是一致的.后续 AB 服务使用这个key用来加密通信的内容.用各自的私钥进行解密.
代码
客户端
func ExchangeKey() error {
curve := ecdh.P256()
clientPri, _ := curve.GenerateKey(rand.Reader)
clientPub := clientPri.PublicKey()
der, _ := x509.MarshalPKIXPublicKey(clientPub)
rlog.Info("post secret: ", der)
serverDer, err := httpPostSecret(der)
if err != nil {
rlog.Error(err)
return err
}
serverPub, err := x509.ParsePKIXPublicKey(serverDer)
if err != nil {
rlog.Error(err)
return err
}
serverKey, _ := serverPub.(*ecdsa.PublicKey).ECDH()
Secret, err = clientPri.ECDH(serverKey)
if err != nil {
rlog.Error(err)
return err
}
rlog.Info("result secret: ", Secret)
return nil
}
服务端
func ExchangeKey() ([]byte,error){
cpub, err := x509.ParsePKIXPublicKey(content)
if err != nil {
log.Error(err)
return nil, err
}
ckey, err := cpub.(*ecdsa.PublicKey).ECDH()
if err != nil {
log.Error(err)
return nil, err
}
spub, privateKey, err := ecdhkey()
if err != nil {
log.Error(err)
return nil, err
}
secret, err := privateKey.ECDH(ckey)
if err != nil {
log.Error(err)
return nil, err
}
Secret = secret
return spub, nil
}
评论