Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

secure.go 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package modules
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. // 키관리 부분, 노드 입력받고 키 반환하는 부분 구현
  7. type Security struct {
  8. KeyMap map[string]string
  9. }
  10. //Security 생성자
  11. func NewSecurity() *Security {
  12. logger := NewMyLogger()
  13. defer logger.Sync()
  14. security := &Security{map[string]string{}}
  15. defer logger.Debug("security setting complete.")
  16. return security
  17. }
  18. type SecurityManager interface {
  19. RegKey(rm RegisterMsg)
  20. GetNodeKey(nodeName string) int64
  21. ReEncrypt(fromKey int64, toKey int64, target []int64) []int64
  22. ReEncPubMsg(fromPubMsg PublishMsg, nodeName string) PublishMsg
  23. RemoveSecureKey(nodeName string) bool
  24. //CompareTopic(topic1 []int64, topic2 []int64) int
  25. //CompareDigit(topic1 int64, topic2 int64) int
  26. //CompareAlpha(topic1 []int64, topic2 []int64) int
  27. }
  28. /*
  29. keyShareMsg 에서 각 노드의 private 키를 받아 keyMap 에 저장
  30. */
  31. func (sc Security) RegKey(rm RegisterMsg) {
  32. sc.KeyMap[rm.Message.From] = strconv.FormatInt(rm.PrivateKey, 10)
  33. }
  34. /**
  35. 각 노드의 키를 주소를 이용하여 맵에서 가져옴
  36. */
  37. func (sc Security) GetNodeKey(nodeName string) int64 {
  38. messageStringKey := sc.KeyMap[nodeName]
  39. mKey, err := strconv.ParseInt(messageStringKey, 10, 64)
  40. if err != nil {
  41. fmt.Println("GetNodeKey Error: key string to int64 parsing error.")
  42. }
  43. return mKey
  44. }
  45. /*
  46. reEncrypt 해서 슬라이스 반환
  47. */
  48. func (sc Security) ReEncrypt(fromKey int64, toKey int64, target []int64) []int64 {
  49. var tmpTarget []int64
  50. for index := range target {
  51. tmpTarget = append(tmpTarget, target[index]-fromKey+toKey)
  52. }
  53. return tmpTarget
  54. }
  55. func (sc Security) ReEncryptWithoutPrivateKey(toKey int64, target []int64) []int64 {
  56. var tmpTarget []int64
  57. for index := range target {
  58. tmpTarget = append(tmpTarget, target[index]+toKey)
  59. }
  60. return tmpTarget
  61. }
  62. // topic과 value는 m+k로만 존재하므로 ReEnc과정에서 subscriber의 개인키만 더해주면 된다.
  63. func (sc Security) ReEncPubMsg(fromPubMsg PublishMsg, nodeName string) PublishMsg {
  64. toKey := sc.GetNodeKey(nodeName)
  65. fromKey := sc.GetNodeKey(fromPubMsg.Message.From)
  66. toPubMsg := PublishMsg{}
  67. toPubMsg.Message = fromPubMsg.Message
  68. toPubMsg.Topic = sc.ReEncryptWithoutPrivateKey(toKey, fromPubMsg.Topic)
  69. toPubMsg.Value = sc.ReEncryptWithoutPrivateKey(toKey, fromPubMsg.Value)
  70. toPubMsg.Content = sc.ReEncrypt(fromKey, toKey, fromPubMsg.Content)
  71. return toPubMsg
  72. }
  73. //Key제거 함수
  74. func (sc *Security) RemoveSecureKey(nodeName string) bool {
  75. logger := NewMyLogger()
  76. logger.Sync()
  77. //삭제 전 존재여부 확인
  78. _, exists := sc.KeyMap[nodeName]
  79. if exists {
  80. delete(sc.KeyMap, nodeName)
  81. logger.Debug("[" + nodeName + "] : delete Key successful")
  82. return true
  83. } else {
  84. return false
  85. }
  86. }