sessionEncryption.go 6.4 KB

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