OpenSSL的一些使用案例

目录

一、介绍

二、基本使用

1、Shell

(1)文件加解密

(2)生成密钥文件

2、API

(1)md5sum

(2)AES256加解密


一、介绍

        本篇博客重点不是详细描述 OpenSSL 的用法,只是作为日常使用中的一个备忘,方便下次使用时快速索引。后续还会继续补充。

二、基本使用

1、Shell

(1)文件加解密

        需要自定义 key 和 iv

#加密
openssl enc -aes-256-cbc  -K 1234567890 -iv 123456 -in 明文文件 -out 加密文件
#解密
openssl enc -aes-256-cbc -d -K 1234567890 -iv 123456 -in 加密文件 -out 明文文件

(2)生成密钥文件

        生成密钥文件 “ key_chatgpt ”,用户名为 “ user01”,两次输入密码。

[root@iZ2ze3k49h290jqnxmziclZ ssl_key]# echo -n 'user01:' >> key_chatgpt
[root@iZ2ze3k49h290jqnxmziclZ ssl_key]# openssl passwd >> key_chatgpt
Password:
Verifying - Password:
[root@iZ2ze3k49h290jqnxmziclZ ssl_key]# cat key_chatgpt
tpffy:4sx1qNlx9bbTM

        这个密钥文件主要配合 nginx 服务器使用,可以在用户访问网页时输入登录密码。

        nginx 配置文件如下所示。

location /chat.html{auth_basic "Restricted site";auth_basic_user_file /usr/local/nginx/html/ssl_key/key_chatgpt;root html;
}

        界面如下所示,进入 Web 界面后自动弹出。 

2、API

(1)md5sum

        计算文件的 md5 值,用于校验文件是否发生改变。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>//MD5输出的结果为16字节,两个16进制字符表示一个字节,因此结果应为32位
#define MD5_LEN 32 int cal_md5sum(char *filename, char *md5sum, int res_len)
{FILE *file = fopen(filename, "rb");if ( !file ) {printf("File not found\n");return -1;}unsigned char md5_buf[MD5_DIGEST_LENGTH];MD5_CTX ctx;MD5_Init(&ctx);const size_t bufSize = 4096;unsigned char *buffer = (unsigned char *)malloc(bufSize);int bytesRead = 0;while ( ( bytesRead = fread(buffer, 1, bufSize, file) ) ) {MD5_Update(&ctx, buffer, bytesRead);}free(buffer);fclose(file);MD5_Final(md5_buf, &ctx);char hex[MD5_LEN+1] = {0};memset(md5sum, 0, res_len);if ( res_len >= MD5_LEN + 1 ){for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) {sprintf(md5sum + 2 * i, "%02x", md5_buf[i]);}}else{printf("res len is invalid\n");return -1;}
}int main(int argc, char *argv[]) 
{char *md5sum = (char *)malloc(sizeof(char) * (MD5_LEN + 1));if ( cal_md5sum(argv[1], md5sum, MD5_LEN + 1) < 0 ){printf("calculate failed\n");exit(-1);}printf("%s  %s\n", md5sum, argv[1]);free(md5sum);return 0;
}

        运行截图如下所示。 

(2)AES256加解密

        可用于对 socket 通讯过程中的数据进行加解密。通讯两端需要自行协商 key 和 iv。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <openssl/aes.h>#define AESKEY "df98b715d5c6ed2b25817b6f255411a1"	//HEX密钥
#define AESIV "2841ae97419c2973296a0d4bdfe19a4f"	//HEX初始向量unsigned char* str2hex(char *str)	{unsigned char *ret = NULL;int str_len = strlen(str);int i = 0;assert((str_len % 2) == 0);ret = (char *)malloc(str_len / 2);for (i = 0;i < str_len; i = i + 2 ) {sscanf(str+i, "%2hhx", &ret[i / 2]);}return ret;
}int main()
{AES_KEY encryptkey;AES_KEY decryptkey;unsigned char *key;unsigned char *stdiv;key = str2hex(AESKEY);stdiv = str2hex(AESIV);AES_set_encrypt_key(key, 256, &encryptkey);AES_set_decrypt_key(key, 256, &decryptkey);unsigned char plain_text [32];memcpy(plain_text, "AES encrypt in openssl demo", 27);memset(plain_text + 27, 0, 5);printf("plain_text: ");for(int i = 0; i < 32; i++){printf("%02X ", plain_text[i]);}printf("\n");printf("plain_text : %s\n", plain_text);unsigned char encrypted_text [32];memset(encrypted_text, 0, 32);unsigned char tmpiv[16];memcpy(tmpiv, stdiv, 16);AES_cbc_encrypt(plain_text, encrypted_text, 32, &encryptkey, tmpiv, AES_ENCRYPT);printf("encrypted_text: ");for(int i = 0; i < 32; i++){printf("%02X ", encrypted_text[i]);}printf("\n");unsigned char decrypted_text [32];memset(decrypted_text, 0, 32);memcpy(tmpiv, stdiv, 16);AES_cbc_encrypt(encrypted_text, decrypted_text, 32, &decryptkey, tmpiv, AES_DECRYPT);printf("decrypted_text: ");for(int i = 0; i < 32; i++){printf("%02X ", decrypted_text[i]);}printf("\n");printf("decrypted_text: %s\n", decrypted_text);return 0;
}

        运行截图如下所示。

