【Go实战】:使用AES和RSA加密算法保护关键信息

前言

作为一名开发者,我们在构建安全可靠的应用时,确保接口请求中的关键信息不被泄露是非常重要的。加密与解密技术是实现这一目标的关键手段。本文将详细介绍如何在Golang中使用AES(高级加密标准)和RSA加密算法来实现数据的加密与解密,帮助你在接口请求中隐藏关键信息,提升系统的安全性。通过本文,你将了解这两种算法的基本原理、适用场景及注意事项,并通过具体的代码示例掌握其实现方法。无论你是初学者还是有一定经验的开发者,本文都能为你提供有价值的参考。

1. AES加密算法

AES是一种对称加密算法,意味着加密和解密过程使用相同的密钥。它支持128、192和256位三种密钥长度,其中256位密钥提供了最高的安全性。AES以其高效性和强大的安全性,成为保护敏感数据的首选。

1.1 代码示例(Go语言):

package mainimport ("bytes""crypto/aes""crypto/cipher""encoding/base64""fmt""log"
)// PKCS7Padding 填充
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {padding := blockSize - len(ciphertext)%blockSizepadtext := bytes.Repeat([]byte{byte(padding)}, padding)return append(ciphertext, padtext...)
}// PKCS7UnPadding 去除填充
func PKCS7UnPadding(origData []byte) []byte {length := len(origData)unpadding := int(origData[length-1])return origData[:(length - unpadding)]
}// AESEncrypt AES 加密
func AESEncrypt(plaintext, key []byte) ([]byte, error) {block, err := aes.NewCipher(key)if err != nil {return nil, err}// 填充plaintext = PKCS7Padding(plaintext, block.BlockSize())// 创建 CBC 模式的加密器ciphertext := make([]byte, len(plaintext))mode := cipher.NewCBCEncrypter(block, key[:block.BlockSize()])mode.CryptBlocks(ciphertext, plaintext)return ciphertext, nil
}// AESDecrypt AES 解密
func AESDecrypt(ciphertext, key []byte) ([]byte, error) {block, err := aes.NewCipher(key)if err != nil {return nil, err}// 创建 CBC 模式的解密器plaintext := make([]byte, len(ciphertext))mode := cipher.NewCBCDecrypter(block, key[:block.BlockSize()])mode.CryptBlocks(plaintext, ciphertext)// 去除填充plaintext = PKCS7UnPadding(plaintext)return plaintext, nil
}func main() {key := []byte("abcdefghijklmnop") // 密钥长度必须是 16, 24, 或 32 字节plaintext := []byte("Hello, AES!")// 加密encrypted, err := AESEncrypt(plaintext, key)if err != nil {log.Fatalf("加密失败: %v", err)}fmt.Printf("加密后: %s\n", base64.StdEncoding.EncodeToString(encrypted))// 解密decrypted, err := AESDecrypt(encrypted, key)if err != nil {log.Fatalf("解密失败: %v", err)}fmt.Printf("解密后: %s\n", decrypted)
}

1.2 运行结果:

加密后: KRw1wPLUXqEjxoSsywa8IA==
解密后: Hello, AES!

2. RSA加密算法

RSA是一种非对称加密算法,使用公钥和私钥对进行加密和解密。公钥用于加密数据,私钥用于解密数据。RSA以其强大的安全性、密钥交换能力和数字签名功能,成为信息安全领域的重要组成部分。

2.1 代码示例(Go语言):

