sessionEncryption.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. package jyutil
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "crypto/rsa"
  6. "crypto/x509"
  7. "encoding/json"
  8. "encoding/pem"
  9. "log"
  10. "sync"
  11. "time"
  12. util "app.yhyue.com/moapp/jybase/common"
  13. . "app.yhyue.com/moapp/jybase/date"
  14. "app.yhyue.com/moapp/jybase/redis"
  15. "github.com/robfig/cron/v3"
  16. )
  17. //
  18. type RsaStruct struct {
  19. Sign string
  20. PrivateKey *rsa.PrivateKey
  21. PublicKey *rsa.PublicKey
  22. RsaConfig *RsaConfig
  23. }
  24. type RsaConfig struct {
  25. RsaSignflag string
  26. PrivateKeyStr string
  27. PublicKeyStr string
  28. }
  29. type MyWrite struct {
  30. Byte *bytes.Buffer
  31. }
  32. func (m MyWrite) Write(p []byte) (n int, err error) {
  33. n, err = m.Byte.Write(p)
  34. return
  35. }
  36. func getNewRsaConfig() *RsaConfig {
  37. //私钥-----
  38. privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  39. if err != nil {
  40. log.Println(err)
  41. }
  42. X509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey)
  43. privateBlock := pem.Block{Type: "RSA Private Key", Bytes: X509PrivateKey}
  44. privateWrite := MyWrite{Byte: bytes.NewBuffer([]byte(""))}
  45. pem.Encode(privateWrite, &privateBlock)
  46. privateKeyByte := privateWrite.Byte.Bytes()
  47. //公钥----
  48. publicKey := privateKey.PublicKey
  49. X509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)
  50. if err != nil {
  51. log.Println(err)
  52. }
  53. publicBlock := pem.Block{Type: "RSA Public Key", Bytes: X509PublicKey}
  54. publicWrite := MyWrite{Byte: bytes.NewBuffer([]byte(""))}
  55. pem.Encode(publicWrite, &publicBlock)
  56. publicKeyByte := publicWrite.Byte.Bytes()
  57. return &RsaConfig{
  58. RsaSignflag: time.Now().Format(Date_Full_Layout),
  59. PrivateKeyStr: string(privateKeyByte),
  60. PublicKeyStr: string(publicKeyByte),
  61. }
  62. }
  63. func initRsa(config *RsaConfig) *RsaStruct {
  64. //初始化私钥
  65. private_block, _ := pem.Decode([]byte(config.PrivateKeyStr))
  66. private, err := x509.ParsePKCS1PrivateKey(private_block.Bytes)
  67. if err != nil {
  68. log.Println(err)
  69. }
  70. //初始化公钥
  71. public_block, _ := pem.Decode([]byte(config.PublicKeyStr))
  72. publicKeyInterface, err := x509.ParsePKIXPublicKey(public_block.Bytes)
  73. if err != nil {
  74. log.Println(err)
  75. }
  76. public := publicKeyInterface.(*rsa.PublicKey)
  77. return &RsaStruct{
  78. Sign: config.RsaSignflag,
  79. RsaConfig: config,
  80. PrivateKey: private,
  81. PublicKey: public,
  82. }
  83. }
  84. //加密
  85. func (r *RsaStruct) Encrypt(str string) string {
  86. enStrByte, err := rsa.EncryptPKCS1v15(rand.Reader, r.PublicKey, []byte(str))
  87. if err != nil {
  88. log.Printf("%s加密失败%v", str, err)
  89. }
  90. return string(enStrByte)
  91. }
  92. //解密
  93. func (r *RsaStruct) Decrypt(enStr string) string {
  94. deStrByte, err := rsa.DecryptPKCS1v15(rand.Reader, r.PrivateKey, []byte(enStr))
  95. if err != nil {
  96. log.Printf("%s解密失败%v", enStr, err)
  97. }
  98. return string(deStrByte)
  99. }
  100. type EncryptionStruct struct {
  101. RsaStruct_Now *RsaStruct
  102. MapRsa map[string]*RsaStruct
  103. EncryptionConf *EncryptionConf
  104. Lock *sync.Mutex
  105. }
  106. type EncryptionConf struct {
  107. Now string
  108. MapRsaConf map[string]*RsaConfig
  109. }
  110. //首次启动加载秘钥
  111. func InitEncryptionStruct(Sysconfig map[string]interface{}) *EncryptionStruct {
  112. encryStruct := EncryptionStruct{EncryptionConf: &EncryptionConf{}, Lock: &sync.Mutex{}}
  113. // log.Println("xxxxxx", redis.GetInt("other", "jynode_"+nodemgr.NodeName))
  114. // isMaster := util.If(redis.GetInt("other", "jynode_"+nodemgr.NodeName) == 1, true, false).(bool)
  115. go func() {
  116. cn := cron.New()
  117. str := util.ObjToString(Sysconfig["sessionEnctryFlushCorn"])
  118. cn.AddFunc(str, func() {
  119. encryStruct.Flush(Sysconfig)
  120. })
  121. cn.Start()
  122. }()
  123. //for {
  124. redis_obj := util.ObjToString(redis.Get("session", "sessionEncryption"))
  125. if redis_obj != "" {
  126. encryconf := EncryptionConf{}
  127. err := json.Unmarshal([]byte(redis_obj), &encryconf)
  128. if err != nil {
  129. log.Println("InitEncryptionStruct Unmarshal redis err", err)
  130. } else {
  131. encryStruct.EncryptionConf = &encryconf
  132. encryStruct.initAllRsa()
  133. log.Println("从redis中加载EncryptionStruct")
  134. return &encryStruct
  135. }
  136. }
  137. log.Println("主结点首次创建EncryptionStruct")
  138. newRsaConf := getNewRsaConfig()
  139. encryStruct.EncryptionConf.Now = newRsaConf.RsaSignflag
  140. encryStruct.EncryptionConf.MapRsaConf = map[string]*RsaConfig{newRsaConf.RsaSignflag: newRsaConf}
  141. encryStruct.initAllRsa()
  142. go func() {
  143. //存入redis
  144. byteArr, err := json.Marshal(encryStruct.EncryptionConf)
  145. log.Println(string(byteArr))
  146. if err != nil {
  147. log.Printf("InitEncryptionStruct save %s redis err %:v\n", byteArr, err)
  148. return
  149. }
  150. redis.Put("session", "sessionEncryption", string(byteArr), -1)
  151. }()
  152. return &encryStruct
  153. }
  154. func (e *EncryptionStruct) initAllRsa() {
  155. e.Lock.Lock()
  156. defer e.Lock.Unlock()
  157. e.MapRsa = map[string]*RsaStruct{}
  158. for k, v := range e.EncryptionConf.MapRsaConf {
  159. thisRsa := initRsa(v)
  160. e.MapRsa[k] = thisRsa
  161. if k == e.EncryptionConf.Now {
  162. e.RsaStruct_Now = thisRsa
  163. }
  164. }
  165. }
  166. //定时更新秘钥
  167. func (e *EncryptionStruct) Flush(Sysconfig map[string]interface{}) {
  168. NodeName := util.ObjToString(Sysconfig["nodeName"])
  169. isMaster := util.If(redis.GetInt("other", "jynode_"+NodeName) == 1, true, false).(bool)
  170. if !isMaster {
  171. //从节点从redis中更新秘钥
  172. for {
  173. redis_obj := util.ObjToString(redis.Get("session", "sessionEncryption"))
  174. if redis_obj != "" {
  175. encryconf := EncryptionConf{}
  176. err := json.Unmarshal([]byte(redis_obj), &encryconf)
  177. if e.RsaStruct_Now.Sign == encryconf.Now {
  178. log.Println("从节点定时更新EncryptionStruct失败,一分钟后重试", e.RsaStruct_Now.Sign)
  179. time.Sleep(time.Minute)
  180. if redis.GetInt("other", "jynode_"+NodeName) == 1 {
  181. break
  182. } else {
  183. continue
  184. }
  185. }
  186. if err != nil {
  187. log.Println("InitEncryptionStruct Unmarshal redis err", err)
  188. } else {
  189. e.EncryptionConf = &encryconf
  190. e.initAllRsa()
  191. log.Println("从节点定时更新EncryptionStruct")
  192. return
  193. }
  194. }
  195. }
  196. } else {
  197. e.Lock.Lock()
  198. //主结点生成秘钥 存入redis
  199. log.Printf("主结点更新EncryptionStruct before %+v", e.MapRsa)
  200. last := e.RsaStruct_Now
  201. newRsa := initRsa(getNewRsaConfig())
  202. //更新map
  203. e.MapRsa = map[string]*RsaStruct{newRsa.Sign: newRsa, last.Sign: last}
  204. //更新默认加密
  205. e.RsaStruct_Now = newRsa
  206. log.Printf("after %+v", e.MapRsa)
  207. e.Lock.Unlock()
  208. //更新redis
  209. func() {
  210. e.EncryptionConf.Now = e.RsaStruct_Now.Sign
  211. e.EncryptionConf.MapRsaConf = map[string]*RsaConfig{newRsa.Sign: newRsa.RsaConfig, last.Sign: last.RsaConfig}
  212. byteArr, err := json.Marshal(e.EncryptionConf)
  213. log.Println("主结点更新sessionEncryption", string(byteArr))
  214. if err != nil {
  215. log.Printf("InitEncryptionStruct save %s redis err %:v\n", byteArr, err)
  216. return
  217. }
  218. redis.Put("session", "sessionEncryption", string(byteArr), -1)
  219. }()
  220. }
  221. }