crypto

package module
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Apr 16, 2026 License: MIT Imports: 12 Imported by: 0

README

crypto

密码学工具包,提供密码哈希和数字签名功能。

功能

密码哈希
  • bcrypt: 使用 bcrypt 算法进行密码哈希
  • Argon2id: 使用 Argon2id 算法进行密码哈希(推荐用于新项目)
数字签名
  • RSA: RSA-PSS 签名(2048+ 位)
  • ECDSA: ECDSA 签名(P-256 曲线)
  • Ed25519: Ed25519 签名(推荐用于新项目)

安装

go get github.com/f2xme/gox/crypto

使用示例

密码哈希 - bcrypt
import "github.com/f2xme/gox/crypto"

// 哈希密码
hash, err := crypto.HashPassword("mypassword")
if err != nil {
    log.Fatal(err)
}

// 验证密码
if crypto.VerifyPassword("mypassword", hash) {
    fmt.Println("密码正确")
}
密码哈希 - Argon2id
// 使用默认参数
hash, err := crypto.HashPasswordArgon2("mypassword", nil)
if err != nil {
    log.Fatal(err)
}

// 验证密码
valid, err := crypto.VerifyPasswordArgon2("mypassword", hash)
if err != nil {
    log.Fatal(err)
}
if valid {
    fmt.Println("密码正确")
}

// 自定义参数
params := &crypto.Argon2Params{
    Memory:      128 * 1024, // 128 MB
    Iterations:  4,
    Parallelism: 4,
    SaltLength:  16,
    KeyLength:   32,
}
hash, err = crypto.HashPasswordArgon2("mypassword", params)
数字签名 - RSA
// 生成密钥对
privateKey, err := crypto.GenerateRSAKeyPair(2048)
if err != nil {
    log.Fatal(err)
}

data := []byte("message to sign")

// 签名
signature, err := crypto.SignRSA(privateKey, data)
if err != nil {
    log.Fatal(err)
}

// 验证
err = crypto.VerifyRSA(&privateKey.PublicKey, data, signature)
if err != nil {
    fmt.Println("签名无效")
} else {
    fmt.Println("签名有效")
}
数字签名 - ECDSA
// 生成密钥对
privateKey, err := crypto.GenerateECDSAKeyPair()
if err != nil {
    log.Fatal(err)
}

data := []byte("message to sign")

// 签名
signature, err := crypto.SignECDSA(privateKey, data)
if err != nil {
    log.Fatal(err)
}

// 验证
if crypto.VerifyECDSA(&privateKey.PublicKey, data, signature) {
    fmt.Println("签名有效")
}
数字签名 - Ed25519
// 生成密钥对
publicKey, privateKey, err := crypto.GenerateEd25519KeyPair()
if err != nil {
    log.Fatal(err)
}

data := []byte("message to sign")

// 签名
signature := crypto.SignEd25519(privateKey, data)

// 验证
if crypto.VerifyEd25519(publicKey, data, signature) {
    fmt.Println("签名有效")
}

安全建议

密码哈希
  • 对于新项目,推荐使用 Argon2id(更安全,可配置内存和 CPU 成本)
  • bcrypt 适用于需要兼容现有系统的场景
  • 永远不要存储明文密码
  • 使用足够的计算成本参数以抵御暴力破解
数字签名
  • 对于新项目,推荐使用 Ed25519(更快,更安全,密钥更小)
  • RSA 密钥长度至少 2048 位(推荐 3072 或 4096 位)
  • ECDSA 使用 P-256 曲线(NIST 标准)
  • 妥善保管私钥,永远不要泄露

依赖

  • golang.org/x/crypto - Go 官方扩展加密库

Documentation

Overview

Package crypto 提供密码学工具,包括密码哈希和数字签名功能。

功能特性

  • 密码哈希:支持 bcrypt 和 Argon2id 算法
  • 数字签名:支持 RSA、ECDSA 和 Ed25519 算法
  • 安全的随机数生成和密钥管理
  • 符合行业标准的加密参数配置

快速开始

密码哈希 - bcrypt:

package main

import (
	"fmt"
	"log"

	"github.com/f2xme/gox/crypto"
)

func main() {
	// 哈希密码
	hash, err := crypto.HashPassword("mypassword")
	if err != nil {
		log.Fatal(err)
	}

	// 验证密码
	if crypto.VerifyPassword("mypassword", hash) {
		fmt.Println("密码正确")
	}
}

密码哈希 - Argon2id(推荐):

// 使用默认参数
hash, err := crypto.HashPasswordArgon2("mypassword", nil)
if err != nil {
	log.Fatal(err)
}

// 验证密码
valid, err := crypto.VerifyPasswordArgon2("mypassword", hash)
if err != nil {
	log.Fatal(err)
}
if valid {
	fmt.Println("密码正确")
}

数字签名 - Ed25519(推荐):

