0

0

如何在Golang中使用crypto包进行加密与解密_Golang加密解密操作方法

P粉602998670

P粉602998670

发布时间:2026-02-09 14:39:14

|

954人浏览过

|

来源于php中文网

原创

crypto/aes 包仅提供底层AES分组密码原语,不封装加密模式或填充逻辑,使用CBC需手动处理随机IV和PKCS7填充,GCM需校验nonce与认证标签,密钥必须用PBKDF2等KDF派生而非直接哈希。

如何在golang中使用crypto包进行加密与解密_golang加密解密操作方法

crypto/aes 包实现 AES 加密解密必须手动处理 IV 和填充

Go 标准库crypto/aes 只提供底层分组密码原语,不封装模式(如 CBC、GCM)或填充逻辑。直接调用 aes.NewCipher 得到的是一个纯块加密器,无法直接加密任意长度明文。

常见错误是忽略 IV(初始化向量)随机性或复用同一 IV,导致 CBC 模式下相同明文生成相同密文,严重削弱安全性。

  • 使用 CBC 模式时,IV 必须每次加密都随机生成(crypto/rand.Read),且随密文一起传输(通常前置)
  • Pkcs7 填充需手动实现:明文长度不足块大小(16 字节)时,在末尾补足差值个字节,每个字节值等于补的字节数
  • 解密时先截出 IV,再用相同密钥+IV 解密,最后手动去除填充;若填充格式非法,应返回错误而非静默忽略

crypto/cipher.BlockMode 接口是连接 cipher 与 mode 的关键桥梁

crypto/cipher.BlockMode 是一个接口,由 cipher.NewCBCEncryptercipher.NewCBCDecrypter 等函数返回。它把底层 Block(如 AES 密钥调度结果)和模式逻辑(如异或上一个密文块)粘合起来,但本身不处理 IV 或填充。

容易混淆的是:这些函数接收的 IV 是 []byte,长度必须严格等于块大小(AES 为 16),且不能为 nil —— 即使你传入全零切片,也得显式分配 16 字节。

立即学习go语言免费学习笔记(深入)”;

白月生产企业订单管理系统GBK2.0  Build 080807
白月生产企业订单管理系统GBK2.0 Build 080807

请注意以下说明:1、本程序允许任何人免费使用。2、本程序采用PHP+MYSQL架构编写。并且经过ZEND加密,所以运行环境需要有ZEND引擎支持。3、需要售后服务的,请与本作者联系,联系方式见下方。4、本程序还可以与您的网站想整合,可以实现用户在线服务功能,可以让客户管理自己的信息,可以查询自己的订单状况。以及返点信息等相关客户利益的信息。这个功能可提高客户的向心度。安装方法:1、解压本系统,放在

下载
  • 加密前确保明文长度是块大小整数倍(通过填充);否则 mode.CryptBlocks 会 panic
  • 解密后得到的是带填充的原始字节,需独立验证并裁剪,cipher 包不提供自动去填工具
  • 不要把同一个 BlockMode 实例重复用于多次加密——它内部可能缓存状态,应每次新建

crypto/aes/gcm 比 CBC 更安全,但必须校验认证标签

crypto/cipher.NewGCM 返回的 AEAD 实现(如 AES-GCM)同时提供加密与完整性保护,无需手动填充,但引入了 nonce(非重复数)和认证标签(tag)概念。常见疏漏是忽略 tag 验证或重用 nonce。

nonce 长度由具体 AEAD 决定(AES-GCM 要求 12 字节),且绝不可重复使用同一密钥下的相同 nonce,否则密钥可能被恢复。

  • 加密输出 = 密文 + 认证标签(默认 16 字节),解密时必须将最后 16 字节作为 tag 分离出来
  • 调用 aead.Open 时若 tag 不匹配,函数返回 cipher.AEADDecryptError,不能忽略该错误继续使用解密结果
  • nonce 应随密文存储/传输,但无需保密;推荐用 crypto/rand.Read 生成,而非时间戳或计数器(除非严格保证唯一)

crypto/md5 和 crypto/sha256 不是加密算法,别误当密钥派生用

新手常把 crypto/md5.Sumsha256.Sum256 当作“加密”来混淆数据,但它们是单向哈希,不可逆,也不适合直接当对称密钥用——长度固定、无密钥参与、易受彩虹表攻击。

若需从密码生成密钥(如用户口令 → AES 密钥),必须用专门的密钥派生函数,例如 golang.org/x/crypto/pbkdf2scrypt,并设置足够迭代次数(PBKDF2 建议 ≥ 100,000)。

  • 直接用 md5([]byte("password")) 当密钥,等同于裸奔:熵低、无盐、计算快,极易暴力破解
  • 哈希适合存密码(配合 salt)或校验完整性,但绝不用于构造对称加密密钥
  • 标准库中没有 bcrypt 或 Argon2,需引入 x/crypto 子模块,且注意其 API 与标准 crypto 包风格一致(如需要显式传入 salt 和 cost)
IV 的生成方式、填充的边界检查、GCM tag 的分离位置、密钥来源的可信度——这些细节不写进代码注释,就很容易在半年后被自己或同事绕过。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

185

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

233

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

345

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

211

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

400

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

302

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

196

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

722

2025.06.17

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

125

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号