--------------------------------------- 废话分界线 ----------------------------------------------

--------------------------------------- 废话分界线 ----------------------------------------------

--------------------------------------- 废话分界线 ----------------------------------------------

OpenSSL是一种开放源代码的软件库包,它为应用程序提供安全通信功能,以避免窃听并确认通信双方的身份

OpenSSL的全称是Open Secure Sockets Layer,广泛被应用在互联网的网页服务器上。它是在上世纪90年代中期由Eric A. Young和Tim J. Hudson编写的,旨在提供一个没有太多限制的开放源代码的安全套接层协议实现。作为一个强大的密码库,OpenSSL不仅在网络传输层上保护数据安全,还提供了丰富的加密、解密、证书管理等功能。下面将具体介绍OpenSSL:

  1. 主要组成:OpenSSL包含三个主要的功能部分:SSL协议库、应用程序以及密码算法库。其中,SSL(Secure Sockets Layer)协议是互联网上保密通讯的工业标准,由Netscape公司提出,目标是保证两个应用间通信的保密性和可靠性。
  2. 加密算法:OpenSSL支持多种对称加密和非对称加密算法。对称加密算法包括AES、DES、Blowfish等,而非对称加密算法则有DH算法、RSA算法、DSA算法和椭圆曲线算法等。这些加密算法确保数据在传输过程中的安全性和完整性。
  3. 密钥管理:OpenSSL提供了密钥和证书管理功能,支持ASN.1的证书和密钥相关标准,包括对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64编解码功能。它还实现了私钥的PKCS#12和PKCS#8的编解码功能,并提供了对私钥的加密保护。
  4. 协议实现:OpenSSL实现了SSL协议的多个版本,包括SSLv2、SSLv3以及TLSv1.0。这些协议的版本在细节上略有不同,但总体目标是通过加密和认证机制保障互联网通信的安全。
  5. 应用场景:OpenSSL广泛应用于各种网络安全协议中,例如HTTPS就是将HTTP协议通过SSL加密实现安全的网页浏览。除此之外,VPN、加密的电子邮件协议等也常用到OpenSSL。

总结来说,OpenSSL不仅是一个功能强大的密码学库,还是一个多用途的、跨平台的安全工具。其开源特性和广泛的适用性使其成为技术人员在进行安全开发时的重要选择。

 

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

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

相关文章

什么是校园气象站

在科技日新月异的今天&#xff0c;气象观测不仅局限于专业的气象机构&#xff0c;它已经走进了我们的校园&#xff0c;成为了学生们探索自然、学习科学知识的重要平台。 校园气象站是设置在学校内部&#xff0c;用于进行气象观测、数据记录和科学实验的设施。它通常由气象传感器…

MySQL之应用层优化和备份与恢复(一)

应用层优化 缓存 作为基础组件的缓存 缓存有可能成为基础设施的重要组成部分。也很容易陷入一个陷阱&#xff0c;认为缓存虽然很好用&#xff0c;但并不是重要到非有不可得东西。你也许会辩驳&#xff0c;如果缓存服务器宕机或者缓存被清空&#xff0c;请求也可以直接落在数…

常见锁策略之可重入锁VS不可重入锁

可重入锁VS不可重入锁 有一个线程,针对同一把锁,连续加锁两次,如果产生了死锁,那就是不可重入锁,如果没有产生死锁,那就是可重入锁. 死锁 我们之前引入多线程的时候不是讲了一个加数字的案例么,我们今天以它来举例 当我们这样写的时候会出现什么问题? 分析:第一个synchron…

前端基础--Vue3

Vue3基础 VUE3和VUE2的区别 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece 于 2022 年 2 月 7 日星期一成为新的默认版本! Vue3性能更高,初次渲染快55%, 更新渲染快133% 。体积更小 Vue3.0 打包大小减少41%。 同时Vue3可以更好的支持T…

基于微服务智能推荐健康生活交流平台的设计与实现(SpringCloud SpringBoot)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

vb 学习简介

vb 第一节 Visual Basic(简称VB)是一种高级编程语言,它最初由微软公司开发,旨在简化Windows应用程序的开发过程。下面,我们将介绍Visual Basic编程语言的基础概念和用途,包括其历史背景、主要特性以及在现代编程中的应用。 历史背景 Visual Basic起源于1991年,当时微软…

代码随想录算法训练营day72 | 117. 软件构建、47. 参加科学大会

