Documentation
¶
Overview ¶
Package zencrypt Package enctypt 提供各种加密算法实现
AES-CBC加密示例(传统模式):
cipher := enctypt.NewAesEncrypt("your-secret-key")
// 加密
encrypted, err := cipher.Encrypt([]byte("secret data"))
if err != nil {
log.Fatal(err)
}
// 解密
decrypted, err := cipher.Decrypt(encrypted)
if err != nil {
log.Fatal(err)
}
AES-GCM加密示例(推荐,现代标准):
cipher := enctypt.NewAesGcmEncrypt("your-secret-key")
// 加密(自动提供完整性校验)
encrypted, err := cipher.Encrypt([]byte("secret data"))
if err != nil {
log.Fatal(err)
}
// 解密(自动验证完整性)
decrypted, err := cipher.Decrypt(encrypted)
if err != nil {
log.Fatal(err) // 如果数据被篡改,这里会报错
}
注意事项:
- 密钥会通过SHA256派生为32字节
- CBC模式:IV随机生成并附加在密文前16字节,使用PKCS7填充
- GCM模式:Nonce随机生成并附加在密文前12字节,自带认证标签,无需填充
- 推荐使用GCM模式(更安全,更快,防篡改)
Package zencrypt Package encrypt 提供RSA加密和签名工具。
安全建议 ¶
对于加密,请使用OAEP模式(EncryptOAEP/DecryptOAEP)而不是PKCS1v15。 PKCS1v15已被弃用,因为容易受到选择密文攻击。
使用示例 ¶
基础加密(推荐 - OAEP):
privKey, _ := encrypt.GenerateSecretKey() pubKey := &privKey.PublicKey ciphertext, _ := encrypt.EncryptOAEP(pubKey, plaintext) decrypted, _ := encrypt.DecryptOAEP(privKey, ciphertext)
带Label的加密(防重放):
label := []byte("user:12345") // 绑定到特定用户
ciphertext, _ := encrypt.EncryptOAEPWithLabel(pubKey, plaintext, label)
decrypted, _ := encrypt.DecryptOAEPWithLabel(privKey, ciphertext, label)
自定义哈希函数(大密钥):
// ⚠️ 每次调用必须创建新的Hash实例,不能复用 ciphertext, _ := encrypt.EncryptOAEPWithHash(pubKey, sha512.New(), plaintext) decrypted, _ := encrypt.DecryptOAEPWithHash(privKey, sha512.New(), ciphertext)
数字签名:
privKey, _ := encrypt.GenerateSecretKey() signature, _ := encrypt.Sign(privKey, data) err := encrypt.Verify(&privKey.PublicKey, data, signature)
Package zencrypt Package encrypt 提供SM2国密非对称加密和签名实现。
SM2是中国国家密码管理局发布的椭圆曲线公钥密码算法标准(GM/T 0003-2012), 基于256位素数域椭圆曲线,安全强度等同于ECC P-256。
加密示例:
privKey, _ := encrypt.GenerateSM2Key()
pubKey := privKey.PublicKey()
ciphertext, _ := encrypt.SM2Encrypt(pubKey, []byte("secret data"))
plaintext, _ := encrypt.SM2Decrypt(privKey, ciphertext)
签名示例:
privKey, _ := encrypt.GenerateSM2Key()
signature, _ := encrypt.SM2Sign(privKey, []byte("data"))
err := encrypt.SM2Verify(privKey.PublicKey(), []byte("data"), signature)
密钥PEM序列化:
privPem := encrypt.SM2MarshalPrivateKey(privKey) pubPem := encrypt.SM2MarshalPublicKey(privKey.PublicKey()) privKey2, _ := encrypt.SM2ParsePrivateKey(privPem) pubKey2, _ := encrypt.SM2ParsePublicKey(pubPem)
Package encrypt 提供SM3国密哈希实现。
SM3是中国国家密码管理局发布的密码杂凑算法标准(GM/T 0004-2012), 输出256位(32字节)摘要,安全强度等同于SHA-256。
示例:
hash := encrypt.SM3("my-data")
// hash 为32字节摘要
hashHex := encrypt.SM3Hex("my-data")
// hashHex 为64字符十六进制字符串
hashBytes := encrypt.SM3Bytes([]byte("my-data"))
// 直接对字节切片计算哈希
Package zencrypt Package encrypt 提供基于 SM3 的密码哈希实现(信创默认)。
使用 SM3-HMAC + 随机 salt + 多轮迭代,安全强度等同于 PBKDF2-SHA256。 符合 GM/T 0004-2012 标准。
示例:
hasher := encrypt.NewSM3Password()
hash, _ := hasher.Encrypt("my-password")
ok := hasher.CompareHashAndPassword("my-password", hash) // true
ok = hasher.CompareHashAndPassword("wrong", hash) // false
与 Argon2/Bcrypt 接口一致,可直接替换。
Package zencrypt Package encrypt 提供SM4国密对称加密实现。
SM4-GCM加密示例(推荐):
cipher := encrypt.NewSM4GcmEncrypt("your-secret-key")
encrypted, err := cipher.Encrypt([]byte("secret data"))
if err != nil {
log.Fatal(err)
}
decrypted, err := cipher.Decrypt(encrypted)
if err != nil {
log.Fatal(err)
}
SM4-CBC加密示例:
cipher := encrypt.NewSM4Encrypt("your-secret-key")
encrypted, err := cipher.Encrypt([]byte("secret data"))
if err != nil {
log.Fatal(err)
}
decrypted, err := cipher.Decrypt(encrypted)
if err != nil {
log.Fatal(err)
}
注意事项:
- 密钥通过SM3派生为16字节(SM4密钥长度固定128位)
- CBC模式:IV随机生成并附加在密文前16字节,使用PKCS7填充
- GCM模式:Nonce随机生成并附加在密文前12字节,自带认证标签,无需填充
- 推荐使用GCM模式(更安全,更快,防篡改)
- 符合 GM/T 0002-2012 标准
Example (PoolUsage) ¶
Example_poolUsage 展示池的使用示例
cipher := NewAesEncrypt("test-key")
plaintext := []byte("Hello, World!")
// 加密
encrypted, _ := cipher.Encrypt(plaintext)
// 解密
decrypted, _ := cipher.Decrypt(encrypted)
fmt.Println(string(decrypted))
Output: Hello, World!
Index ¶
- func CheckAESNI() bool
- func DecodeString(key string) ([]byte, error)
- func DecryptOAEP(privKey *rsa.PrivateKey, ciphertext []byte) ([]byte, error)
- func DecryptOAEPWithHash(privKey *rsa.PrivateKey, hash hash.Hash, ciphertext []byte) ([]byte, error)
- func DecryptOAEPWithLabel(privKey *rsa.PrivateKey, ciphertext []byte, label []byte) ([]byte, error)
- func EncodeToString(data []byte) string
- func EncryptOAEP(pubKey *rsa.PublicKey, plaintext []byte) ([]byte, error)
- func EncryptOAEPWithHash(pubKey *rsa.PublicKey, hash hash.Hash, plaintext []byte) ([]byte, error)
- func EncryptOAEPWithLabel(pubKey *rsa.PublicKey, plaintext []byte, label []byte) ([]byte, error)
- func FnvHash(s string) (uint32, error)
- func GenerateSecretKey() (*rsa.PrivateKey, error)
- func GenerateSecretKeyWithBits(bits int) (*rsa.PrivateKey, error)
- func GetCryptoInfo() string
- func SM2Decrypt(privKey *SM2PrivateKey, ciphertext []byte) ([]byte, error)
- func SM2Encrypt(pubKey *SM2PublicKey, plaintext []byte) ([]byte, error)
- func SM2MarshalPrivateKey(privKey *SM2PrivateKey) ([]byte, error)
- func SM2MarshalPublicKey(pubKey *SM2PublicKey) ([]byte, error)
- func SM2Sign(privKey *SM2PrivateKey, data []byte) ([]byte, error)
- func SM2Verify(pubKey *SM2PublicKey, data []byte, signature []byte) error
- func SM3(data string) []byte
- func SM3Bytes(data []byte) []byte
- func SM3Hex(data string) string
- func Sha256(key string) []byte
- func Sign(privKey *rsa.PrivateKey, data []byte) ([]byte, error)
- func Verify(pubKey *rsa.PublicKey, data []byte, signature []byte) error
- type AesEncrypt
- func (a *AesEncrypt) Decrypt(data []byte) ([]byte, error)
- func (a *AesEncrypt) Encrypt(data []byte) ([]byte, error)
- func (a *AesEncrypt) PKCS7Padding(ciphertext []byte, blockSize int) []byte
- func (a *AesEncrypt) PKCS7UnPadding(origData []byte) []byte
- func (a *AesEncrypt) PKCS7UnPaddingWithValidation(origData []byte) ([]byte, error)
- type AesGcmEncrypt
- func (a *AesGcmEncrypt) BatchDecrypt(ciphertexts [][]byte) ([][]byte, error)
- func (a *AesGcmEncrypt) BatchEncrypt(plaintexts [][]byte) ([][]byte, error)
- func (a *AesGcmEncrypt) BatchEncryptPooled(plaintexts [][]byte, poolSize int) ([][]byte, error)
- func (a *AesGcmEncrypt) Decrypt(data []byte) ([]byte, error)
- func (a *AesGcmEncrypt) Encrypt(data []byte) ([]byte, error)
- type Argon2
- type BaseEncrypt
- type Bcrypt
- type Linear
- type Rsa2
- type SM2PrivateKey
- type SM2PublicKey
- type SM3Password
- type SM4Encrypt
- type SM4GcmEncrypt
- type ZeroCopyAesGcmEncrypt
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func CheckAESNI ¶
func CheckAESNI() bool
CheckAESNI 检查是否启用了 AES-NI 硬件加速 Go 的 crypto/aes 会自动检测并使用 AES-NI(如果 CPU 支持)
func DecodeString ¶
func DecryptOAEP ¶
func DecryptOAEP(privKey *rsa.PrivateKey, ciphertext []byte) ([]byte, error)
DecryptOAEP 解密使用RSA-OAEP和SHA-256加密的数据。
如果解密失败或密文无效会返回错误。
func DecryptOAEPWithHash ¶
func DecryptOAEPWithHash(privKey *rsa.PrivateKey, hash hash.Hash, ciphertext []byte) ([]byte, error)
DecryptOAEPWithHash 使用RSA-OAEP和自定义哈希函数解密数据。
哈希函数必须与加密时使用的相同。
并发安全警告 ¶
hash参数必须是一个新创建的Hash实例,不能在多个goroutine间共享。 hash.Hash是有状态的且非线程安全。
正确用法:
// ✅ 每次调用创建新实例 plaintext, _ := DecryptOAEPWithHash(privKey, sha512.New(), ciphertext)
func DecryptOAEPWithLabel ¶
DecryptOAEPWithLabel 使用RSA-OAEP、SHA-256和自定义Label解密数据。
Label必须与加密时使用的完全相同,否则解密失败。
示例:
label := []byte("user:12345")
plaintext, _ := DecryptOAEPWithLabel(privKey, ciphertext, label)
func EncodeToString ¶
func EncryptOAEP ¶
EncryptOAEP 使用RSA-OAEP和SHA-256加密数据。
OAEP(最优非对称加密填充)是推荐的RSA加密填充方案。 它提供语义安全性,并能抵抗选择密文攻击。
最大明文大小 = (密钥大小/8) - 2*哈希大小 - 2 对于2048位密钥配合SHA-256:最大明文 = 190字节
如果明文超过密钥大小限制会返回错误。
func EncryptOAEPWithHash ¶
EncryptOAEPWithHash 使用RSA-OAEP和自定义哈希函数加密数据。
允许使用不同的哈希函数(例如,大密钥可以使用SHA-512)。 解密时必须使用相同的哈希函数。
并发安全警告 ¶
hash参数必须是一个新创建的Hash实例,不能在多个goroutine间共享。 hash.Hash是有状态的且非线程安全。
正确用法:
// ✅ 每次调用创建新实例 ciphertext, _ := EncryptOAEPWithHash(pubKey, sha512.New(), plaintext)
错误用法:
// ❌ 不要复用Hash实例 h := sha512.New() ciphertext1, _ := EncryptOAEPWithHash(pubKey, h, plaintext1) // 第一次使用 ciphertext2, _ := EncryptOAEPWithHash(pubKey, h, plaintext2) // ❌ h已被污染
func EncryptOAEPWithLabel ¶
EncryptOAEPWithLabel 使用RSA-OAEP、SHA-256和自定义Label加密数据。
Label(也称为关联数据)是一个可选的公开字节序列,用于将密文绑定到特定上下文。 Label不保密,但会参与密文生成,防止密文在不同上下文间的重放攻击。
典型用途:
- 将密文绑定到用户ID、会话ID等
- 防止跨协议或跨应用的密文重放
- 实现domain separation
解密时必须提供相同的Label,否则解密失败。
示例:
// 加密时绑定用户ID
label := []byte("user:12345")
ciphertext, _ := EncryptOAEPWithLabel(pubKey, plaintext, label)
// 解密时必须提供相同Label
plaintext, _ := DecryptOAEPWithLabel(privKey, ciphertext, label)
大多数简单场景可以传nil作为label(等同于EncryptOAEP)。
func GenerateSecretKey ¶
func GenerateSecretKey() (*rsa.PrivateKey, error)
GenerateSecretKey 生成一个新的2048位RSA私钥。
对于更高的安全要求,建议使用3072或4096位。
func GenerateSecretKeyWithBits ¶
func GenerateSecretKeyWithBits(bits int) (*rsa.PrivateKey, error)
GenerateSecretKeyWithBits 生成指定位数的RSA私钥。
常用大小:2048(标准)、3072(高安全)、4096(非常高安全)。
func SM2Decrypt ¶
func SM2Decrypt(privKey *SM2PrivateKey, ciphertext []byte) ([]byte, error)
SM2Decrypt 使用SM2私钥解密数据。
func SM2Encrypt ¶
func SM2Encrypt(pubKey *SM2PublicKey, plaintext []byte) ([]byte, error)
SM2Encrypt 使用SM2公钥加密数据。
SM2加密基于椭圆曲线,没有RSA的明文大小限制(理论上可加密任意长度数据, 但实际建议配合对称加密使用信封加密模式)。
func SM2MarshalPrivateKey ¶
func SM2MarshalPrivateKey(privKey *SM2PrivateKey) ([]byte, error)
SM2MarshalPrivateKey 将SM2私钥序列化为PEM格式。
func SM2MarshalPublicKey ¶
func SM2MarshalPublicKey(pubKey *SM2PublicKey) ([]byte, error)
SM2MarshalPublicKey 将SM2公钥序列化为PEM格式。
func SM2Sign ¶
func SM2Sign(privKey *SM2PrivateKey, data []byte) ([]byte, error)
SM2Sign 使用SM2私钥对数据签名。
返回DER编码的签名。签名过程内部使用 SM2 标准签名(含默认 UID 与 SM3 摘要)。
func SM2Verify ¶
func SM2Verify(pubKey *SM2PublicKey, data []byte, signature []byte) error
SM2Verify 使用SM2公钥验证签名。
签名有效返回nil,无效返回错误。
func Sha256 ¶
Sha256 计算字符串的SHA-256哈希。
SHA-256是安全的,适合用于密码学目的。
返回32字节(256位)哈希。
示例:
hash := enctypt.Sha256("my-secret-key")
// 可用于加密密钥、HMAC等
Types ¶
type AesEncrypt ¶
type AesEncrypt struct {
SecretKey string
// contains filtered or unexported fields
}
func NewAesEncrypt ¶
func NewAesEncrypt(key string) *AesEncrypt
func (*AesEncrypt) Decrypt ¶
func (a *AesEncrypt) Decrypt(data []byte) ([]byte, error)
Decrypt 解密AES-CBC 输入格式: [IV(16字节)][密文]
func (*AesEncrypt) Encrypt ¶
func (a *AesEncrypt) Encrypt(data []byte) ([]byte, error)
Encrypt 使用AES-CBC加密(安全实现) 返回格式: [IV(16字节)][密文]
func (*AesEncrypt) PKCS7Padding ¶
func (a *AesEncrypt) PKCS7Padding(ciphertext []byte, blockSize int) []byte
PKCS7Padding 补码
func (*AesEncrypt) PKCS7UnPadding ¶
func (a *AesEncrypt) PKCS7UnPadding(origData []byte) []byte
PKCS7UnPadding 去码(保留用于兼容性,不推荐使用) Deprecated: 使用 PKCS7UnPaddingWithValidation 代替
func (*AesEncrypt) PKCS7UnPaddingWithValidation ¶
func (a *AesEncrypt) PKCS7UnPaddingWithValidation(origData []byte) ([]byte, error)
PKCS7UnPaddingWithValidation 去填充(带验证)
type AesGcmEncrypt ¶
type AesGcmEncrypt struct {
SecretKey string
// contains filtered or unexported fields
}
AesGcmEncrypt AES-GCM加密器(认证加密,推荐使用) GCM模式优势:
- 自带完整性校验(防篡改)
- 无需填充(性能更好)
- 并行化加密(更快)
- 现代加密标准(TLS 1.3默认)
func NewAesGcmEncrypt ¶
func NewAesGcmEncrypt(key string) *AesGcmEncrypt
NewAesGcmEncrypt 创建AES-GCM加密器(推荐使用此方法)
func (*AesGcmEncrypt) BatchDecrypt ¶
func (a *AesGcmEncrypt) BatchDecrypt(ciphertexts [][]byte) ([][]byte, error)
BatchDecrypt 批量并行解密
func (*AesGcmEncrypt) BatchEncrypt ¶
func (a *AesGcmEncrypt) BatchEncrypt(plaintexts [][]byte) ([][]byte, error)
BatchEncrypt 批量并行加密(适用于多消息场景) 使用 goroutine 池并行处理,充分利用多核 CPU
func (*AesGcmEncrypt) BatchEncryptPooled ¶
func (a *AesGcmEncrypt) BatchEncryptPooled(plaintexts [][]byte, poolSize int) ([][]byte, error)
BatchEncryptPooled 使用 goroutine 池的批量加密(更高效) 适用于大量小包场景(如实时应用服务器)
type Argon2 ¶
type Argon2 struct{}
func (*Argon2) CompareHashAndPassword ¶
CompareHashAndPassword 使用常量时间比较,防止时序攻击
type BaseEncrypt ¶
type BaseEncrypt struct{}
BaseEncrypt 空操作加密器(不加密),仅用于测试或明确不需要加密的内网场景。
func NewBaseEncrypt ¶
func NewBaseEncrypt() *BaseEncrypt
type Linear ¶
type Rsa2 ¶
type Rsa2 struct {
PrivateKey *rsa.PrivateKey
}
Rsa2 提供带PEM密钥加载功能的RSA签名。
注意:尽管名为Rsa2.Encrypt,实际上执行的是签名而不是加密。 为了清晰起见,建议直接使用Sign函数。
func (*Rsa2) Encrypt ¶
Encrypt 使用RSA和SHA-256对数据进行签名。
注意:尽管名为Encrypt,此方法实际执行签名而不是加密。 这是为了向后兼容而保留的。建议使用Sign函数以获得更清晰的语义。
返回可以用对应公钥验证的签名。
func (*Rsa2) GetPublicKey ¶
GetPublicKey 返回与已加载私钥对应的公钥。
func (*Rsa2) LoadPrivateKey ¶
LoadPrivateKey 从PEM格式加载RSA私钥。
采用防御性解析策略:
- 优先根据PEM块类型选择解析器(快速路径)
- 如果类型不匹配或解析失败,尝试所有可能的解析方法(防御路径)
- 返回第一个成功的解析结果
支持的格式:
- 标准PKCS#1: -----BEGIN RSA PRIVATE KEY-----
- 标准PKCS#8: -----BEGIN PRIVATE KEY-----
- 非标准头部但内容合法的PEM(例如某些工具生成的特殊Type)
PEM格式示例:
-----BEGIN RSA PRIVATE KEY----- (PKCS#1) ... -----END RSA PRIVATE KEY----- 或 -----BEGIN PRIVATE KEY----- (PKCS#8) ... -----END PRIVATE KEY-----
防御性设计说明: 某些工具可能生成非标准的Type字符串,但内容是合法的密钥数据。 本实现会尝试多种解析方法,提供最大兼容性。
type SM2PrivateKey ¶ added in v1.1.0
type SM2PrivateKey struct {
// contains filtered or unexported fields
}
SM2PrivateKey 封装 SM2 私钥,对外不暴露底层 *sm2.PrivateKey,便于后续替换实现。
func SM2ParsePrivateKey ¶
func SM2ParsePrivateKey(pemData []byte) (*SM2PrivateKey, error)
SM2ParsePrivateKey 从PEM格式解析SM2私钥。
func (*SM2PrivateKey) PublicKey ¶ added in v1.1.0
func (p *SM2PrivateKey) PublicKey() *SM2PublicKey
PublicKey 返回与私钥对应的公钥封装。
type SM2PublicKey ¶ added in v1.1.0
type SM2PublicKey struct {
// contains filtered or unexported fields
}
SM2PublicKey 封装 SM2 公钥。
func SM2ParsePublicKey ¶
func SM2ParsePublicKey(pemData []byte) (*SM2PublicKey, error)
SM2ParsePublicKey 从PEM格式解析SM2公钥。
type SM3Password ¶
type SM3Password struct{}
SM3Password 基于 SM3 的密码哈希器(信创推荐)。
func (*SM3Password) CompareHashAndPassword ¶
func (s *SM3Password) CompareHashAndPassword(password, hashPassword string) bool
CompareHashAndPassword 使用常量时间比较验证密码,防止时序攻击。
type SM4Encrypt ¶
type SM4Encrypt struct {
SecretKey string
// contains filtered or unexported fields
}
SM4Encrypt SM4-CBC加密器
type SM4GcmEncrypt ¶
type SM4GcmEncrypt struct {
SecretKey string
// contains filtered or unexported fields
}
SM4GcmEncrypt SM4-GCM加密器(认证加密,推荐)
func NewSM4GcmEncrypt ¶
func NewSM4GcmEncrypt(key string) *SM4GcmEncrypt
NewSM4GcmEncrypt 创建SM4-GCM加密器
type ZeroCopyAesGcmEncrypt ¶
type ZeroCopyAesGcmEncrypt struct {
SecretKey string
// contains filtered or unexported fields
}
ZeroCopyAesGcmEncrypt 零拷贝版本的 AES-GCM 加密器 适用于对性能要求极高的场景(高频交易、实时应用)
⚠️ 注意:调用方必须在使用完毕后调用 buf.Release()
func NewZeroCopyAesGcmEncrypt ¶
func NewZeroCopyAesGcmEncrypt(key string) *ZeroCopyAesGcmEncrypt
NewZeroCopyAesGcmEncrypt 创建零拷贝加密器
func (*ZeroCopyAesGcmEncrypt) DecryptZeroCopy ¶
func (a *ZeroCopyAesGcmEncrypt) DecryptZeroCopy(data []byte) (*zpool.Buffer, error)
DecryptZeroCopy 零拷贝解密 返回的 *pool.Buffer 来自对象池,必须调用 buf.Release() 归还
func (*ZeroCopyAesGcmEncrypt) EncryptInPlace ¶
func (a *ZeroCopyAesGcmEncrypt) EncryptInPlace(dst, plaintext []byte) ([]byte, error)
EncryptInPlace 原地加密(最激进的零拷贝) ⚠️ 会修改 dst 缓冲,适用于预分配场景
dst 必须有足够容量:cap(dst) >= len(plaintext) + nonceSize + tagSize
func (*ZeroCopyAesGcmEncrypt) EncryptZeroCopy ¶
func (a *ZeroCopyAesGcmEncrypt) EncryptZeroCopy(data []byte) (*zpool.Buffer, error)
EncryptZeroCopy 零拷贝加密 返回的 *pool.Buffer 来自对象池,必须调用 buf.Release() 归还
使用方式:
buf, err := cipher.EncryptZeroCopy(plaintext) defer buf.Release() // 使用 buf.B ...