package mainimport ("crypto/rand""crypto/rsa""crypto/sha256""crypto/x509""encoding/pem""fmt""log"
)// 生成 RSA 密钥对
func generateRSAKeyPair(bits int) (*rsa.PrivateKey, *rsa.PublicKey, error) {privateKey, err := rsa.GenerateKey(rand.Reader, bits)if err != nil {return nil, nil, err}publicKey := &privateKey.PublicKeyreturn privateKey, publicKey, nil
}// 使用公钥加密数据
func encryptWithPublicKey(data []byte, publicKey *rsa.PublicKey) ([]byte, error) {return rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, data, nil)
}// 使用私钥解密数据
func decryptWithPrivateKey(ciphertext []byte, privateKey *rsa.PrivateKey) ([]byte, error) {return rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, ciphertext, nil)
}// 将私钥转换为 PEM 格式
func privateKEYToPEM(privateKey *rsa.PrivateKey) ([]byte, error) {privateDER := x509.MarshalPKCS1PrivateKey(privateKey)privateBlock := &pem.Block{Type:  "RSA PRIVATE KEY",Bytes: privateDER,}return pem.EncodeToMemory(privateBlock), nil
}// 将公钥转换为 PEM 格式
func publicKEYToPEM(publicKey *rsa.PublicKey) ([]byte, error) {publicDER, err := x509.MarshalPKIXPublicKey(publicKey)if err != nil {return nil, err}publicBlock := &pem.Block{Type:  "RSA PUBLIC KEY",Bytes: publicDER,}return pem.EncodeToMemory(publicBlock), nil
}func main() {// 生成 RSA 密钥对privateKey, publicKey, err := generateRSAKeyPair(2048)if err != nil {log.Fatalf("生成 RSA 密钥对失败: %v", err)}// 将私钥和公钥转换为 PEM 格式privateKeyPEM, err := privateKEYToPEM(privateKey)if err != nil {log.Fatalf("将私钥转换为 PEM 格式失败: %v", err)}publicKeyPEM, err := publicKEYToPEM(publicKey)if err != nil {log.Fatalf("将公钥转换为 PEM 格式失败: %v", err)}fmt.Println("私钥 (PEM):")fmt.Println(string(privateKeyPEM))fmt.Println("公钥 (PEM):")fmt.Println(string(publicKeyPEM))// 要加密的数据data := []byte("Hello, RSA!")// 使用公钥加密数据encryptedData, err := encryptWithPublicKey(data, publicKey)if err != nil {log.Fatalf("加密数据失败: %v", err)}fmt.Println("\n加密后的数据:")fmt.Printf("%x\n", encryptedData)// 使用私钥解密数据decryptedData, err := decryptWithPrivateKey(encryptedData, privateKey)if err != nil {log.Fatalf("解密数据失败: %v", err)}fmt.Println("\n解密后的数据:")fmt.Println(string(decryptedData))
}

2.2 运行结果:

