Go 语言加密算法实现详解与代码示例

拾光
拾光
发布时间:2026-10-15 | 4人浏览过
原创

Go 语言标准库提供了丰富的加密工具。本文整理 MD5、SHA256、AES 和 RSA 等核心加密算法的 Go 实现代码,涵盖哈希校验、对称加密解密及非对称密钥加密场景,附带关键参数说明与安全建议。

基础环境准备

Go 语言的加密功能主要依赖 crypto 标准库系列包。在编写加密或解密代码前,需确保已引入必要的模块:

  • 哈希算法:"crypto/md5", "crypto/sha1", "crypto/sha256", "crypto/sha512"
  • HMAC 算法:"crypto/hmac"
  • 块加密(AES/DES):"crypto/aes", "crypto/cipher"
  • 公钥基础设施:"crypto/x509", "encoding/pem"
  • 数据编码:"encoding/base64", "encoding/hex"

第一类:哈希算法实现

哈希算法常用于数据完整性校验和密码存储。需要注意的是,原生 md5 和 sha1 已被认为不够安全,生产环境中推荐使用 sha256 或更高强度的算法。以下示例均返回小写十六进制字符串,便于与其他语言(如 Java/C#)结果比对。

第1步:MD5 加密

目的:生成128位哈希值,适用于简单的校验码生成。

func MD5Str(src string) string {
    h := md5.New()
    h.Write([]byte(src))
    return hex.EncodeToString(h.Sum(nil))
}

第2步:SHA256 与 SHA512 加密

目的:使用更长的哈希位数提升安全性,防止碰撞攻击。

func SHA256Str(src string) string {
    h := sha256.New()
    h.Write([]byte(src))
    return hex.EncodeToString(h.Sum(nil))
}

func SHA512Str(src string) string {
    h := sha512.New()
    h.Write([]byte(src))
    return hex.EncodeToString(h.Sum(nil))
}

第3步:HMAC 签名验证

目的:结合密钥对消息进行签名,验证发送方身份及消息未被篡改。支持 SHA-256 和 SHA-512。

func HMAC_SHA256(src, key string) string {
    m := hmac.New(sha256.New, []byte(key))
    m.Write([]byte(src))
    return hex.EncodeToString(m.Sum(nil))
}

func HMAC_SHA512(src, key string) string {
    m := hmac.New(sha512.New, []byte(key))
    m.Write([]byte(src))
    return hex.EncodeToString(m.Sum(nil))
}

第二类:对称加密 (AES)

AES 是广泛使用的对称加密标准。下文采用 CBC 模式,需配合初始化向量 (IV) 使用。请注意,key 长度通常应为 16、24 或 32 字节,分别对应 AES-128、AES-192 和 AES-256。

第4步:AES 加解密操作

入口:传入明文/密文字符串及密钥。

参数:ivspec 固定为16字节的 0000000000000000,实际生产中建议动态生成 IV 并随密文传输。

var ivspec = []byte("0000000000000000")

func AESEncodeStr(src, key string) string {
    block, err := aes.NewCipher([]byte(key))
    if err != nil {
        fmt.Println("key error", err)
        return ""
    }
    
    // PKCS5 Padding
    content := []byte(src)
    content = PKCS5Padding(content, block.BlockSize())
    
    ecb := cipher.NewCBCEncrypter(block, ivspec)
    crypted := make([]byte, len(content))
    ecb.CryptBlocks(crypted, content)
    
    return hex.EncodeToString(crypted)
}

func AESDecodeStr(crypt, key string) string {
    crypted, err := hex.DecodeString(strings.ToLower(crypt))
    if err != nil || len(crypted) == 0 {
        return ""
    }
    
    block, err := aes.NewCipher([]byte(key))
    if err != nil {
        fmt.Println("key error", err)
        return ""
    }
    
    ecb := cipher.NewCBCDecrypter(block, ivspec)
    decrypted := make([]byte, len(crypted))
    ecb.CryptBlocks(decrypted, crypted)
    
    return string(PKCS5Trimming(decrypted))
}

func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

func PKCS5Trimming(encrypt []byte) []byte {
    padding := encrypt[len(encrypt)-1]
    return encrypt[:len(encrypt)-int(padding)]
}

第三类:非对称加密 (RSA)

RSA 适合交换密钥或小量数据加密。此处演示使用公钥加密流程。使用前需要准备好 Base64 格式的 PEM 编码公钥字符串。

第5步:RSA 公钥加密

输入:待加密明文 src,PEM 格式公钥 key。

结果:Hex 编码的密文字符串。

func RsaEncrypt(src, key string) string {
    block, _ := pem.Decode([]byte(key))
    if block == nil {
        return ""
    }

    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        // 记录日志
        return ""
    }

    pub := pubInterface.(*rsa.PublicKey)

    crypted, err := rsa.EncryptPKCS1v15(rand.Reader, pub, []byte(src))
    if err != nil {
        // 记录日志
        return ""
    }

    return hex.EncodeToString(crypted)
}

总结

以上涵盖了 Go 语言中常用的哈希校验、对称 AES 加密及非对称 RSA 加密的核心实现。在实际项目中,请务必保管好私钥,避免将敏感密钥硬编码在源代码中。以上就是 Go 语言加密算法实现的详细内容,更多关于 Go 语言开发安全的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表