sign

package
v0.0.13 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 20, 2023 License: Apache-2.0 Imports: 20 Imported by: 0

README

本包主要提供对API请求的签名生成、签名校验等

主要包含一下两部分:

生成签名

生成的签名需要满足以下几点:

  • 可变性:每次的签名必须是不一样的
  • 时效性:每次请求的时效性,过期作废
  • 唯一性:每次的签名是唯一的
  • 完整性:能够对传入数据进行验证,防止篡改

如果增加了签名验证,需要再传递几个参数:

  • app_id 表示App Id,用来识别调用方身份
  • timestamp 表示时间戳,用来验证接口的时效性
  • sign 表示签名加密串,用来验证数据的完整性,防止数据篡改

支持两种签名生成算法:

  • MD5: 由 NewSingerMd5() 提供
  • Sha1 + Hmac: 由 NewSingerHmac() 提供

以上两种如果都不满足,可以自定义签名算法,使用 NewSigner(FUNC) 指定实现签名生成算法的实现即可

Usage

signer := NewSignerMd5()

// 设置签名基本参数
signer.SetAppId("94857djfi49484")
signer.SetTimeStamp(1594294833)
signer.SetNonceStr("xiKdApRhbuxVckJa")

// 设置参与签名的其它参数
signer.AddBody("plate_number", "golang")

// AppSecretKey,前后包装签名体字符串
signer.SetAppSecretWrapBody("x90449dfde34d")

fmt.Println("生成签字字符串:" + signer.GetUnsignedString())
fmt.Println("输出URL字符串:" + signer.GetSignedQuery())

Result

校验签名

sign.Verifier 工具类,用来校验签名参数的格式和时间戳。它与Signer一起使用,用于服务端校验API请求的签名信息。

Usage

requestUri := "/restful/api/numbers?app_id=9d8a121ce581499d&nonce_str=ibuaiVcKdpRxkhJA&plate_number=豫A66666" +
		"&time_stamp=1532585241&sign=072defd1a251dc58e4d1799e17ffe7a4"

	// 第一步:创建Verifier校验类
	verifier := NewVerifier()

	// 假定从RequestUri中读取校验参数
	if err := verifier.ParseQuery(requestUri); nil != err {
		t.Fatal(err)
	}

	// 或者使用verifier.ParseValues(Values)来解析。

	// 第二步:(可选)校验是否包含签名校验必要的参数
	if err := verifier.MustHasOtherFields("plate_number"); nil != err {
		t.Fatal(err)
	}

	// 第三步:检查时间戳是否超时。

	// 时间戳超时:5分钟
	verifier.SetTimeout(time.Minute * 5)
	if err := verifier.CheckTimeStamp(); nil != err {
		t.Fatal(err)
	}

	// 第四步: 创建Signer来重现客户端的签名信息
	signer := NewSignerMd5()

	// 第五步:从Verifier中读取所有请求参数
	signer.SetBody(verifier.GetBodyWithoutSign())

	// 第六步:从数据库读取AppID对应的SecretKey
	// appId := verifier.GetAppId()
	secretKey := "123abc456"

	// 使用同样的WrapBody方式
	signer.SetAppSecretWrapBody(secretKey)

	// 服务端根据客户端参数生成签名
	sign := signer.GetSignature()

    // 最后,比较服务端生成的签名信息,与客户端提供的签名是否一致即可。
	if verifier.MustString("sign") != sign {
		t.Fatal("校验失败")
	}

Documentation

Index

Constants

View Source
const (
	// KeyNameTimeStamp 时间戳字段名
	KeyNameTimeStamp = "timestamp"
	// KeyNameNonceStr temp str field
	KeyNameNonceStr = "nonce_str"
	// KeyNameAppID app id field
	KeyNameAppID = "app_id"
	// KeyNameSign sign field
	KeyNameSign = "sign"
)

Variables

This section is empty.

Functions

func AesSign

func AesSign(secretKey, body string) []byte

AesSign 对称加密

func Decrypt