本次题目来自于卡码网 117. 软件构建&#xff08;拓扑排序&#xff09; python设置默认值 from collections import defaultdict aa defaultdict(int) 拓扑排序&#xff1a;找到入度为0的节点&#xff0c;然后移除。如果最后都能移除&#xff0c;则无环&#xff0c;可以排…

C#发票识别接口,再长的税号录入都不怕

“十二金”工程是我国政府在信息化建设中的重要一步&#xff0c;“金税工程”总称为中国税收管理信息系统&#xff08;CTAIS&#xff09;&#xff0c;是我国电子政务的核心系统之一,是财政的重要环节。十二金”是面向政府办公业务建立的十二个重点信息应用系统&#xff0c;按“…

解决使用monaco-editor编译器,编译器展示内容没有超过编译器高度,但是出现滚动条问题

前言&#xff1a; 最近在完成项目时&#xff0c;有使用编译器进行在线编辑的功能&#xff0c;就选用了monaco-editor编译器&#xff0c;但是实现功能之后&#xff0c;发现即使在编译器展示的内容没有超过编译器高度的情况下&#xff0c;编译器依旧存在滚动条&#xff0c;会展示…

计算机网络--网络层

一、网络层的服务和功能 网络层主要为应用层提供端对端的数据传输服务 网络层接受运输层的报文段&#xff0c;添加自己的首部&#xff0c;形成网络层分组。分组是网络层的传输单元。网络层分组在各个站点的网络层之间传输&#xff0c;最终到达接收方的网络层。接收方网络层将运…

如何在 Java 应用中使用 Jedis 客户端库来实现 Redis 缓存的基本操作

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

构建高效盲盒小程序:数据库设计、安全策略与性能优化

在移动互联网时代&#xff0c;盲盒经济以其独特的魅力迅速崛起&#xff0c;成为连接消费者与商品的新桥梁。盲盒小程序作为这一趋势的载体&#xff0c;不仅要求用户体验流畅&#xff0c;还需确保数据安全与性能卓越。本文将从数据库设计、安全策略及性能优化三个方面&#xff0…

堆与栈的概念(RTOS)

目录 #堆在RTOS的概念 #相关代码表示 #堆相关特点 #栈在RTOS中的概念 #栈的代码表示 #栈的相关特点 #为什么每个RTOS任务都要有自己的栈 前言&#xff1a;本篇参考韦东山老师的RTOS&#xff0c;连接放在最后 #堆在RTOS的概念 本文所指的堆与栈并不是数据结构中&#xff…

【unity实战】在Unity中使用有限状态机制作一个敌人AI

最终效果 文章目录 最终效果前言有限状态机的主要作用和意义素材下载逻辑图敌人动画配置优雅的代码文件目录状态机代码定义敌人不同状态切换创建敌人效果更多的敌人参考源码完结 前言 有限状态机以前的我嗤之以鼻&#xff0c;现在的我逐帧分析。其实之前我就了解过有限状态机&…

2.(vue3.x+vite)调用iframe的方法(vue编码)

1、效果预览 2.编写代码 (1)主页面 <template><div><button @click="sendMessage">调用iframe,并发送信息

【udp报文】udp报文未自动分片,报文过长被拦截问题定位

问题现象 某局点出现一个奇怪的现象&#xff0c;客户端给服务端发送消息&#xff0c;服务端仅能收到小部分消息&#xff0c;大部分消息从客户端发出后&#xff0c;服务端都未收到。 问题定位 初步分析 根据现象初步分析&#xff0c;有可能是网络原因导致消息到服务端不可达&a…

【C语言】文件的顺序读写

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 前言字符输入输出函数 - fgetc和fputc文本行输入输出函数 - fgets和fputs格式化输入输出函数 - fscanf和fprintf 前言 对文件数据的读写可以分为顺序…

Unity3D 打造基于AStar的寻路与导航详解

在游戏开发中&#xff0c;寻路与导航是一个至关重要的功能&#xff0c;它能够使游戏角色自动找到最优路径&#xff0c;避开障碍物&#xff0c;实现自动导航&#xff0c;从而提升游戏体验。AStar&#xff08;A*&#xff09;算法作为一种广泛应用的寻路算法&#xff0c;因其高效性…

关于多线程的使用方法

多线程在python中应用比较广泛&#xff0c;但是因为python中有GIL锁的缘故&#xff0c;在多线程中看起来是并发的执行的&#xff0c;在宏观上是并发执行的&#xff0c;但是在微观上是一个接着一个执行。 在python中使用多线程比较简单&#xff0c;是一套固定的模版。 from qu…

PHP利用GD库实现图片合成功能方法

在程序项目开发的过程中我们免不了要实现一种功能。例如海报的生成&#xff0c;照片和文字合成一张新的图片。php中怎么实现 实现功能 文字和照片合成一张新的照片&#xff0c;并且自适应换行并加上签名和日期&#xff0c;加上字体样式&#xff0c;下面我们就开实现该功能 实现…