通八洲科技

如何在Golang中使用crypto加密数据_MD5、SHA和AES加密示例

日期:2025-12-31 00:00 / 作者:P粉602998670
MD5和SHA是单向哈希算法,不可逆,仅用于校验或密码加盐;AES是对称加密算法,支持加解密,推荐使用AES-GCM模式。

Go 语言标准库 crypto 包提供了多种加密算法支持,但需注意:MD5 和 SHA 系列属于**哈希(散列)算法,不可逆,不用于“加密数据”**;而 AES 是真正的对称加密算法,可用于加解密。下面分别说明三者的正确用法、常见误区及实用示例。

MD5 和 SHA:只做哈希,不做加密

MD5、SHA-1、SHA-256 等是单向哈希函数,设计目标是生成固定长度摘要,用于校验、签名、密码存储(配合 salt)等,不能还原原始数据。误称其为“加密”容易引发安全误解。

示例:计算字符串的 SHA-256 哈希值

(实际代码中应使用 sha256.Sum256hash.Hash 接口)

h := sha256.New()
h.Write([]byte("hello"))
fmt.Printf("%x\n", h.Sum(nil)) // 输出 68e656b255ad44ed79680a3a7d65f3c3a8e3e8c3b7e7a7d6b5c4a3f2e1d0c9b8

AES:标准对称加密,支持加解密

AES(Advanced Encryption Standard)是 Go 中最常用的对称加密算法,需指定密钥(16/24/32 字节对应 AES-128/AES-192/AES-256)、分组模式(如 CBC、GCM)和填充方式(如 PKCS7)。Go 标准库不内置 PKCS7 填充,需手动实现

示例:AES-GCM 加密(安全、简洁、防篡改)

(密钥 32 字节,随机生成 nonce)

func encryptAESGCM(key, plaintext []byte) ([]byte, error) {
    block, _ := aes.NewCipher(key)
    aesgcm, _ := cipher.NewGCM(block)
    nonce := make([]byte, aesgcm.NonceSize())
    if _, err := rand.Read(nonce); err != nil {
        return nil, err
    }
    ciphertext := aesgcm.Seal(nonce, nonce, plaintext, nil)
    return ciphertext, nil
}

常见错误与安全提醒

很多初学者会踩坑,以下几点务必注意:

实用建议:该用什么?

根据场景选择合适工具:

Go 生态中更推荐使用成熟封装库(如 github.com/zjhmale/go-cryptogolang.org/x/crypto 子包),而非裸用底层 crypto/aes,以减少出错概率。