63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package middleware
|
||
|
||
import (
|
||
"encoding/json"
|
||
"strings"
|
||
|
||
"github.com/gofiber/fiber/v2"
|
||
"xy_sh/internal/config"
|
||
"xy_sh/pkg/crypto"
|
||
)
|
||
|
||
// VerifySign 验证签名中间件
|
||
func VerifySign(cfg *config.Config) fiber.Handler {
|
||
return func(c *fiber.Ctx) error {
|
||
timestamp := c.Get("timestamp")
|
||
sign := c.Get("sign")
|
||
|
||
if timestamp == "" || sign == "" {
|
||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||
"code": -1,
|
||
"msg": "缺少timestamp或sign请求头",
|
||
})
|
||
}
|
||
|
||
body := c.Body()
|
||
if len(body) == 0 {
|
||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||
"code": -1,
|
||
"msg": "请求体不能为空",
|
||
})
|
||
}
|
||
|
||
var req struct {
|
||
EncryptedData string `json:"encryptedData"`
|
||
}
|
||
if err := json.Unmarshal(body, &req); err != nil {
|
||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||
"code": -1,
|
||
"msg": "请求体格式错误",
|
||
})
|
||
}
|
||
|
||
// 验证签名:SM3(salt + timestamp + encryptedData)
|
||
expectedSign := crypto.SM3WithSalt(timestamp+req.EncryptedData, cfg.SM3Salt)
|
||
if !strings.EqualFold(expectedSign, sign) {
|
||
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||
"code": -1,
|
||
"msg": "签名验证失败",
|
||
})
|
||
}
|
||
|
||
decrypted, err := crypto.SM4ECBDecrypt(req.EncryptedData, cfg.SM4Key)
|
||
if err != nil {
|
||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
||
"code": -1,
|
||
"msg": "解密失败: " + err.Error(),
|
||
})
|
||
}
|
||
|
||
c.Locals("decryptedBody", decrypted)
|
||
return c.Next()
|
||
}
|
||
} |