目錄
一、介紹
二、基本使用
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:
- 主要組成:OpenSSL包含三個主要的功能部分:SSL協議庫、應用程序以及密碼算法庫。其中,SSL(Secure Sockets Layer)協議是互聯網上保密通訊的工業標準,由Netscape公司提出,目標是保證兩個應用間通信的保密性和可靠性。
- 加密算法:OpenSSL支持多種對稱加密和非對稱加密算法。對稱加密算法包括AES、DES、Blowfish等,而非對稱加密算法則有DH算法、RSA算法、DSA算法和橢圓曲線算法等。這些加密算法確保數據在傳輸過程中的安全性和完整性。
- 密鑰管理:OpenSSL提供了密鑰和證書管理功能,支持ASN.1的證書和密鑰相關標準,包括對證書、公鑰、私鑰、證書請求以及CRL等數據對象的DER、PEM和BASE64編解碼功能。它還實現了私鑰的PKCS#12和PKCS#8的編解碼功能,并提供了對私鑰的加密保護。
- 協議實現:OpenSSL實現了SSL協議的多個版本,包括SSLv2、SSLv3以及TLSv1.0。這些協議的版本在細節上略有不同,但總體目標是通過加密和認證機制保障互聯網通信的安全。
- 應用場景:OpenSSL廣泛應用于各種網絡安全協議中,例如HTTPS就是將HTTP協議通過SSL加密實現安全的網頁瀏覽。除此之外,VPN、加密的電子郵件協議等也常用到OpenSSL。
總結來說,OpenSSL不僅是一個功能強大的密碼學庫,還是一個多用途的、跨平臺的安全工具。其開源特性和廣泛的適用性使其成為技術人員在進行安全開發時的重要選擇。
?