私钥 (PEM):
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAtU6Bgi8Rskjt36socqPDPdohqWYmnXGXZfApY8R6U93C4475
MetH1JGI1MsCCcBNO/3fUOe6PGfMmZziMNxWcxYErM3XOPtfBA4QWukUO+t/JSB9
d4Z7YS8hQVGF9zs9ztR4h38dmb2CEtl6XV6+YWO/WJSfesqA0V1BuPTKuYGFC8ps
7QAGd+UnJ+zfkgSQl06u7fTLiRZP84jQTSRUIPscRq1wbbOFDcwNoPXWCW8ybdz0
5+qoh1clD1Yp/+Lz/PI1WT4y846ZJ3YGAsfWC7LfPEIZrRBAnf58Hmzm7bT4ube2
4teWPWlQtJrVY977sPvFNxT+v1IPX3LqYc+11wIDAQABAoIBAFc14A3i3jxH4EQK
bHZYV33VAwQc4s4w6YZbM02OINlefnQ/PZbJec/CAXN6Awz1tzD4OQcNsAOGWmA5
moOuONc67BzDFpeOMnIc4bkZDGaWLJ6LNk7cHVTt+q0Urb/yexSWFzP17SMaiQrQ
GY/4FtN5y3ysYNoLtlL+7LIu7aS03JKr0kFecdGE2fd459coBCZOpKTAN+UIlFjo
n/s+Z84GaOu35ApeQIeO+/qsBRfJmSw6OgdjgNkU7dveV712w1dgt0cUxeF+OBct
QNfhmmQY7OERt6nLrXg8wRoPjjt8Pe9h6H9RmeENo7EbueYXKiaZq5vgbGae0Fj6
Ay/xCgECgYEAx7EEohUzIQObsFLWs+Gx9jGPmfP5YCoB/kiQDuFHhRUt5MWzAxnF
T4f0abTV3fKPvqkwjA77mTJ61eLmihnBHXk0EJKMncLzkFXi+0C5L6CLGqCnshdJ
ToEcdcXPg9exDaFgMgOgFZRki49Y+YIpEEhJWa4I2/fTme89fYg0HcECgYEA6G5b
VmGOTswqL+LvAGNfBG+p4QIg3gbiN/56Y4N1W4hKrOnLfaYHhb3Y6TIPqhlJiNXD
ttOPyOc3JA/ZZJ5jk88rEhmXIjali8/f1QWJlJqea9Co2owJm3LIass1y7jdrJFo
cZl1V0FNwPcix9MmRuZX52nlUPIV9/1tKj5eaZcCgYA0XaVbY7fOtoWDTZXkAhGL
ACAqPSJuJ1XyetDcNhNtQMqSLY3uCDoHyx07AyL6Wvt7Ah8q+1rbJ7OylxfhqzNL
KVeP6P5a+J6qgPtO7AAkDzOrPen798NPhOgTslXiuxNBAcqaEv1N62YaevLYK1vd
Wzdw/wRvuqOQwH4dhzQzgQKBgBBilzXDstCDPAYcLVUNrEkXxhYCnGaKfbAM1Hvn
bIKDXSBLavj0l1sqQvxNdyU6myB2UVG2IFC9W/nC1ERvlf15gUPJYgobaBgvE0xl
E4nSTJC1KPIfJR48PTyqDqTJ53ae2YoIk2kPRXfw9Ba6H9ynqFK7+Fp4dmwBBY0Q
0H8JAoGBALU3itfD5YsCBtQupQ94uNmCIymMjkvlSeoC7V+z3lvXGiQRISdq7A77
YVZVHM1b36bnK+7R9A/Ev1gBc3AvB4q9pXAHmCxlwtmOUjZvXuTK6Rem/gurJmkm
MIMzsl0ElCCySsMxXslyGAyZTEgpYHueakrw+aTYayxoDtYm7Yz3
-----END RSA PRIVATE KEY-----公钥 (PEM):
-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtU6Bgi8Rskjt36socqPD
PdohqWYmnXGXZfApY8R6U93C4475MetH1JGI1MsCCcBNO/3fUOe6PGfMmZziMNxW
cxYErM3XOPtfBA4QWukUO+t/JSB9d4Z7YS8hQVGF9zs9ztR4h38dmb2CEtl6XV6+
YWO/WJSfesqA0V1BuPTKuYGFC8ps7QAGd+UnJ+zfkgSQl06u7fTLiRZP84jQTSRU
IPscRq1wbbOFDcwNoPXWCW8ybdz05+qoh1clD1Yp/+Lz/PI1WT4y846ZJ3YGAsfW
C7LfPEIZrRBAnf58Hmzm7bT4ube24teWPWlQtJrVY977sPvFNxT+v1IPX3LqYc+1
1wIDAQAB
-----END RSA PUBLIC KEY-----加密后的数据:
472886c86bf863a2dedf90dbed919c18fb0c43d8df05a696bcd9a6503372cda6adaac80dc0e1d9538f38b1b59ead2e15a0ffb08df840cda6b50c95d48d73d144a0283f20c649651f5a216ad91cfa4df63c294b9fedcd1b60ab020862ef420a83004c436400bffeece8320b678009236dea02bf8e45e700dbc903239e60242fffddee1b55f628a0b0bcdb0e87939d4117cd1eb4691bb0ba9e6b2e0deba31f4d6db023b8e75925c078de021ce13397e5888e887c54ebb839a4606a125869c6da6b04232c83ee625c8aa545005c1cd617c75fa9706694b0b058593bf5f565bb8cb4996691886d7941316b761935876700323aa8d8aa3d123fe0f9a4cc0296d3870b解密后的数据:
Hello, RSA!

3. AES与RSA对比

