rust - 基于AES-CBC-128的双重加密实现

通常加密密钥不要出现在源码中,比如配置文件中的数据库密码等。解决方案通常采用将密钥存放在环境变量中,进程启动时从环境变量获取密钥加载到内存中。

还有一种方案,对密钥进行加密,源码中只包含对密钥加密的根密钥和对密钥加密后的二次密钥,如果不知道加密方式,在编译出来的二进制文件中很难还原出真实的密钥。

安装依赖

cargo add base64
cargo add rust-crypto

AES128加解密算法

use base64::{engine::general_purpose, Engine as _};
use crypto::buffer::{BufferResult, ReadBuffer, WriteBuffer};
use crypto::{aes, blockmodes, buffer, symmetriccipher};pub fn aes128_cbc_encrypt(data: &[u8],key: &[u8],iv: &[u8],
) -> Result<Vec<u8>, symmetriccipher::SymmetricCipherError> {let mut encryptor = aes::cbc_encryptor(aes::KeySize::KeySize128,key,iv,blockmodes::PkcsPadding,);let mut final_result = Vec::<u8>::new();let mut read_buffer = buffer::RefReadBuffer::new(data);let mut buffer = [0; 4096];let mut write_buffer = buffer::RefWriteBuffer::new(&mut buffer);loop {let result =encryptor.encrypt(&mut read_buffer, &mut write_buffer, true)?;final_result.extend(write_buffer.take_read_buffer().take_remaining().iter().map(|&i| i),);match result {BufferResult::BufferUnderflow => break,BufferResult::BufferOverflow => {}}}Ok(final_result)
}pub fn aes128_cbc_decrypt(encrypted_data: &[u8],key: &[u8],iv: &[u8],
) -> Result<Vec<u8>, symmetriccipher::SymmetricCipherError> {let mut decryptor = aes::cbc_decryptor(aes::KeySize::KeySize128,key,iv,blockmodes::PkcsPadding,);let mut final_result = Vec::<u8>::new();let mut read_buffer = buffer::RefReadBuffer::new(encrypted_data);let mut buffer = [0; 4096];let mut write_buffer = buffer::RefWriteBuffer::new(&mut buffer);loop {let result =decryptor.decrypt(&mut read_buffer, &mut write_buffer, true)?;final_result.extend(write_buffer.take_read_buffer().take_remaining().iter().map(|&i| i),);match result {BufferResult::BufferUnderflow => break,BufferResult::BufferOverflow => {}}}Ok(final_result)
}

base64编码得到二次密钥

将加密后的秘钥存放在配置文件中。

pub fn aes128_base64_encrypt(key: &[u8],iv: &[u8],plain_text: &[u8],
) -> String {let output = aes128_cbc_encrypt(plain_text, &key, &iv).unwrap();general_purpose::STANDARD.encode(&output)
}

base64解码获得真实的密钥

首先从配置文件中获取二次加密的秘钥,解密获得真实的秘钥,然后再用解密后的秘钥对密文进行解密 或 对明文进行加密。

pub fn aes128_base64_decrypt(key: &[u8],iv: &[u8],cipher_text: &[u8],
) -> Result<Vec<u8>, symmetriccipher::SymmetricCipherError> {let data = general_purpose::STANDARD.decode(cipher_text).unwrap();aes128_cbc_decrypt(&data, &key, &iv)
}

单元测试

#[test]
fn test_aes128_cbc() {let key = get_random_key16();let iv = generate_iv();// 加密let plain_text = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!".to_string();let cipher_text = aes128_base64_encrypt(&key, &iv, plain_text.as_bytes());// 加密let output =aes128_base64_decrypt(&key, &iv, cipher_text.as_bytes()).unwrap();let plain_text_2 = String::from_utf8(output).unwrap();assert_eq!(plain_text, plain_text_2);
}

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

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

相关文章

android gdb 调试

