使用 OpenSSL 和 Python 实现 AES-256-CBC 加密与解密(安全密钥管理)

环境

  • OpenSSL
  • Python

使用 OpenSSL 加密

1. 生成 AES 密钥和 IV

强烈推荐使用方法一(Python secrets 模块),因为它更安全。

方法一: Python 的 secrets 模块(安全方式)
  • 不要使用 OpenSSL 的 rand 命令直接生成密钥和 IV 用于生产环境。 尽管 openssl rand 可以生成随机数,但它可能不符合密码学安全的要求。

  • 推荐方法: 使用更安全的随机数生成器,例如 Python 的 secrets 模块:

    import secrets
    import binascii# 生成 256 位 AES 密钥(32 字节)
    key = secrets.token_bytes(32)
    key_hex = binascii.hexlify(key).decode()  # 转换为十六进制字符串# 生成 128 位 IV(16 字节)
    iv = secrets.token_bytes(16)
    iv_hex = binascii.hexlify(iv).decode()  # 转换为十六进制字符串print("AES Key (Hex):", key_hex)
    print("IV (Hex):", iv_hex)
    
  • secrets.token_bytes(nbytes) 生成 nbytes 个密码学安全的随机字节。

  • binascii.hexlify(data) 将字节数据转换为十六进制字符串。

  • 保存: 将生成的密钥和 IV 安全地保存起来(例如,使用密码管理器)。

方法二: 直接使用 OpenSSL 的 rand 命令(不推荐)
openssl rand -hex 32  # 生成 256 位 AES 密钥(32 字节)
openssl rand -hex 16  # 生成 128 位 IV(16 字节)
  • openssl rand -hex <长度> 使用 OpenSSL 的随机数生成器生成指定长度的十六进制字符串。
  • 保存密钥和 IV: 将生成的密钥和 IV 安全地保存起来(例如,存储在密码管理器中)。

2. 加密

openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -in plaintext.txt -out ciphertext.bin -K $(cat key.txt) -iv $(cat iv.txt)
  • -pbkdf2 使用 PBKDF2 密钥派生函数。
  • -iter 100000 设置迭代次数为 100000(建议至少 10000,可以根据需要调整)。
  • -K $(cat key.txt) 从文件 key.txt 中读取 AES 密钥(假设你已将密钥保存在 key.txt 文件中)。
  • -iv $(cat iv.txt) 从文件 iv.txt 中读取 IV(假设你已将 IV 保存在 iv.txt 文件中)。
  • 去掉了-salt: 当使用-pbkdf2的时候,不再需要-salt
  • 为什么要从文件中读取密钥和 IV?
    • 安全: 避免将密钥和 IV 直接写在命令行中,防止泄露(例如,通过命令行历史记录)。
    • 方便: 方便管理和重复使用密钥和 IV。

3. Base64 编码

将密文转换为文本格式(用于生成条形码),需要进行 Base64 编码:

openssl base64 -in ciphertext.bin -out ciphertext.txt

4. 生成条形码

  • 使用在线条形码生成器(如 https://barcode.tec-it.com/en)将 Base64 编码后的密文生成条形码图片。
  • 选择条形码类型(如 Code 128),将 Base64 编码后的密文粘贴到输入框中,生成条形码图片。

安全传输密钥和密文

1. 安全传输密钥:

  • 重要: 密钥和 IV 的安全至关重要!绝对不要通过不安全的渠道(如微信、邮件 💀)直接发送。
  • 安全方案:
    • 线下告知: 如果条件允许,线下口头告知或使用纸条传递。
    • 加密通信工具: 使用 Signal、Wire 等端到端加密的通信工具。
    • 密钥交换协议: 如果对密码学有一定了解,可以使用 Diffie-Hellman 等密钥交换协议。
    • 密钥文件: 可以将密钥和IV存放在一个文件中, 使用 GPG 加密后发送.

2. 发送条形码:

  • 将生成的条形码图片通过微信等方式发送给你的朋友。这步可以用微信了。😇

解密方式

1. 解密

openssl enc -d -aes-256-cbc -in ciphertext.bin -out plaintext.txt -K $(cat key.txt) -iv $(cat iv.txt) -pbkdf2 -iter 100000
  • 注意:
    • 解密命令与加密命令 基本相同,只是将 -enc 改为 -d(表示解密)。
    • -pbkdf2-iter 参数必须与加密时 完全一致
    • -K-iv 参数仍然从文件中读取密钥和 IV。

2. Base64 解码

openssl base64 -d -in ciphertext.txt -out ciphertext.bin

完整的流程总结

  1. 生成强密钥和 IV:

    • 使用 Python 的 secrets 模块。
    • 将密钥和 IV 保存到安全的文件中(例如,key.txtiv.txt), 或者密码管理器中。
  2. 加密:

    openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -in plaintext.txt -out ciphertext.bin -K $(cat key.txt) -iv $(cat iv.txt)
    
    openssl base64 -in ciphertext.bin -out ciphertext.txt
    
  3. 解密:

    openssl enc -d -aes-256-cbc -in ciphertext.bin -out plaintext.txt -K $(cat key.txt) -iv $(cat iv.txt) -pbkdf2 -iter 100000
    
    openssl base64 -d -in ciphertext.txt -out ciphertext.bin
    

注意安全, HAVE FUN! 👀

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

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

相关文章

学习 MySQL 需要知道的 28 个小技巧

前言 随着信息技术的不断发展以及互联网行业的高速增长&#xff0c;作为开源数据库的MySQL得到了广泛的应用和发展。目前MySQL已成为关系型数据库领域中非常重要的一员。 无论是运维、开发、测试&#xff0c;还是架构师&#xff0c;数据库技术都是一个 必备加薪神器&#xff…

【Hive】Hive安装

Hive 第一章 Hive的基础知识 第二章 Hive安装 第三章 DDL&#xff08;Data Definition Language&#xff09;数据定义 第四章 DML&#xff08;Data Manipulation Language&#xff09;数据操作 第五章 Hive查询 第六章 Hive的基础知识 第七章 Hive函数 第八章 分区表和分桶表 …

6.聊天室环境安装 - Ubuntu22.04 - elasticsearch(es)的安装和使用

目录 介绍安装安装kibana安装ES客户端使用 介绍 Elasticsearch&#xff0c; 简称 ES&#xff0c;它是个开源分布式搜索引擎&#xff0c;它的特点有&#xff1a;分布式&#xff0c;零配置&#xff0c;自动发现&#xff0c;索引自动分片&#xff0c;索引副本机制&#xff0c;res…

蓝桥每日打卡--合根植物

#蓝桥#JAVA#合根植物 题目描述 w星球的一个种植园&#xff0c;被分成mn个小格子&#xff08;东西方向m行&#xff0c;南北方向n列&#xff09;。每个格子里种了一株合根植物。 这种植物有个特点&#xff0c;它的根可能会沿着南北或东西方向伸展&#xff0c;从而与另一个格子…

线性代数之矩阵特征值与特征向量的数值求解方法

文章目录 前言1. 幂迭代法&#xff08;Power Iteration&#xff09;幂法与反幂法求解矩阵特征值幂法求最大特征值编程实现补充说明 2. 逆幂迭代法&#xff08;Inverse Iteration&#xff09;移位反幂法 3. QR 算法&#xff08;QR Algorithm&#xff09;——稠密矩阵理论推导编程…

【Linux实践系列】:用c语言实现一个shell外壳程序

&#x1f525;本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;博主主页&#xff1a;努力努力再努力wz 那么今天我们就要进入Linux的实践环节&#xff0c;那么我们之前学习了进程控制相关的几个知识点&#xff0c;比如进程的终止以及进程的等待和进程的替换&#xff0c;…

使用STM32CubeMX配置定时器中断实现LED每秒闪烁一次(STM32G070CBT6)

说明&#xff1a; 本案例采用的定时器3&#xff08;TIM3&#xff09;实现&#xff0c;使用其他定时器是一样配置。 如何新建一个工程以及如何配置LED的端口&#xff0c;请查看前面文章&#xff1a;使用STM32CubeMX实现LED灯每秒闪烁一次&#xff08;STM32G070CBT6单片机&…

2025年Draw.io最新版本下载安装教程,附详细图文

2025年Draw.io最新版本下载安装教程&#xff0c;附详细图文 大家好&#xff0c;今天给大家介绍一款非常实用的流程图绘制软件——Draw.io。不管你是平时需要设计流程图、绘制思维导图&#xff0c;还是制作架构图&#xff0c;甚至是简单的草图&#xff0c;它都能帮你轻松搞定。…

GStreamer —— 2.15、Windows下Qt加载GStreamer库后运行 - “播放教程 1:Playbin 使用“(附:完整源码)

运行效果 介绍 我们已经使用了这个元素&#xff0c;它能够构建一个完整的播放管道&#xff0c;而无需做太多工作。 本教程介绍如何进一步自定义&#xff0c;以防其默认值不适合我们的特定需求。将学习&#xff1a; • 如何确定文件包含多少个流&#xff0c;以及如何切换 其中。…

Python----数据可视化(Seaborn一:介绍,应用)

一、Seaborn的介绍 Seaborn 是一个基于 matplotlib 的 Python 库&#xff0c;对其进行了高级 API 的封装&#xff0c;使得作图更为方便和吸引人。尽管在大多数情况下&#xff0c;使用 Seaborn 就能够创建出美观的图表&#xff0c;但 matplotlib 提供了更高的灵活性和定制化的能…

小程序SSL证书过期怎么办?

SSL证书就像小程序的“安全锁”&#xff0c;一旦过期&#xff0c;用户访问时会被提示“不安全”&#xff0c;轻则流失客户&#xff0c;重则数据泄露&#xff01;作为企业负责人&#xff0c;如何快速解决证书过期问题&#xff1f;又该如何避免再次踩坑&#xff1f;这篇指南给你答…

Linux上位机开发实战(x86和arm自由切换)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;qt本身支持windows系统&#xff0c;也支持linux系统。不仅如此&#xff0c;qt除了支持传统的x86 cpu之外&#xff0c;还支…

Mysql的卸载安装配置以及简单使用

MySQL其它问题已经更新在&#xff1a;MySQL完善配置---可视化-CSDN博客 一、卸载 ①控制面板卸载 ②C盘隐藏项目>ProgramData>mysql相关文件夹&#xff0c;还有Program file下的MySQL文件夹 ③开始菜单栏搜索>服务&#xff0c;找到MySQL相关服务删除&#xff0c;如果再…

RabbitMQ之旅(1)

相信自己,终会成功 目录 主流MQ产品 1.kafaka 2.RocketMQ 3.RabbitMQ 在xshell上安装RabbitMQ RabbitMQ七种工作模式 1.简单模式 ​编辑 2.工作队列模式 3.发布/订阅模式 4.路由模式 5.通配符模式 6.RPC模式 AMQP.BasicProperties 设置消息属性的类 7.发布确认模…

基于Matlab的人脸识别的二维PCA

一、基本原理 传统 PCA 在处理图像数据时&#xff0c;需将二维图像矩阵拉伸为一维向量&#xff0c;这使得数据维度剧增&#xff0c;引发高计算成本与存储压力。与之不同&#xff0c;2DPCA 直接基于二维图像矩阵展开运算。 它着眼于图像矩阵的列向量&#xff0c;构建协方差矩阵…

el-pagination的使用说明

<el-paginationv-model:current-page"pageNo" //当前第几页v-model:page-size"pageSize" //每页显示多少条数据:page-sizes"[10, 20, 30]" //控制每页显示的条数:small"true" //控制分页器大小:disabled&quo…

Redis Redis介绍、安装 - Redis客户端

目录 redis是什么&#xff0c;他的应用场景是什么&#xff1f; Redis的一些主要特点和应用场景&#xff1a; redis的官方网站&#xff1a;Redis redis是键值型数据库&#xff1a;&#xff08;也就是key-value模式&#xff09;&#xff08;跟python的字典很像&#xff09; …

LWIP网络模型及接口简介(DAY 01)

目录 1.网络协议分层模型 2. LWIP三种编程接口 1.网络协议分层模型 其中各层级的封装与拆封过程 2. LWIP三种编程接口 LwIP 提供了三种编程接口&#xff0c;分别为 RAW/Callback API、NETCONN API、SOCKET API。它们的易用性从左到右依次提高&#xff0c;而执行效率从左到右依…

【Python 数据结构 14.邻接表】

希望你的眼睛可以一直笑&#xff0c;想要的都得到 —— 25.3.11 一、邻接表的概念 1.邻接表的定义 邻接表是一种表示图的数据结构。邻接表的主要概念是&#xff1a;对于图中的每个顶点&#xff0c;维护一个由与其相邻的顶点组成的列表。这个列表可以用数组、链表或其他数据结构…

01 音视频知识学习(视频)

图像基础概念 ◼像素&#xff1a;像素是一个图片的基本单位&#xff0c;pix是英语单词picture的简写&#xff0c;加上英 语单词“元素element”&#xff0c;就得到了“pixel”&#xff0c;简称px&#xff0c;所以“像素”有“图像元素” 之意。 ◼ 分辨率&#xff1a;是指图像…