Skip to content

rhecs/slogmask

Repository files navigation

slogmask

slogmask 是一个轻量的 Go 敏感信息脱敏库,专注日志、JSON、map、struct 和标准库 log/slog 场景。

它适合放在服务端日志出口层,避免手机号、邮箱、身份证、银行卡、Token、密码、密钥等敏感信息被直接写入日志。

特性

  • 字符串脱敏:手机号、邮箱、身份证、银行卡、Bearer Token、常见 API Token
  • 结构化数据脱敏:map[string]any、struct、slice、JSON
  • log/slog Handler:日志写出前自动脱敏
  • 敏感字段名识别:passwordtokensecretauthorizationapi_keyaksk
  • 支持自定义规则和自定义敏感字段
  • 零三方运行时依赖

安装

go get github.com/rhecs/slogmask

快速开始

package main

import (
	"fmt"

	"github.com/rhecs/slogmask"
)

func main() {
	out := slogmask.String("phone=13800138000 email=alice@example.com")
	fmt.Println(out)
	// phone=138****8000 email=a****e@example.com
}

更多示例:

配合 log/slog

package main

import (
	"log/slog"
	"os"

	"github.com/rhecs/slogmask"
)

func main() {
	logger := slog.New(slogmask.NewHandler(slog.NewJSONHandler(os.Stdout, nil)))

	logger.Info(
		"user login",
		"phone", "13800138000",
		"password", "secret",
		"authorization", "Bearer abcdefghijklmnopqrstuvwxyz",
	)
}

输出中的 phone 会保留必要定位信息,passwordauthorization 会被完整替换为 ****

JSON 脱敏

data := []byte(`{
  "user": {
    "email": "alice@example.com",
    "phone": "13800138000"
  },
  "access_token": "secret-token"
}`)

out, err := slogmask.JSON(data)
if err != nil {
	panic(err)
}

fmt.Println(string(out))

map / struct 脱敏

type User struct {
	Name     string `json:"name"`
	Phone    string `json:"phone"`
	Password string `json:"password"`
}

safe := slogmask.Value(User{
	Name:     "Alice",
	Phone:    "13800138000",
	Password: "secret",
})

struct 会按 json tag 输出为 map[string]any,未导出字段会被跳过。

自定义规则

m := slogmask.New(slogmask.WithRule(slogmask.Rule{
	Name:    "order_id",
	Pattern: regexp.MustCompile(`ORD-\d{6}`),
	Mask: func(s string) string {
		return "ORD-****"
	},
}))

fmt.Println(m.String("order=ORD-123456"))

自定义敏感字段

m := slogmask.New(slogmask.WithSensitiveKeys("session_id", "tenant_secret"))

safe := m.Map(map[string]any{
	"session_id": "abc",
	"name":       "Alice",
})

默认脱敏策略

类型 示例 结果
中国大陆手机号 13800138000 138****8000
邮箱 alice@example.com a****e@example.com
中国居民身份证 110101199003071234 110101****1234
银行卡 6222020202020202020 6222****2020
Bearer Token Bearer abcdefghijklmnopqrstuvwxyz Bearer abc****wxyz
敏感字段值 password=secret password=****

设计原则

slogmask 不尝试判断所有业务语义,只在两类场景做确定性处理:

  1. 值本身有明显敏感格式,例如手机号、邮箱、身份证、银行卡、Token。
  2. 字段名明显敏感,例如 passwordauthorizationsecret_key

这样可以降低误伤,同时覆盖日志泄露中最常见的问题。

开发

go test ./...
go test -bench=. ./...

也可以使用:

make check
make bench

内置规则说明见 docs/rules.md

版本规划

  • v0.1.x:稳定字符串、JSON、map、struct 和 slog Handler
  • v0.2.x:增加更多地区化规则和更细粒度的规则开关
  • v0.3.x:补充常见日志框架适配器

License

MIT

About

Lightweight sensitive data redaction for Go strings, JSON, maps, structs, and log/slog records.

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors