Go 语言加密算法实现详解与代码示例
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 语言开发安全的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