为了更直观地比较AES和RSA两种加密算法,以下是一个详细的对比表格,涵盖了基本属性、密钥管理、加密效率、安全性、适用场景、密钥长度和加密模式等方面。

特性/算法AES  RSA
基本属性对称加密算法非对称加密算法
密钥管理加密和解密使用相同密钥公钥加密,私钥解密
加密效率高,适合处理大量数据较低,适合加密小量数据或对称密钥
安全性支持多种密钥长度,安全性高基于大数分解难题,安全性高
适用场景文件加密、数据库加密、网络通信密钥交换、数字签名、电子邮件加密
密钥长度128、192、256位至少2048位
加密模式ECB、CBC、CFB、OFB、GCM等通常使用PKCS#1标准,支持OAEP等填充模式

注意事项

密钥的安全管理:无论是AES还是RSA,密钥的安全管理都是至关重要的。确保密钥的存储和传输过程是安全的,避免硬编码在源代码中。
填充方式:在使用对称加密算法时,选择合适的填充方式(如PKCS7)可以增强安全性。
哈希函数:在使用非对称加密算法时,选择合适的哈希函数(如SHA-256)可以增强安全性。
密钥长度:对于RSA,建议使用至少2048位的密钥长度,以确保足够的安全性。

总结

作为一名开发者,确保接口请求中的关键信息不被泄露是构建安全可靠应用的重要一环。通过使用AES和RSA加密算法,你可以在接口请求中有效地隐藏关键信息,提升系统的安全性。AES以其高效性和安全性,特别适合处理大量数据,如文件加密、数据库加密和网络通信。而RSA则以其非对称加密的特点,在密钥交换、数字签名和安全通信等场景中展现出独特的优势。通过本文提供的代码示例和详细的对比表格,希望你能更好地掌握这两种加密算法,从而在实际项目中应用得更加得心应手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络学习第四篇

引言: 我们在第三篇的时候出现了错误,我们要就行排错,那么我们要知道一下怎么配置静态路由实现ping通,这样子我们才知道下一跳到底是什么,为什么这样子做。 实验目的 理解和掌握静态路由的基本概念和配置方法。 实…

[控制理论]—位置式PID与增量式PID

位置式PID与增量式PID 1.位置式PID 按模拟PID控制算法,以一系列的采样时刻点kT代表连续时间t,以矩形法数值积分近似代替积分,以一阶后向差分近似代替微分,即: t ≈ k T ( k 0 , 1 , 2... ) …

【c++丨STL】list的使用

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失 Addressable Play Mode Script加载模式 选择 Use Existiing Build 1.Unity 切换到 PC 平台,执行 Addressable Build 运行,加载 bundle 内的预制体 显示正常 2.Unit…

单片机学习笔记 6. 数码管动态显示

更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示 目录 0、实现的功能 1、Keil工程 1-1 数码管动态显示 1-2 数组的定义与引用…

车企如何实现安全图纸外发管理

车企面临着日益增长的数据交换需求,尤其是设计图纸等敏感数据的外发管理。如何确保这些数据在传输过程中的安全性和效率,是车企急需解决的问题。我们将从几个关键性的因素上来分析一下怎么实现安全图纸外发管理。 统一管理与授权 采用专业的文件交换系统…

第7章 硬件测试-7.1 硬件调试

第7章 硬件测试 7.1 硬件调试7.1.1 电路检查7.1.2 电源调试7.1.3 时钟调试7.1.4 主芯片及外围小系统调试7.1.5 存储器件和串口外设调试7.1.6 其他功能模块调试 测试是每项成功产品的必经环节。硬件测试是评估产品质量的重要方法,产品质量是公司的信誉和品牌象征&…

Qt5/QPainter/画家

目录 1.绘制文字 1.1案例 1.2代码 2.画线 2.1案例 2.2代码 3.绘制矩形 3.1代码 4.绘制椭圆和圆 4.1椭圆 4.2圆 5.圆弧 5.1案例: 5.2代码 6.扇形 6.1案例 6.2代码: 7.更改绘画的颜色和粗细 7.1案例 ​编辑 7.2代码 1.绘制文字 1.1案例 通过三种不同的绘…