// 生成密钥对
publicKey, privateKey, err := crypto.GenerateEd25519KeyPair()
if err != nil {
	log.Fatal(err)
}

data := []byte("message to sign")

// 签名
signature := crypto.SignEd25519(privateKey, data)

// 验证
if crypto.VerifyEd25519(publicKey, data, signature) {
	fmt.Println("签名有效")
}

密码哈希算法选择

bcrypt:

  • 适用于需要兼容现有系统的场景
  • 计算成本固定,无法调整内存使用
  • 广泛支持,成熟稳定

Argon2id(推荐用于新项目):

  • 2015 年密码哈希竞赛冠军
  • 可配置内存和 CPU 成本,抵御 GPU/ASIC 攻击
  • 结合了 Argon2i(抗侧信道攻击)和 Argon2d(抗 GPU 攻击)的优点

自定义 Argon2id 参数:

params := &crypto.Argon2Params{
	Memory:      128 * 1024, // 128 MB
	Iterations:  4,           // 迭代次数
	Parallelism: 4,           // 并行度
	SaltLength:  16,          // 盐长度
	KeyLength:   32,          // 密钥长度
}
hash, err := crypto.HashPasswordArgon2("mypassword", params)

数字签名算法选择

RSA:

  • 密钥长度至少 2048 位(推荐 3072 或 4096 位)
  • 签名和验证速度较慢
  • 密钥和签名体积较大
  • 适用于需要与传统系统兼容的场景

ECDSA:

  • 使用 P-256 曲线(NIST 标准)
  • 密钥和签名体积小
  • 签名速度快,验证速度中等
  • 广泛应用于 TLS、JWT 等场景

Ed25519(推荐用于新项目):

  • 基于 Curve25519 椭圆曲线
  • 签名和验证速度最快
  • 密钥和签名体积最小(公钥 32 字节,签名 64 字节)
  • 抗侧信道攻击,无需随机数生成器
  • 适用于高性能场景和资源受限设备

数字签名示例

RSA 签名:

// 生成 2048 位密钥对
privateKey, err := crypto.GenerateRSAKeyPair(2048)
if err != nil {
	log.Fatal(err)
}

data := []byte("message to sign")

// 签名
signature, err := crypto.SignRSA(privateKey, data)
if err != nil {
	log.Fatal(err)
}

// 验证
err = crypto.VerifyRSA(&privateKey.PublicKey, data, signature)
if err != nil {
	fmt.Println("签名无效:", err)
} else {
	fmt.Println("签名有效")
}

ECDSA 签名:

// 生成密钥对(P-256 曲线)
privateKey, err := crypto.GenerateECDSAKeyPair()
if err != nil {
	log.Fatal(err)
}

data := []byte("message to sign")

// 签名
signature, err := crypto.SignECDSA(privateKey, data)
if err != nil {
	log.Fatal(err)
}

// 验证
if crypto.VerifyECDSA(&privateKey.PublicKey, data, signature) {
	fmt.Println("签名有效")
}

安全建议

密码哈希:

  • 永远不要存储明文密码
  • 使用足够的计算成本参数以抵御暴力破解
  • Argon2id 推荐参数:内存 64MB+,迭代 3+,并行度 2+
  • bcrypt 推荐使用默认 cost(10)或更高
  • 定期审查和更新哈希参数以应对硬件性能提升

数字签名:

  • 妥善保管私钥,永远不要泄露或传输
  • RSA 密钥长度至少 2048 位,推荐 3072 或 4096 位
  • 使用安全的随机数生成器(本包已使用 crypto/rand)
  • 验证签名时始终检查返回的错误
  • 考虑使用密钥轮换策略

