gorm加密脱敏插件

1,102 阅读2分钟

gorm插件 之 加密与脱敏存储

在日常的应用开发过程中,我们经常会遇到手机号、姓名、地址等敏感信息;我们为了防止数据泄漏,所以在存储时需要加密;同时把数据显示进行脱敏显示,用户需要访问时记录日志。基于这个背景实现了gorm的rdb的插件

gorm-masking

  • 加密字段同时同时存储混淆内容
  • 查询中自动解密
  • 定制自己的加密混淆算法
  • 定制visit log

基础用法

  • 定义struct
type TestTable struct {
    Id     int    `gorm:"primary_key;column:id"`
    Name   string `gorm:"column:name" masking:"common" masking_encrypt_column:"name_id"` //加密这个列;masking 表示采用的加密实现;masking_encrypt_column:加密值存储列;common是系统预设的
    Age    int    `gorm:"column:age"`
    NameId string `gorm:"column:name_id"` //这列就是加密值存储的列
}
  • 注册插件
var db *gorm.DB
var encryptKey = "1234567890123456"
dsn := "file:test?mode=memory&cache=shared"
sqliteDb, _ := gorm.Open(sqlite.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
sqliteDb.Use(New(&Config{Key: encryptKey})) //注册插件
  • 插入、更新、保存和正常使用的gorm无区别
  • 查询明文字段
//query
queryCtx := context.WithValue(context.Background(), UnMaskingContext, []string{"Name"}) //标记要查询的明文字段
var queryDataByFind TestTable
if err := db.WithContext(queryCtx).Find(&queryDataByFind).Error; err != nil {
    t.Error(err)
}

注册新的加密算法

  • 实现接口
type DataMasking interface {
   //
   // Making
   //  @Description:  desensitization and encryption data
   //  @param src
   //  @param field
   //  @param db
   //  @return string desensitization value
   //  @return string encryption value
   //
   Making(src string, field *schema.Field, db *gorm.DB) (string, string)
   //
   // UnMasking
   //  @Description: unmasking data
   //  @param v encryption value
   //  @param field
   //  @param db
   //  @return string unmasking value
   //
   UnMasking(v string, field *schema.Field, db *gorm.DB) string
}
  • 注册 比如新的实现叫shijiebei
var ShiJieBei MaskingType ='shijiebei' //起一个新名子
RegisterTypeOptions(ShiJieBei, NewShijieBei())//假如有一个这橷新的实现
  • 使用

修改struct的加密算法

type TestTable struct {
    Id     int    `gorm:"primary_key;column:id"`
    Name   string `gorm:"column:name" masking:"shijiebei" masking_encrypt_column:"name_id"` //shijiebei 就是刚才定义的
    Age    int    `gorm:"column:age"`
    NameId string `gorm:"column:name_id"` //这列就是加密值存储的列
}

具体工具请移步:github.com/superqtqt/g… 如果觉得可用,感谢star