jwe.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package common
  2. import (
  3. "crypto/rand"
  4. "crypto/rsa"
  5. "crypto/x509"
  6. "encoding/json"
  7. "encoding/pem"
  8. "strings"
  9. "time"
  10. "github.com/dcsunny/gocrypt"
  11. "github.com/lestrrat-go/jwx/jwa"
  12. "github.com/lestrrat-go/jwx/jwe"
  13. )
  14. type JWE struct {
  15. publicKey *rsa.PublicKey
  16. privateKey *rsa.PrivateKey
  17. expire int64
  18. }
  19. var (
  20. DefaultJWE *JWE
  21. )
  22. const (
  23. jweHeader = "eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0"
  24. )
  25. //返回值 第一个private key,第二个是public key
  26. func GenerateRsaKey() ([]byte, []byte, error) {
  27. privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  28. if err != nil {
  29. return nil, nil, err
  30. }
  31. pk, err := x509.MarshalPKCS8PrivateKey(privateKey)
  32. if err != nil {
  33. return nil, nil, err
  34. }
  35. block := &pem.Block{
  36. Type: "RSA PRIVATE KEY",
  37. Bytes: pk,
  38. }
  39. _pk := pem.EncodeToMemory(block)
  40. pb, err := x509.MarshalPKIXPublicKey(&privateKey.PublicKey)
  41. if err != nil {
  42. return nil, nil, err
  43. }
  44. publicBlock := &pem.Block{Type: "RSA Public Key", Bytes: pb}
  45. _pb := pem.EncodeToMemory(publicBlock)
  46. return _pk, _pb, nil
  47. }
  48. func InitJWE(privateKey, publicKey string, expire int64) error {
  49. var err error
  50. DefaultJWE, err = NewJWE(privateKey, publicKey, expire)
  51. return err
  52. }
  53. func NewJWE(privateKey string, publicKey string, expire int64) (*JWE, error) {
  54. privateKey = strings.Replace(privateKey, "-----BEGIN RSA PRIVATE KEY-----", "", 1)
  55. privateKey = strings.Replace(privateKey, "-----END RSA PRIVATE KEY-----", "", 1)
  56. privateKey = strings.Replace(privateKey, "\n", "", -1)
  57. privateKeyDecoded, err := gocrypt.DecodeString(privateKey, gocrypt.Base64)
  58. pk, err := gocrypt.ParsePrivateKey(privateKeyDecoded, gocrypt.PKCS8)
  59. if err != nil {
  60. return nil, err
  61. }
  62. publicKey = strings.Replace(publicKey, "-----BEGIN RSA Public Key-----", "", 1)
  63. publicKey = strings.Replace(publicKey, "-----END RSA Public Key-----", "", 1)
  64. publicKey = strings.Replace(publicKey, "\n", "", -1)
  65. publicKeyDecoded, err := gocrypt.DecodeString(publicKey, gocrypt.Base64)
  66. pb, err := x509.ParsePKIXPublicKey(publicKeyDecoded)
  67. if err != nil {
  68. return nil, err
  69. }
  70. var j = new(JWE)
  71. j.publicKey = pb.(*rsa.PublicKey)
  72. j.privateKey = pk
  73. j.expire = expire
  74. return j, nil
  75. }
  76. type JWEClaims struct {
  77. AccountId string `json:"id"`
  78. Expire int64 `json:"exp"`
  79. Claims json.RawMessage `json:"claims,omitempty"`
  80. }
  81. func (j *JWE) NewToken(accountID string, claims json.RawMessage) (string, error) {
  82. jweClaim := JWEClaims{
  83. AccountId: accountID,
  84. Claims: claims,
  85. Expire: time.Now().Unix() + j.expire,
  86. }
  87. payload, _ := json.Marshal(jweClaim)
  88. token, err := jwe.Encrypt(payload, jwa.RSA1_5, j.publicKey, jwa.A128CBC_HS256, jwa.NoCompress)
  89. if err != nil {
  90. return "", err
  91. }
  92. _token := string(token)
  93. _token = _token[52:]
  94. return _token, err
  95. }
  96. func (j *JWE) Parse(token string) (string, json.RawMessage, error) {
  97. token = jweHeader + "." + token
  98. decrypted, err := jwe.Decrypt([]byte(token), jwa.RSA1_5, j.privateKey)
  99. if err != nil {
  100. return "", nil, err
  101. }
  102. var jweClaim JWEClaims
  103. err = json.Unmarshal(decrypted, &jweClaim)
  104. if err != nil {
  105. return "", nil, err
  106. }
  107. if time.Now().Unix() > jweClaim.Expire {
  108. return "", nil, ErrTokenExpired
  109. }
  110. return jweClaim.AccountId, jweClaim.Claims, nil
  111. }