123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- package main
- import (
- "bytes"
- "crypto/md5"
- "encoding/binary"
- "encoding/hex"
- "errors"
- "fmt"
- "git.qianqiusoft.com/library/glog"
- "net"
- "strconv"
- "time"
- )
- // md5 哈希
- func hash(str string)string{
- h := md5.New()
- h.Write([]byte(str))
- return hex.EncodeToString(h.Sum(nil))
- }
- // 读取字符串
- func readString(conn net.Conn)(string, error){
- // 读长度
- size, err := readUInt32(conn)
- if err != nil{
- fmt.Println("读取长度失败,", err.Error())
- return "", err
- }
- glog.Infoln("读取长度-", size)
- // 读字符串
- b := make([]byte, size)
- n, err := conn.Read(b)
- if n != int(size){
- return "", errors.New("读取长度不是" + strconv.Itoa(int(size)))
- }
- return string(b), nil
- }
- // 写入字符串
- func writeString(conn net.Conn, str string)error{
- if str == ""{
- return errors.New("字符串为空")
- }
- bytess := []byte(str)
- size := len(bytess)
- // 发送长度
- err := writeUInt32(conn, uint32(size))
- if err != nil{
- fmt.Println("发送长度失败,", err.Error())
- return err
- }
- // 发送内容
- n, err := conn.Write(bytess)
- if err != nil{
- fmt.Println("发送内容失败,", err.Error())
- return err
- }
- if n != size{
- return errors.New("发送长度不是" + strconv.Itoa(int(size)))
- }
- return nil
- }
- // 读取bytes
- func readBytes(conn net.Conn)([]byte, error){
- // 读长度
- size, err := readUInt32(conn)
- if err != nil{
- fmt.Println("读取长度失败,", err.Error())
- return nil, err
- }
- fmt.Println("读取长度", size)
- // 读字符串
- b := make([]byte, size)
- n, err := conn.Read(b)
- if n != int(size){
- return nil, errors.New("读取长度不是" + strconv.Itoa(int(size)))
- }
- return b, nil
- }
- // 读取uint64
- func readUInt32(conn net.Conn)(uint32, error){
- b := make([]byte, 4)
- n, err := conn.Read(b)
- if err != nil{
- fmt.Println("读取长度失败,", err.Error())
- return 0, err
- }
- if n != 4{
- return 0, errors.New("读取长度不是4")
- }
- size := binary.BigEndian.Uint32(b)
- return size, nil
- }
- // 读取uint64
- func readUInt64(conn net.Conn)(uint64, error){
- b := make([]byte, 8)
- n, err := conn.Read(b)
- if err != nil{
- fmt.Println("读取长度失败,", err.Error())
- return 0, err
- }
- if n != 8{
- return 0, errors.New("读取长度不是8")
- }
- size := binary.BigEndian.Uint64(b)
- return size, nil
- }
- // 写入长度
- func writeUInt32(conn net.Conn, v uint32)error{
- // 发送长度
- b := make([]byte, 4)
- binary.BigEndian.PutUint32(b, v)
- n, err := conn.Write(b)
- if err != nil{
- fmt.Println("发送长度失败,", err.Error())
- return err
- }
- if n != 4{
- return errors.New("发送长度不是4")
- }
- return nil
- }
- // 转byte数组
- func uint32ToBytes(v uint32) []byte {
- b := make([]byte, 4)
- binary.BigEndian.PutUint32(b, v)
- return b
- }
- // 校验
- func checkSign(conn net.Conn)(bool, error){
- glog.Infoln("校验")
- timestamp, err := readUInt64(conn)
- if err != nil{
- fmt.Println("读取时间戳错误", err.Error())
- return false, err
- }
- glog.Infoln("校验1")
- sign, err := readString(conn)
- if err != nil{
- fmt.Println("读取sign错误", err.Error())
- return false, err
- }
- seed := strconv.Itoa(int(timestamp)) + __KEY
- hashVal := hash(seed)
- glog.Infoln("校验2")
- if hashVal != sign{
- fmt.Println("校验码错误", hashVal, sign)
- return false, nil
- }
- glog.Infoln("校验3")
- if time.Now().Sub(time.Unix(int64(timestamp) / 1000000000, 0)).Seconds() > 60 {
- fmt.Println("校验码已失效")
- return false, nil
- }
- return true, nil
- }
- // cmd 和 内容转字节数组
- func cmdContentToBytes(cmd string, content []byte)[]byte{
- buf := bytes.NewBuffer([]byte{})
- // 命令
- bytess := []byte(cmd)
- size := len(bytess)
- b := make([]byte, 4)
- binary.BigEndian.PutUint32(b, uint32(size))
- buf.Write(b)
- buf.Write(bytess)
- // 内容
- size = len(content)
- b = make([]byte, 4)
- binary.BigEndian.PutUint32(b, uint32(size))
- buf.Write(b)
- buf.Write(content)
- return buf.Bytes()
- }
|