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.pswp.cn/diannao/39783.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39783.shtml
英文地址,請注明出處:http://en.pswp.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;下面我們就開實現該功能 實現…