func Decrypt(decryptStr string, key []byte, iv string) (string, error)

Decrypt 解密

func Encrypt

func Encrypt(encryptStr string, key []byte, iv string) (string, error)

Encrypt 加密 aes_128_cbc

func HmacSign

func HmacSign(secretKey, body string) []byte

HmacSign hmac

func Md5Sign

func Md5Sign(_, body string) []byte

Md5Sign md5 sign

func PrivateDecrypt

func PrivateDecrypt(decryptStr string, path string) (string, error)

PrivateDecrypt 私钥解密

func PublicEncrypt

func PublicEncrypt(encryptStr string, path string) (string, error)

PublicEncrypt 公钥加密

func RsaSign

func RsaSign(secretKey, body string) []byte

RsaSign 非对称加密

func SortKVPairs

func SortKVPairs(m url.Values) string

SortKVPairs 将Map的键值对,按字典顺序拼接成字符串

Types

type CryptoFunc

type CryptoFunc func(secretKey string, args string) []byte

CryptoFunc 签名加密函数

type DefaultKeyName

type DefaultKeyName struct {
	Timestamp string
	NonceStr  string
	AppID     string
	Sign      string
}

DefaultKeyName 签名需要用到的字段

func (*DefaultKeyName) SetKeyNameAppID

func (d *DefaultKeyName) SetKeyNameAppID(name string)

SetKeyNameAppID 设定app id

func (*DefaultKeyName) SetKeyNameNonceStr

func (d *DefaultKeyName) SetKeyNameNonceStr(name string)

SetKeyNameNonceStr 设定随机字符串

func (*DefaultKeyName) SetKeyNameSign

func (d *DefaultKeyName) SetKeyNameSign(name string)

SetKeyNameSign 设定签名

func (*DefaultKeyName) SetKeyNameTimestamp

func (d *DefaultKeyName) SetKeyNameTimestamp(name string)

SetKeyNameTimestamp 设定时间戳

type Signer

type Signer struct {
	*DefaultKeyName
	// contains filtered or unexported fields
}

Signer define

func NewSigner

func NewSigner(cryptoFunc CryptoFunc) *Signer

NewSigner 实例化 Signer

func NewSignerAes

func NewSignerAes() *Signer

NewSignerAes aes对称加密算法

func NewSignerHmac

func NewSignerHmac() *Signer

NewSignerHmac hmac加密算法

func NewSignerMd5

func NewSignerMd5() *Signer

NewSignerMd5 md5加密算法

func (*Signer) AddBodies

func (s *Signer) AddBodies(key string, value []string) *Signer

AddBodies add value to body

func (*Signer) AddBody

func (s *Signer) AddBody(key string, value string) *Signer

AddBody 添加签名体字段和值

func (*Signer) GetAppID

func (s *Signer) GetAppID() string

GetAppID get app id

func (*Signer) GetBody

func (s *Signer) GetBody() url.Values

GetBody 返回Body内容

func (*Signer) GetNonceStr

func (s *Signer) GetNonceStr() string

GetNonceStr 返回NonceStr字符串

func (*Signer) GetSignBodyString

func (s *Signer) GetSignBodyString() string

GetSignBodyString 获取用于签名的原始字符串

func (*Signer) GetSignature

func (s *Signer) GetSignature() string

GetSignature 获取签名

func (*Signer) GetSignedQuery

func (s *Signer) GetSignedQuery() string

GetSignedQuery 获取带签名参数的查询字符串

func (*Signer) GetTimeStamp

func (s *Signer) GetTimeStamp() string

GetTimeStamp 获取TimeStamp

func (*Signer) MakeRawBodyString

func (s *Signer) MakeRawBodyString() string

MakeRawBodyString 获取用于签名的原始字符串

func (*Signer) MakeSign

func (s *Signer) MakeSign() string

MakeSign 生成签名

func (*Signer) MakeSignedQuery

func (s *Signer) MakeSignedQuery() string

MakeSignedQuery 获取带签名参数的字符串

func (*Signer) RandNonceStr