注意事项

  • 所有密码哈希函数都会自动生成随机盐
  • Argon2id 哈希格式:$argon2id$v=19$m=65536,t=3,p=2$salt$hash
  • bcrypt 哈希包含算法版本、cost 和盐信息
  • 数字签名使用 SHA-256 作为哈希函数(Ed25519 除外,它内置哈希)
  • RSA 签名使用 PSS 填充模式(比 PKCS#1 v1.5 更安全)
  • ECDSA 签名使用 ASN.1 DER 编码格式

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GenerateECDSAKeyPair

func GenerateECDSAKeyPair() (*ecdsa.PrivateKey, error)

GenerateECDSAKeyPair 生成 ECDSA 密钥对,使用 P-256 曲线。

返回值:

  • *ecdsa.PrivateKey: ECDSA 私钥
  • error: 生成失败时返回错误

func GenerateEd25519KeyPair

func GenerateEd25519KeyPair() (ed25519.PublicKey, ed25519.PrivateKey, error)

GenerateEd25519KeyPair 生成 Ed25519 密钥对。

返回值:

  • ed25519.PublicKey: Ed25519 公钥(32 字节)
  • ed25519.PrivateKey: Ed25519 私钥(64 字节)
  • error: 生成失败时返回错误

func GenerateRSAKeyPair

func GenerateRSAKeyPair(bits int) (*rsa.PrivateKey, error)

GenerateRSAKeyPair 生成指定位数的 RSA 密钥对。

参数:

  • bits: 密钥位数,至少 2048 位

返回值:

  • *rsa.PrivateKey: RSA 私钥
  • error: 生成失败时返回错误

func HashPassword

func HashPassword(password string) (string, error)

HashPassword 使用 bcrypt 算法哈希密码,使用默认 cost。

参数:

  • password: 待哈希的明文密码

返回值:

  • string: bcrypt 哈希字符串
  • error: 哈希失败时返回错误

func HashPasswordArgon2

func HashPasswordArgon2(password string, params *Argon2Params) (string, error)

HashPasswordArgon2 使用 Argon2id 算法哈希密码。

参数:

  • password: 待哈希的明文密码
  • params: Argon2id 参数,传 nil 使用默认参数

返回值:

  • string: Argon2id 哈希字符串,格式:$argon2id$v=19$m=65536,t=3,p=2$salt$hash
  • error: 哈希失败时返回错误

func SignECDSA

func SignECDSA(privateKey *ecdsa.PrivateKey, data []byte) ([]byte, error)

SignECDSA 使用 ECDSA 和 SHA-256 对数据进行签名。

参数:

  • privateKey: ECDSA 私钥
  • data: 待签名的数据

返回值:

  • []byte: ASN.1 DER 编码的签名
  • error: 签名失败时返回错误

func SignEd25519

func SignEd25519(privateKey ed25519.PrivateKey, data []byte) []byte

SignEd25519 使用 Ed25519 对数据进行签名。

参数:

  • privateKey: Ed25519 私钥
  • data: 待签名的数据

返回值:

  • []byte: 签名字节(64 字节)

func SignRSA

func SignRSA(privateKey *rsa.PrivateKey, data []byte) ([]byte, error)

SignRSA 使用 RSA-PSS 和 SHA-256 对数据进行签名。

参数:

  • privateKey: RSA 私钥
  • data: 待签名的数据

返回值:

  • []byte: 签名字节
  • error: 签名失败时返回错误

func VerifyECDSA

func VerifyECDSA(publicKey *ecdsa.PublicKey, data, signature []byte) bool

VerifyECDSA 使用 ECDSA 和 SHA-256 验证签名。

参数:

  • publicKey: ECDSA 公钥
  • data: 原始数据
  • signature: ASN.1 DER 编码的签名

返回值:

  • bool: 签名有效返回 true,否则返回 false

func VerifyEd25519

func VerifyEd25519(publicKey ed25519.PublicKey, data, signature []byte) bool

VerifyEd25519 使用 Ed25519 验证签名。

参数:

  • publicKey: Ed25519 公钥
  • data: 原始数据
  • signature: 签名字节

返回值:

  • bool: 签名有效返回 true,否则返回 false

func VerifyPassword

func VerifyPassword(password, hash string) bool

VerifyPassword 验证密码是否匹配 bcrypt 哈希。

参数:

  • password: 待验证的明文密码
  • hash: bcrypt 哈希字符串

返回值:

  • bool: 密码匹配返回 true,否则返回 false

func VerifyPasswordArgon2

func VerifyPasswordArgon2(password, encodedHash string) (bool, error)

VerifyPasswordArgon2 验证密码是否匹配 Argon2id 哈希。

参数:

  • password: 待验证的明文密码
  • encodedHash: Argon2id 哈希字符串

返回值:

  • bool: 密码匹配返回 true,否则返回 false
  • error: 哈希格式无效或解码失败时返回错误

func VerifyRSA

func VerifyRSA(publicKey *rsa.PublicKey, data, signature []byte) error

VerifyRSA 使用 RSA-PSS 和 SHA-256 验证签名。

参数:

  • publicKey: RSA 公钥
  • data: 原始数据
  • signature: 签名字节

返回值:

  • error: 签名无效时返回错误,有效时返回 nil

Types

type Argon2Params

type Argon2Params struct {
	// Memory 内存使用量(KB),推荐 64MB 以上
	Memory uint32
	// Iterations 迭代次数,推荐 3 次以上
	Iterations uint32
	// Parallelism 并行度,推荐 2 以上
	Parallelism uint8
	// SaltLength 盐的长度(字节),推荐 16 字节
	SaltLength uint32
	// KeyLength 生成密钥的长度(字节),推荐 32 字节
	KeyLength uint32
}

Argon2Params 定义 Argon2id 哈希算法的参数。

func DefaultArgon2Params

func DefaultArgon2Params() *Argon2Params

DefaultArgon2Params 返回推荐的 Argon2id 参数配置。

默认配置:

  • 内存:64 MB
  • 迭代次数:3
  • 并行度:2
  • 盐长度:16 字节
  • 密钥长度:32 字节

Jump to

Keyboard shortcuts

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