util.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package main
  2. import (
  3. "bytes"
  4. "crypto/md5"
  5. "encoding/binary"
  6. "encoding/hex"
  7. "errors"
  8. "fmt"
  9. "git.qianqiusoft.com/library/glog"
  10. "net"
  11. "strconv"
  12. "time"
  13. )
  14. // md5 哈希
  15. func hash(str string)string{
  16. h := md5.New()
  17. h.Write([]byte(str))
  18. return hex.EncodeToString(h.Sum(nil))
  19. }
  20. // 读取字符串
  21. func readString(conn net.Conn)(string, error){
  22. // 读长度
  23. size, err := readUInt32(conn)
  24. if err != nil{
  25. fmt.Println("读取长度失败,", err.Error())
  26. return "", err
  27. }
  28. glog.Infoln("读取长度-", size)
  29. // 读字符串
  30. b := make([]byte, size)
  31. n, err := conn.Read(b)
  32. if n != int(size){
  33. return "", errors.New("读取长度不是" + strconv.Itoa(int(size)))
  34. }
  35. return string(b), nil
  36. }
  37. // 写入字符串
  38. func writeString(conn net.Conn, str string)error{
  39. if str == ""{
  40. return errors.New("字符串为空")
  41. }
  42. bytess := []byte(str)
  43. size := len(bytess)
  44. // 发送长度
  45. err := writeUInt32(conn, uint32(size))
  46. if err != nil{
  47. fmt.Println("发送长度失败,", err.Error())
  48. return err
  49. }
  50. // 发送内容
  51. n, err := conn.Write(bytess)
  52. if err != nil{
  53. fmt.Println("发送内容失败,", err.Error())
  54. return err
  55. }
  56. if n != size{
  57. return errors.New("发送长度不是" + strconv.Itoa(int(size)))
  58. }
  59. return nil
  60. }
  61. // 读取bytes
  62. func readBytes(conn net.Conn)([]byte, error){
  63. // 读长度
  64. size, err := readUInt32(conn)
  65. if err != nil{
  66. fmt.Println("读取长度失败,", err.Error())
  67. return nil, err
  68. }
  69. fmt.Println("读取长度", size)
  70. // 读字符串
  71. b := make([]byte, size)
  72. n, err := conn.Read(b)
  73. if n != int(size){
  74. return nil, errors.New("读取长度不是" + strconv.Itoa(int(size)))
  75. }
  76. return b, nil
  77. }
  78. // 读取uint64
  79. func readUInt32(conn net.Conn)(uint32, error){
  80. b := make([]byte, 4)
  81. n, err := conn.Read(b)
  82. if err != nil{
  83. fmt.Println("读取长度失败,", err.Error())
  84. return 0, err
  85. }
  86. if n != 4{
  87. return 0, errors.New("读取长度不是4")
  88. }
  89. size := binary.BigEndian.Uint32(b)
  90. return size, nil
  91. }
  92. // 读取uint64
  93. func readUInt64(conn net.Conn)(uint64, error){
  94. b := make([]byte, 8)
  95. n, err := conn.Read(b)
  96. if err != nil{
  97. fmt.Println("读取长度失败,", err.Error())
  98. return 0, err
  99. }
  100. if n != 8{
  101. return 0, errors.New("读取长度不是8")
  102. }
  103. size := binary.BigEndian.Uint64(b)
  104. return size, nil
  105. }
  106. // 写入长度
  107. func writeUInt32(conn net.Conn, v uint32)error{
  108. // 发送长度
  109. b := make([]byte, 4)
  110. binary.BigEndian.PutUint32(b, v)
  111. n, err := conn.Write(b)
  112. if err != nil{
  113. fmt.Println("发送长度失败,", err.Error())
  114. return err
  115. }
  116. if n != 4{
  117. return errors.New("发送长度不是4")
  118. }
  119. return nil
  120. }
  121. // 转byte数组
  122. func uint32ToBytes(v uint32) []byte {
  123. b := make([]byte, 4)
  124. binary.BigEndian.PutUint32(b, v)
  125. return b
  126. }
  127. // 校验
  128. func checkSign(conn net.Conn)(bool, error){
  129. glog.Infoln("校验")
  130. timestamp, err := readUInt64(conn)
  131. if err != nil{
  132. fmt.Println("读取时间戳错误", err.Error())
  133. return false, err
  134. }
  135. glog.Infoln("校验1")
  136. sign, err := readString(conn)
  137. if err != nil{
  138. fmt.Println("读取sign错误", err.Error())
  139. return false, err
  140. }
  141. seed := strconv.Itoa(int(timestamp)) + __KEY
  142. hashVal := hash(seed)
  143. glog.Infoln("校验2")
  144. if hashVal != sign{
  145. fmt.Println("校验码错误", hashVal, sign)
  146. return false, nil
  147. }
  148. glog.Infoln("校验3")
  149. if time.Now().Sub(time.Unix(int64(timestamp) / 1000000000, 0)).Seconds() > 60 {
  150. fmt.Println("校验码已失效")
  151. return false, nil
  152. }
  153. return true, nil
  154. }
  155. // cmd 和 内容转字节数组
  156. func cmdContentToBytes(cmd string, content []byte)[]byte{
  157. buf := bytes.NewBuffer([]byte{})
  158. // 命令
  159. bytess := []byte(cmd)
  160. size := len(bytess)
  161. b := make([]byte, 4)
  162. binary.BigEndian.PutUint32(b, uint32(size))
  163. buf.Write(b)
  164. buf.Write(bytess)
  165. // 内容
  166. size = len(content)
  167. b = make([]byte, 4)
  168. binary.BigEndian.PutUint32(b, uint32(size))
  169. buf.Write(b)
  170. buf.Write(content)
  171. return buf.Bytes()
  172. }