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