gdbgdbserver远程调试技术&#xff08;一&#xff09;——调试环境搭建_gdbserver 远程调试-CSDN博客 GDB/gdbserver 7.4.1 for Android with NEON support (gnutoolchains.com) sudo apt-get install texinfo$ tar zxvf gdb-7.12.tar.gz $ cd gdb-7.12/$ mkdir build$ cd bu…

jax不识别gpu gpu: RuntimeError: Unknown backend: ‘gpu‘ requested

这里写自定义目录标题 jax 不识别gpu错误信息最终解决方案 倒腾过程jaxlib version jax 不识别gpu 以下内容在 x86 linux cudagpu 测试通过 错误信息 jax-0.4.25 jaxlib-0.4.25 不识别gpu: RuntimeError: Unknown backend: ‘gpu’ requested, but no platforms that are in…

Linux--Flappy_bird实现

目录 void handler(int sig): mian: void init_curses() int set_timer(int ms_t); 小鸟的操作&#xff1a; void show_pipe()&#xff1a; void create_list() void clear_pipe() void move_pipe(); test_bird.c完整代码&#xff1a; 代码实现&#xff1a; #includ…

STM32 CubeMX使用介绍(含FreeRTOS生成)

文章目录 前言1. 简介1.1 什么是STM32CubeMX1.2 为什么会有STM32CubeMX的出现1.3 STM32CubeMX常用功能有哪些&#xff1f;1.4 官方资料下载地址 2. 下载和安装STM32CubeMX2.1 下载软件2.2 软件安装 3. 使用方式3.1 说明3.2 不同选择器介绍3.3 构建新的项目3.1 选择单片机的型号…

前端工程化(三)邂逅Webpack和打包过程

目录 Vue项目加载Webpack 安装Webpack的默认打包创建局部的 webpack Vue项目加载 JavaScript的打包&#xff1a;  将ES6转换成ES5的语法&#xff1b;  TypeScript的处理&#xff0c;将其转换成JavaScript&#xff1b; Css的处理&#xff1a;  CSS文件模块的加载、提取&a…

android 14 创建文件java.io.IOException: Operation not permitted

android 14 创建文件java.io.IOException: Operation not permitted Operation not permitted问题原因Android文件系统有哪些 Operation not permitted 问题原因 一般是创建文件时&#xff0c;文件夹或文件名称包含特殊字符&#xff0c;创建文件或文件夹时需要检查文件名称是…

题目:出列(蓝桥OJ 3223)

问题描述&#xff1a; 解题思路&#xff1a; 先使用暴力找到规律再解。 暴力做法&#xff1a;将数据放到一个动态数组中&#xff0c;下标就表示当前编号&#xff0c;符合题意的就放到覆盖该数组中&#xff0c;依次循环&#xff0c;直到只有一个元素停。 规律&#xff1a;小于该…

爬虫(七)

1.批量爬取知网数据 lxml:是 Python 的一个功能强大且易用的 XML 和 HTML 处理库。它提供了简单又轻巧的 API,使得解析、构建和操作 XML 和 HTML 文档变得非常方便。lxml 库通常用于处理 XML 和 HTML 文档,例如解析网页、处理配置文件等。openpyxl:是 Python 中用于操作 Ex…

并发容器之ConcurrentLinkedQueue

ConcurrentLinkedQueue ConcurrentLinkedQueue是一种适用于高并发场景下的队列&#xff0c;通过无锁的方式&#xff0c;实现了高并发状态下的高性能&#xff0c;由于ConcurrentLinkedQueue是一种非阻塞的队列&#xff0c;通常ConcurrentLinkedQueue性能好于BlockingQueue。是一…

uniapp自定义导航栏左中右内容和图标,以及点击事件

uniapp自定义导航栏左中右内容和图标&#xff0c;以及点击事件 效果&#xff1a; 页面&#xff1a; <view class"navigation-bar"><view class"navigation-bar-left" click"navigateBack"><u-icon name"arrow-left"…

【嵌入式开发 Linux 常用命令系列 4.3 -- git add 时单独排除某个目录或者文件】

