技术标签: 安全相关 Go AEAD AES-GCM 加密和认证
AEAD(Authenticated Encryption with Associated Data)模式是一个密码学的规范和标准。它规定了一种同时提供认证和加密的算法模式。
AEAD模式是现代加密算法和协议的基石,它提供了更高的安全性。许多标准都采用了AEAD模式,如:
TLS 1.3使用AES-GCM作为AEAD算法
SSH也有采用AEAD的加密方式,如[email protected]
IPsec也有AEAD算法,如AES-GCM-ESP
QUIC也使用了AEAD,如AES-GCM和Chacha20-Poly1305
可以说AEAD模式已经成为主流的安全通信协议和标准中广泛采用的加密规范。它提供了更高的安全性,同时具有更高的效率。
结论:AEAD模式是一个密码学的规范和标准。它定义了一种同时提供认证和加密的算法模式,已经被广泛采用于各种主流的安全通讯协议和标准中。
AES-GCM是高级加密标准(AES)的一种工作模式,全称是Galois/Counter Mode。
它是一种有效的authenticated encryption算法,无需额外的认证算法,AES-GCM自带认证功能,可以同时完成加密和认证。
AES-GCM模式的主要特点有:
AES-GCM模式是目前比较流行和高效的authenticated encryption算法,已被TLS、IPsec、MACsec等大量安全协议采用,在云计算、物联网和5G等领域有广泛的应用。
AES加密 GCM和CBC模式的区别
参考URL: https://www.bilibili.com/video/BV1Pp4y1H7Cs/
当需要同时进行加密和认证时,AES-GCM模式是一个很好的选择。
TODO
// Encrypt 加密 使用AES-GCM
func Encrypt(plaintext string, key []byte) (string, []byte) {
// Create AES-GCM
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
gcm, err := cipher.NewGCM(block)
if err != nil {
panic(err)
}
// Create nonce
nonce := make([]byte, gcm.NonceSize())
if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
panic(err)
}
// Encrypt and seal data
ciphertext := gcm.Seal(nil, nonce, []byte(plaintext), nil)
return hex.EncodeToString(ciphertext), nonce // 返回nonce
}
// Decrypt 解密 使用AES-GCM
func Decrypt(ciphertext string, nonce []byte, key []byte) (string, error) {
// Decode hex
ciphertextByte, _ := hex.DecodeString(ciphertext)
// Create AES-GCM
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
gcm, err := cipher.NewGCM(block)
if err != nil {
panic(err)
}
// Decrypt
plaintext, err := gcm.Open(nil, nonce, ciphertextByte, nil)
if err != nil {
return "", err
}
return string(plaintext), nil
}
AES-GCM模式同时提供数据的保密性和完整性。在解密数据时,需要验证认证标签来确认数据完整性。如果验证失败,会产生这个panic错误。
这个错误的常见原因有:
重点先确认:确认输入的Nonce与加密时使用的相同
4. 在加密和解密时生成并使用相同的随机Nonce。
5. 如果Nonce不能提前生成,则在加密时将其与密文一起返回,解密时从输入中获取正确的Nonce。
6. 无论何种情况,必须保证解密使用的Nonce与加密相同,否则会导致认证失败并panic。
在AES-GCM模式中,Nonce的大小是可配置的,并不一定相同。
gcm.NonceSize()方法会返回对应AES-GCM实例配置的Nonce大小。在创建AES-GCM实例时,可以指定Nonce的大小,例如:
go
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
// 指定Nonce大小为12字节
gcm, err := cipher.NewGCM(block, 12)
所以,不同的AES-GCM实例可以有不同的Nonce大小,gcm.NonceSize()返回对应实例配置的值。
因此,为了成功解密,客户端必须提前知晓nonce的大小,并在解密时使用相同大小的nonce。
AES-GCM使用的认证机制并不是HMAC,两者有以下主要区别:
AES-GCM通过其模式(GCM)和Nonce为每条消息生成认证值,并利用AES算法实现机密性保护。
在AES-GCM中,收发双方生成相同的Nonce和认证值可以证明双方知晓相同的Nonce。但是,这只是实现过程的一部分,Nonce的主要目的是用于防止重放攻击和区分不同消息,认证值才是真正用来验证消息完整性的凭证。
总之,AES-GCM和HMAC都是基于共享密钥的消息认证机制,但两者的具体实现方式不同。AES-GCM提供了认证与加密的全套解决方案,其安全性也高于HMAC。
就是说AES-GCM不光有认证,还有加密的功效。两者的实现原理完全不同。
在AES-GCM加密模式下,如果攻击者知道密文和Nonce,但不知道私钥,仍存在一定的安全风险。
这是因为AES-GCM模式下使用的Nonce如果在加密不同的密文时重复使用,会导致重放攻击的安全风险。
攻击者可以使用被加密的原始密文与其对应的Nonce来伪造新的有效密文。
例如,如果使用相同的Nonce加密两个不同的密文得到:
Ciphertext1 = Encrypt(Plaintext1, Nonce, Key)
Ciphertext2 = Encrypt(Plaintext2, Nonce, Key)
那么攻击者可以将Ciphertext1解密得到Plaintext1, 然后使用相同的Nonce和Key重新加密Plaintext2得到Ciphertext1’。
Ciphertext1’ 也是一个有效的密文,也可以正确解密。这样就造成了重放攻击。
为了防止这种攻击,AES-GCM模式下必须要使用不同的随机Nonce对不同的明文进行加密。
所以,如果攻击者知道某个密文和其对应的Nonce,就可以使用这个Nonce重新加密其他的明文,伪造新的密文,这是一定的安全风险。
不过,如果除Nonce外,攻击者还不知道私钥,那么他仍然无法解密阅读原始的密文,或是解密伪造出的新的有效密文。私钥的安全仍然是最重要的一环。
总结:在AES-GCM模式下,如果攻击者知道某个密文与其Nonce,由于存在重放攻击的风险,理论上可以伪造新的有效密文。
但如果私钥仍然安全,他们无法解密任何密文,安全性仍然可以得到基本保障。
文章浏览阅读1.7k次。可以看到很多联发科的MT芯片摘自:https://net.zol.com.cn/531/5312999.html彻底扒光 通过智能路由器拆解看其本质2015-07-23 00:40:00[中关村在线 原创] 作者:陈赫|责编:白宁收藏文章 分享到 评论(24)关注智能路由器拆解的朋友们注意啦!我们已经将这五款产品彻底扒开,将主板的真容展现在了大家的眼前。网友们可以看见这些智能路由器主板的做工和用料,我们还为网友们展示了主要的电子元器件,供大家品评观赏。..._路由器拆解
文章浏览阅读2.1k次,点赞101次,收藏78次。【学习背景】今天主要是来了解Java线程Thread中的run()、start()两个方法的执行有哪些区别,会给出一个简单的测试代码样例,快速理解两者的区别,再从源码层面去追溯start()底层是如何最终调用Thread#run()方法的,个人觉得这样的学习不论对面试,还是实际编程来说都是比较有帮助的。进入正文~学习目录一、代码测试二、源码分析2.1 run()方法2.2 start()方法三、使用总结一、代码测试执行Thread的run()、start()方法的测试代码如下:public_jdk的源码hotspot跟jdk是分开的
文章浏览阅读4.4k次,点赞90次,收藏85次。俄乌冲突中,各方势力通过数据擦除恶意软件破坏关键信息基础设施计算机的数据,达到深度致瘫的效果,同时窃取重要敏感信息。_俄乌网络战观察(一)
文章浏览阅读1.7w次,点赞23次,收藏139次。Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。当然也并不是说私服只能建立在局域网,也有很多公司会直接把私服部署到公网,具体还是得看公司业务的性质是否是保密的等等,因为局域网的话只能在公司用,部署到公网的话员工在家里也可以办公使用。_nexus maven
文章浏览阅读934次。我先用所有的样本数据对模型做几轮初步训练,让深度神经模型基本拟合(数万条记录的训练集,识别率到99%左右),具备初步的识别能力,这时的模型就是“直男”。相较于训练很多轮、拟合程度很高的“油腻男”,它的拟合程度较低,还是“直男愣头青”。..............._java ocr ai识别训练
文章浏览阅读688次。一、问题现象: 在数据库表中日期字段中存的日期光有年月日,没有时分秒。二、产生原因:三 解决办法 检查表的相应映射xml文件。 <property name="operateDate" type="Date">如果同上面所写,那问题出在 type类型上了正确写法 :<property name="operateDate" type="java.util..._hibernate解析時間只有年月日沒有時分秒
文章浏览阅读1k次,点赞2次,收藏2次。文章目录问题描述:解决方案:问题描述:提示:idea springbbot运行无法编译成功,找不到jar包报错E:\ideaProject\demokkkk\src\main\java\com\example\demo\config\WebSocketConfig.javaError:(3, 46) java: 程序包org.springframework.context.annotation不存在Error:(4, 46) java: 程序包org.springframework.conte_error:(3, 46) java: 程序包org.springframework.context.annotation不存在
文章浏览阅读6.4k次,点赞6次,收藏36次。1、redux中间件中间件提供第三方插件的模式,自定义拦截 action -> reducer 的过程。变为 action -> middlewares -> reducer 。这种机制可以让我们改变数据流,实现如异步 action ,action 过滤,日志输出,异常报告等功能。常见的中间件:redux-logger:提供日志输出redux-thunk:处理异步操作..._recate面试
文章浏览阅读405次。由于要在开发板中加载libjpeg,不能使用gcc编译的库文件给以使用,需要自己配置使用另外的编译器编译该库文件。/usr/bin/ld:.libs/jaricom.o:RelocationsingenericELF(EM:40)/usr/bin/ld:.libs/jaricom.o:RelocationsingenericELF(EM:40)...._jpeg_utils.lo: relocations in generic elf (em: 8) error adding symbols: file
文章浏览阅读578次,点赞10次,收藏17次。【办公类-22-06】周计划系列(1)“信息窗” (2024年调整版本)
文章浏览阅读309次。SEO全称为Search Engine Optimization,中文解释为搜索引擎优化。一般指通过对网站内部调整优化及站外优化,使网站满足搜索引擎收录排名需求,在搜索引擎中提高关键词排名,从而把精准..._百度seo resetful
文章浏览阅读438次。回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测_猎食者优化算法