一篇保姆式centos/unbantu安装docker

前言: 本章节分别演示centos虚拟机,unbantu虚拟机进行安装docker。 上一篇介绍:docker一键部署springboot项目 一:centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest do…

fetch API和XHR

文章目录 一、基本写法1. XMLHttpRequest(XHR)2. Fetch API 二、兼容性1. XMLHttpRequest(XHR)2. Fetch API 三、Promise支持1. XMLHttpRequest(XHR)2. Fetch API 四、请求响应1. XMLHttpRequest&#xff0…

Photoshop(PS)——人像磨皮

1.新建一个文件,背景为白色,将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来,选择第一个拷贝图层,选择滤镜---杂色---蒙尘与划痕 3.调整一下数值,大概能够模糊痘印痘坑,点击确定。 4.然后选择拷贝2图层…

Elasticsearch retrievers 通常与 Elasticsearch 8.16.0 一起正式发布!

作者:来自 Elastic Panagiotis Bailis Elasticsearch 检索器经过了重大改进,现在可供所有人使用。了解其架构和用例。 在这篇博文中,我们将再次深入探讨检索器(retrievers)。我们已经在之前的博文中讨论过它们&#xf…

《设计模式》创建型模式总结

目录 创建型模式概述 Factory Method: 唯一的类创建型模式 Abstract Factory Builder模式 Prototype模式 Singleton模式 最近在参与一个量化交易系统的项目,里面涉及到用java来重构部分vnpy的开源框架,因为是框架的搭建,所以会涉及到像…

c++类对象练习

#include <iostream> #include <cstring>using namespace std;class mystring {char* buf; public:mystring(); //构造函数mystring(const char* str); //构造函数void show(); //输出函数void setmystr(const mystring str); //设置函数const char* getmystr() co…

CH03_反射

第3章&#xff1a;反射 本章目标 掌握反射的原理 熟悉反射的基本运用 本章内容 反射是什么 C# 编译运行过程 首先我们在VS点击编译的时候&#xff0c;就会将C#源代码编译成程序集 程序集以可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式实现 程序集中包含有Microsoft …

多品牌摄像机视频平台EasyCVR视频融合平台+应急布控球:打造城市安全监控新体系

在当今快速发展的智慧城市和数字化转型浪潮中&#xff0c;视频监控技术已成为提升公共安全、优化城市管理、增强应急响应能力的重要工具。EasyCVR视频监控平台以其强大的多协议接入能力和多样化的视频流格式分发功能&#xff0c;为用户提供了一个全面、灵活、高效的视频监控解决…

数据结构 (3)线性表的概念及其抽象数据类型定义

一、线性表的概念 定义&#xff1a;线性表是指具有相同数据类型的n个数据元素的有限序列。可以表示为L(a1,a2,…,ai,…,an)&#xff0c;其中a1是第一个元素&#xff0c;称为表头&#xff1b;an是最后一个元素&#xff0c;称为表尾。 特点&#xff1a; 有序性&#xff1a;线性表…

Java基础——继承和多态

目录 一、继承 继承的定义&#xff1a; 继承的基本用法&#xff1a; 如何调用父类的方法&#xff1f; 二、多态 多态性的好处 多态中的强制类型转换&#xff1a; 包的命名规则——域名倒叙 一、继承 继承的定义&#xff1a; 继承是面向对象编程中的一种机制&#xff0c…

播放器开发之ffmpeg 硬件解码方案

硬件编解码的概念 硬件编解码是⾮CPU通过烧写运⾏视频加速功能对⾼清视频流进⾏编解码&#xff0c;其中⾮CPU可包括GPU、FPGA或者 ASIC等独⽴硬件模块&#xff0c;把CPU⾼使⽤率的视频解码⼯作从CPU⾥分离出来&#xff0c;降低CPU的使⽤负荷&#xff0c;使得平台能 ⾼效且流畅…

计算机毕业设计SparkStreaming+Kafka旅游推荐系统 旅游景点客流量预测 旅游可视化 旅游大数据 Hive数据仓库 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…