文章目录 git add 时单独排除某个目录或者文件使用 .gitignore 文件使用命令行排除文件或目录 git add 时单独排除某个目录或者文件 在使用 git add 命令时&#xff0c;如果你想要排除特定的目录或文件&#xff0c;可以使用 .gitignore 文件或使用路径规范来指定不想添加的文件…

ES数据同步:定时重启Logstash,并清除相关数据。

文章目录 引言I crontab 周期自动执行相应命令1.1 crontab语法1.2 crontab 文件示例1.3 系统范围内的 crontab 文件II 定期重启Logstash2.1 同步当天日期的数据2.2 同步指定日期的数据III logstash3.1 conf 参考3.2 statement_filepath3.3 执行IV 预备知识

新的变速箱滚动轴承和齿轮故障数据

变速箱是传动系统中非常关键的一部分&#xff0c;它由齿轮、传动轴、轴承和壳体等组成。变速箱的主要功用包括&#xff1a;&#xff08;1&#xff09;能够改变传动比&#xff0c;按实际情况调整驱动轮转矩和转速&#xff0c;进而满足复杂的行车要求&#xff1b;&#xff08;2&a…

机器学习金融应用技术指南

1 范围 本文件提供了金融业开展机器学习应用涉及的体系框架、计算资源、数据资源、机器学习引擎、机 器学习服务、安全管理、内控管理等方面的建议。 本文件适用于开展机器学习金融应用的金融机构、技术服务商、第三方安全评估机构等。 2 规范性引用文件 下列文件中的内容通过…

新型储能是什么,储能系统解决方案现状及趋势详细说明

新型储能是指新兴的能够存储电能并在需要时释放的储能技术。其中主要包括光伏储能和商业储能。 光伏储能是指通过光伏电池将太阳能转化为电能&#xff0c;并将其存储起来以供后续使用。光伏储能系统一般由太阳能电池板、储能装置和逆变器组成。光伏储能可以将白天产生的电能存…

2024年华为OD机试真题-任务处理-Python-OD统一考试(C卷)

题目描述&#xff1a; 在某个项目中有多个任务&#xff08;用 tasks 数组表示&#xff09;需要您进行处理&#xff0c;其中 tasks[i] [si, ei]&#xff0c;你可以在 si < day < ei 中的任意一天处理该任务。请返回你可以处理的最大任务数。 注&#xff1a;一天可以完成一…

关于linux中mysql8.0修改lower_case_table_names

为什么要修改 在linux中安装mysql时&#xff0c;默认的lower_case_table_names0&#xff0c;即对大小写不敏感在windwos中的mysql&#xff0c;默认的lower_case_table_names1在做程序迁移时&#xff0c;导致linux中部署的服务器无法访问打mysql中的表 修改中的问题 mysql8.0…

代码随想录算法训练营 Day27 回溯算法3

39. 组合总和 思路 根据题意画二叉树 这道题与之前的组合总和的区别在于&#xff0c;数组中的数字可以多次使用&#xff0c;因此每次递归时的startIndex依旧是从当前的i开始 尝试写代码&#xff1a; class Solution:def __init__(self):self.path []self.result []def co…

Java练习题目3:输入一个学生的5门课成绩及对应的学分,计算该同学的加权平均分(WeightedAverageScore3)

每日小语 我们没有意识到惯用语言的结构有多大的力量。可以说&#xff0c;它通过语义反应机制奴役我们。 ——阿尔弗雷德科日布斯基 思考 输入5门课成绩&#xff0c;学分&#xff0c;加权平均分公式 [&#xff08;课程A成绩*课程A学分&#xff09;&#xff08;课程成绩B*课程…

Mybatis-Plus实现乐观锁

1 悲观锁和乐观锁场景和介绍 乐观锁和悲观锁是在并发编程中用于处理并发访问和资源竞争的两种不同的锁机制!! 1.1 悲观锁&#xff1a; 悲观锁的基本思想是&#xff0c;在整个数据访问过程中&#xff0c;将共享资源锁定&#xff0c;以确保其他线程或进程不能同时访问和修改该…