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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思第7天

模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。 定义神经网络模型。 定义超参、损失函数及优化器。 输入数据集进行训练与评估。 数据集加载 import mindspore from mindspore import nn # 从 MindSpore 数据集包中导入 vision 和 transforms 模块。 # visio…

使用DC/AC电源模块时需要注意的事项

BOSHIDA 使用DC/AC电源模块时需要注意的事项 1. 仔细阅读和理解产品说明书&#xff1a;在使用DC/AC电源模块之前&#xff0c;应该仔细阅读和理解产品说明书&#xff0c;了解其性能特点、技术要求和使用方法&#xff0c;以确保正确使用和避免潜在的安全风险。 2. 选择适当的电…

MySQL 9.0 发布了!

从昨晚开始&#xff0c;在DBA群里大家就在讨论MySQL 9.0发布的事情&#xff0c;但是Release Note和官方文档都没有更新&#xff0c;所以今天早上一上班就赶紧瞅了下具体更新了哪些内容&#xff1f; 整体看来&#xff0c;基本没什么创新。下面是9.0新增或废弃的一些特性。 &…

Power Platform功能管理实战概述

Power Platform功能管理实战概述 Microsoft Power Platform是一个强大的低代码开发平台&#xff0c;它使组织能够自动化商业流程、开发自定义应用程序&#xff0c;并加强与客户的连接。该平台由四个主要组件组成&#xff1a;Power Apps、Power Automate、Power BI和Power Virt…

【探索Linux】P.36(传输层 —— TCP协议段格式)

阅读导航 引言一、TCP段的基本格式二、控制位详细介绍三、16位接收窗口大小⭕窗口大小的作用⭕窗口大小的限制⭕窗口缩放选项⭕窗口大小的更新⭕窗口大小与拥塞控制 四、紧急指针温馨提示 引言 在上一篇文章中&#xff0c;我们深入探讨了一种无连接的UDP协议&#xff0c;它以其…

Searchsploit漏洞利用搜索工具的介绍及使用

目录 0x00 介绍0x01 常用参数0x02 使用1. 在线搜索2. 使用步骤3. 使用实例 0x00 介绍 kali自带的&#xff0c;Searchsploit会通过本地的Exploit-db查找软件漏洞信息。 Exploit Database&#xff08;https://gitlab.com/exploit-database/exploitdb&#xff09;存储了大量的漏洞…

33.哀家要长脑子了!

憋说了&#xff0c;感觉好不容易长出来的脑子又缩回去了。。。 1.539. 最小时间差 - 力扣&#xff08;LeetCode&#xff09; 把所有时间排好序&#xff0c;然后计算两两之间的分钟差就好&#xff0c;但是要注意加上最后一个和第一个的判断&#xff0c;因为这个时间是按字典序来…

AI研究的主要推动力会是什么?ChatGPT团队研究科学家:算力成本下降

AI 研究发展的主要推动力是什么&#xff1f;在最近的一次演讲中&#xff0c;OpenAI 研究科学家 Hyung Won Chung 给出了自己的答案。 近日&#xff0c;斯坦福大学《CS25: Transformers United V4》课程迎来了一位我们熟悉的技术牛人&#xff1a;Hyung Won Chung。 Chung 是 O…

Hadoop-03-Hadoop集群 免密登录 超详细 3节点公网云 分发脚本 踩坑笔记 SSH免密 服务互通 集群搭建 开启ROOT

章节内容 上一节完成&#xff1a; HDFS集群XML的配置MapReduce集群XML的配置Yarn集群XML的配置统一权限DNS统一配置 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&…

Spring容器生命周期中如前置运行程序和后置运行程序

在Spring容器加入一个实现了BeanPostProcessor接口bean实例&#xff0c;重写postProcessBeforeInitialization、postProcessAfterInitialization方法&#xff0c;在方法里面写具体的实现&#xff0c;从而达到Spring容器在初如化前或销毁时执行预定的程序&#xff0c;方法如下&a…

深入浅出:npm常用命令详解与实践【保姆级教程】

大家好,我是CodeQi! 在我刚开始学习前端开发的时候,有一件事情让我特别头疼:管理和安装各种各样的依赖包。 那时候,我还不知道 npm 的存在,手动下载和管理这些库简直是噩梦。 后来,我终于接触到了 npm(Node Package Manager),它不仅帮我解决了依赖管理问题,还让我…

解决Visual Studio 一直弹出管理员身份运行问题(win10/11解决办法)

不知道大家是否有遇到这个问题 解决办法也很简单 找到启动文件 如果是快捷方式就继续打开文件位置 找到这个程序启动项 右键 选择 兼容性疑难解答&#xff08;win11 则需要 按住 shift 右键&#xff09; win10 解决办法 这样操作完后就可以了 win11解决办法按以下选择就行

深入理解策略梯度算法

策略梯度&#xff08;Policy Gradient&#xff09;算法是强化学习中的一种重要方法&#xff0c;通过优化策略以获得最大回报。本文将详细介绍策略梯度算法的基本原理&#xff0c;推导其数学公式&#xff0c;并提供具体的例子来指导其实现。 策略梯度算法的基本概念 在强化学习…

AI大模型时代来临:企业如何抢占先机?

AI大模型时代来临:企业如何抢占先机? 2023年,被誉为大模型元年,AI大模型的发展如同一股不可阻挡的潮流,正迅速改变着我们的工作和生活方式。从金融到医疗,从教育到制造业,AI大模型正以其强大的生成能力和智能分析,重塑着行业的未来。 智能化:企业核心能力的转变 企…

【CUDA】 归约 Reduction

Reduction Reduction算法从一组数值中产生单个数值。这个单个数值可以是所有元素中的总和、最大值、最小值等。 图1展示了一个求和Reduction的例子。 图1 线程层次结构 在Reduction算法中&#xff0c;线程的常见组织方式是为每个元素使用一个线程。下面将展示利用许多不同方…

AI-算力集群通往AGI

背景&#xff1a; 自GPT-4发布以来&#xff0c;全球AI能力的发展势头有放缓的迹象。 但这并不意味着Scaling Law失效&#xff0c;也不是因为训练数据不够&#xff0c;而是结结实实的遇到了算力瓶颈。 具体来说&#xff0c;GPT-4的训练算力约2e25 FLOP&#xff0c;近期发布的几个…

双曲方程初值问题的差分逼近(迎风格式)

稳定性: 数值例子 例一 例二 代码 % function chap4_hyperbolic_1st0rder_1D % test the upwind scheme for 1D hyperbolic equation % u_t + a*u_x = 0,0<x<L,O<t<T, % u(x,0) = |x-1|,0<X<L, % u(0,t) = 1% foundate = 2015-4-22’; % chgedate = 202…

刷代码随想录有感(124):动态规划——最长公共子序列

题干&#xff1a; 代码&#xff1a; class Solution { public:int findLength(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>>dp(nums1.size() 1, vector<int>(nums2.size() 1, 0));int res 0;for(int i 1; i <…

买华为智驾,晚了肯定要后悔

文 | AUTO芯球 作者 | 雷慢 晚了就来不及了&#xff01; 你买华为系的车&#xff0c;薅羊毛真的要趁早。 华为ADS2.0高阶智驾正在慢慢恢复原价&#xff0c; 你看啊&#xff0c;就在昨天&#xff0c;华为宣布ADS智驾优惠后价格调到3万元&#xff0c; 只有6000元的优惠了。…