标签搜索
侧边栏壁纸
  • 累计撰写 7 篇文章
  • 累计收到 1 条评论
Go

Go实现密钥协商

lxp
lxp
2024-07-30 / 0 评论 / 9 阅读 / 正在检测是否收录...

背景

是为了解决服务之间通信加密,或想免除服务间鉴权但是又担心服务被恶意调用的问题.

原理

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
}
0

评论

博主关闭了当前页面的评论