golang+protobuf+aes 数据加密和请求加密

simon_白 · · 2460 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近项目需要,使用golang+protobuf+aes cbc 对数据请求格式和数据进行加密

前篇文章已经对数据加密做了说明。
AES数据加密

本篇主要讲述如何使用protobuf 进行数据传输
protobuf的说明在这里就不阐述了

直接开始了

新建一个proto文件

#进入到项目下
$ cd test && mkdir tutorials && cd tutorials && touch User.proto

#编辑
$ vi User.proto

syntax = "proto3";
package tutorials;

message LoginRequest{
  string username = 1;
  string password = 2;
  string platform = 3;
}
message LoginResponse{
  int32 code = 1;
  string msg = 2;
}

编译成go文件

protoc -I=./tutorials/ --go_out=./tutorials/ ./tutorials/User.proto
#出现以下问题,就先安装protoc-gen-go 到GOPATH下
protoc-gen-go: program not found or is not executable
Please specify a program using absolute path or make sure the program is available in your PATH system variable
--go_out: protoc-gen-go: Plugin failed with status code 1.


$ go get -u github.com/golang/protobuf/protoc-gen-go

使用

package main

import "test/utils"
import "log"
import "test/tutorials"
//记得引入此库
import "github.com/golang/protobuf/proto"

func main(){
    login := tutorials.LoginRequest{}
    login.Username  = "zhangsan"
    login.Password = "12345678"
    login.Platform = "platform"
    log.Println(login)

    //将login变成字节数组
    out,err := proto.Marshal(&login)
    if err != nil {
        log.Fatal(err.Error())
    }
    //加密(请参考上篇写的AES加密)
    encrypted ,err2 := utils.Encrypt(out)
    log.Println(err2)
    log.Println(encrypted)

    //解密(请参考上篇写的AES解密)
    decrypted, err3 := utils.Decrypt(encrypted)
    log.Println(decrypted)
    log.Println(err3)
}

请求服务

#请求工具类编写
package utils

import (
    "io/ioutil"
    "log"
    "net/http"
    "strings"
    "test/config"
)

func Request( text,url string) (string,error){

    //请求客户端
    client := &http.Client{}

    req, e := http.NewRequest("POST", config.BASE_URL+url, strings.NewReader(text))
    if e != nil {
        log.Fatalln(e.Error())
    }

    req.Header.Set("Content-Type", "application/x-protobuf")
    req.Header.Set("TRADING_CHAIN_PLATFORM", config.REQ_PLATFORM)

    response, er := client.Do(req)
    if er !=nil {
        log.Fatalln(er.Error())
    }
    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatalln(err)
    }
    return string(body),nil
}

测试

vi main.go
#追加
s, err := utils.Request(encrypted, "/user/validate-password")
if err != nil {
    log.Fatalln(err.Error())
}

//解密
decrypted, err3 := utils.Decrypt(s)

log.Println(decrypted)
log.Println(err3)

//使用proto对象解析
loginResponse := &tutorials.Response{}
decryptIntoProto := []byte(decrypted)
proto.Unmarshal(decryptIntoProto, loginResponse)
log.Println(loginResponse)

好了,可以进行测试了。
源代码


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:simon_白

查看原文:golang+protobuf+aes 数据加密和请求加密

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2460 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传