func (s *Signer) RandNonceStr() *Signer

RandNonceStr 自动生成16位随机字符串参数

func (*Signer) SetAppID

func (s *Signer) SetAppID(appID string) *Signer

SetAppID 设置AppId参数

func (*Signer) SetAppSecret

func (s *Signer) SetAppSecret(appSecret string) *Signer

SetAppSecret 设置签名密钥

func (*Signer) SetAppSecretWrapBody

func (s *Signer) SetAppSecretWrapBody(appSecret string) *Signer

SetAppSecretWrapBody 在签名参数体的首部和尾部,拼接AppSecret字符串。

func (*Signer) SetBody

func (s *Signer) SetBody(body url.Values)

SetBody 设置整个参数体Body对象。

func (*Signer) SetNonceStr

func (s *Signer) SetNonceStr(nonce string) *Signer

SetNonceStr 设置随机字符串参数

func (*Signer) SetSignBodyPrefix

func (s *Signer) SetSignBodyPrefix(prefix string) *Signer

SetSignBodyPrefix 设置签名字符串的前缀字符串

func (*Signer) SetSignBodySuffix

func (s *Signer) SetSignBodySuffix(suffix string) *Signer

SetSignBodySuffix 设置签名字符串的后缀字符串

func (*Signer) SetSplitChar

func (s *Signer) SetSplitChar(split string) *Signer

SetSplitChar 设置前缀、后缀与签名体之间的分隔符号。默认为空字符串

func (*Signer) SetTimeStamp

func (s *Signer) SetTimeStamp(ts int64) *Signer

SetTimeStamp 设置时间戳参数

type Verifier

type Verifier struct {
	*DefaultKeyName
	// contains filtered or unexported fields
}

Verifier define struct

func NewVerifier

func NewVerifier() *Verifier

NewVerifier 实例化 Verifier

func (*Verifier) CheckTimeStamp

func (v *Verifier) CheckTimeStamp() error

CheckTimeStamp 检查时间戳有效期

func (*Verifier) GetAppID

func (v *Verifier) GetAppID() string

GetAppID 获取app id

func (*Verifier) GetBody

func (v *Verifier) GetBody() url.Values

GetBody 获取body

func (*Verifier) GetBodyWithoutSign

func (v *Verifier) GetBodyWithoutSign() url.Values

GetBodyWithoutSign 获取所有参数体。其中不包含sign 字段

func (*Verifier) GetNonceStr

func (v *Verifier) GetNonceStr() string

GetNonceStr 获取随机字符串

func (*Verifier) GetSign

func (v *Verifier) GetSign() string

GetSign 获取签名

func (*Verifier) GetTimestamp

func (v *Verifier) GetTimestamp() int64

GetTimestamp 获取时间戳

func (*Verifier) MustHasKeys

func (v *Verifier) MustHasKeys(keys ...string) error

MustHasKeys 必须包含指定的字段参数

func (*Verifier) MustHasOtherKeys

func (v *Verifier) MustHasOtherKeys(keys ...string) error

MustHasOtherKeys 必须包含除特定的[timestamp, nonce_str, sign, app_id]等之外的指定的字段参数

func (*Verifier) MustInt64

func (v *Verifier) MustInt64(key string) int64

MustInt64 获取Int64值

func (*Verifier) MustString

func (v *Verifier) MustString(key string) string

MustString 获取字符串值

func (*Verifier) MustStrings

func (v *Verifier) MustStrings(key string) []string

MustStrings 获取字符串值数组

func (*Verifier) ParseQuery

func (v *Verifier) ParseQuery(requestURI string) error

ParseQuery 将参数字符串解析成参数列表

func (*Verifier) ParseValues

func (v *Verifier) ParseValues(values url.Values)

ParseValues 将Values参数列表解析成参数Map。如果参数是多值的,则将它们以逗号Join成字符串。

func (*Verifier) SetTimeout

func (v *Verifier) SetTimeout(timeout time.Duration) *Verifier

SetTimeout 设置签名校验过期时间

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL