Linux openssl介紹

来源:https://www.cnblogs.com/heyongshen/archive/2023/10/26/17787948.html
-Advertisement-
Play Games

SSL和TLS 瞭解openssl之前,我們首先要瞭解SSL\TLS是什麼。 SSL(Secure Sockets Layer)是一個協議,叫作安全套接層協議。旨在為應用層數據提供加密的傳輸層通道。,即數據從應用層去往傳輸層,會首先被ssl給加密。 但是隨著時間的發展,SSL的繼任者TLS(Tran ...


SSL和TLS

瞭解openssl之前,我們首先要瞭解SSL\TLS是什麼。

SSL(Secure Sockets Layer)是一個協議,叫作安全套接層協議。旨在為應用層數據提供加密的傳輸層通道。,即數據從應用層去往傳輸層,會首先被ssl給加密。

但是隨著時間的發展,SSL的繼任者TLS(Transport Layer Security)傳輸層安全協議被引入,為網路連接提供了更高級的安全性,TLS提供更多的加密演算法和選擇,所以開始逐漸取代了早期的SSL版本。

例如:

在引入SSL和TLS之前,使用HTTP協議的請求和響應是明文的,這意味著數據包在傳輸過程中容易被第三方竊聽、抓取或篡改。引入SSL/TLS之後,當數據從應用層發送至傳輸層時,它會被SSL或TLS加密。這樣,一個安全的通道被建立,確保數據從發送方(一個端)到接收方(另一個端)的整個路徑都是加密的,從而實現端到端的安全性。

應用層數據在前往傳輸層加密的原因;

一直有一個疑問,為什麼應用層的數據要在傳輸層加密,而不是在網路層或者其它層進行加密。剛開始以為應用層數據肯定要從傳輸層經過,如果在傳輸層已經被別人捕獲了,在下一層加密沒意義了。後面才認識到這是有考慮的:

  1. 在傳輸層對應用層數據進行加密,具有很強的選擇性,因為傳輸層加密允許為不同的應用選擇是否需要加密,可以給指定的應用加密,如果在網路層或者數據鏈路層,全部都會被加密。

  2. 傳輸層加密能保證端到端的安全性,網路層或數據鏈路層加密可能只會在兩個設備或兩個網路之間提供加密

  3. 將數據從傳輸層加密了,在網路層或數據鏈路層被捕獲了別人耶看不懂。


openssl

OpenSSL是一個開源的工具庫和工具集,用於處理SSL和TLS協議以及對數據進行加密和解密的各種操作。

openssl中文網: https://www.openssl.net.cn/

一般我們最常用的工具,就是這個軟體包裡面提供的一個叫作 openssl 的命令行工具,通過它可以實現一些加密演算法,像SSL、TLS等等。

在Linux發行版系統中,一般預設就安裝了openssl工具,通過 openssl verson 就可以查看openssl的版本信息。


openssl基礎用法

實現對稱加密

對稱加密就是加密和解密使用的是同一個密鑰,是通過將原始數據分割成若幹塊來逐個進行加密,所以效率高、速度快

openssl enc -e 演算法類型   -a  -salt  -in  需要加密的文件  -out  存放加密生成的結果的文件

例如:

openssl enc -e -des3 -a  -salt  -in file1  -out file1.cipher

說明:

  • 使用 -salt 來加鹽(加鹽就是在進行哈希加密的時候加上隨機字元串)的時候,openssl會自動生成一個隨機的鹽,併在加密過程中使用它

  • 除了 -des3 這種堆成加密類型,還有-des等類型。使用 man openssl enc 可以看到其它的一些加密類型應該使用的對應參數

  • 使用 -a 參數可以將加密後的內容通過base64這種彪馬格式來顯示

實現對稱解密

openssl enc -d 演算法類型 -a -salt -in 需要解密的文件 -out 解密後的問題

例如:

openssl enc -d -des3  -a -salt -in file1.cipher  -out file1_new

說明:

  • 演算法類型需要和加密時使用的保持一致

  • 使用對稱加密的時候會要求提示輸入密碼。因為對稱加密演算法使用同一個密碼進行加密和解密

實現非對稱加密

非對稱加密的特點是密鑰成對出現,加密和解密用的密鑰不相同,並且通信雙方都需要各自的密鑰和私鑰

  • 如果使用公鑰加密、私鑰解密。加密的數據只能自己解開,能充分保證數據的安全

  • 如果使用私鑰加密,公鑰解密。這樣能確定數據的來源性,這就是我們所說的數字簽名

生成私鑰:

openssl genrsa -out 存放私鑰的文件 使用的加密演算法類型

例如:

openssl genrsa -out b.enc

說明:

  • 不指定密鑰的長度,預設長度就是2048,密鑰長度越長,其加密強度就越高,加密何解密時間越長,一般使用預設的就可以了

  • 不指定加密演算法的類型,預設使用的非對稱加密演算法是RSA

  • 生成的密鑰預設是按照 PEM格式 輸出,即以base64格式顯示文本信息。

生成公鑰:

公鑰鑰是隱藏在私鑰內部的,可以通過私鑰的到公鑰

openssl rsa -in 私鑰文件 -pubout -out 提取出來保存的公鑰文件

例如:


實現非對稱解密

公鑰加密:

openssl rsautl -encrypt -pubin -inkey 公鑰文件 -in 需要加密的文件 -out 加密後的文件

私鑰解密:

openssl rsautl -decrypt -inkey 私鑰文件 -in 需要解密的文件 -out 解密後的文件

實現單向哈希

hash是一種單向的加密演算法,是不可逆的。使用哈希演算法加密出來的結果就叫做摘要,這玩意兒有個特點就是長度固定,內容不同。一旦原數據發生改變,摘要也會隨之發生改變,所以一般用來確認數據的完整性,看有沒有被人篡改。

在這裡有一個叫作指紋的概念,指紋是每個人獨一無二的,不同的人(數據)有不同的指紋(摘要),但是只知道了指紋(摘要),也不能知道是誰(不能通過摘要推出原數據)。

openssl dgst 使用的哈希演算法  對哪個文件生成摘要

例如:

 openssl  dgst file1

說明:

  • 不指定哈希演算法,預設使用的是 SHA256演算法,可以使用 man openssl dgst查看對應選項代表的哈希演算法

  • 不指定顯示的類型,預設顯示的是十六進位的字元

生成用戶密碼

可以使用openssl來給用戶生成密碼,使用 useradd 命令創建用戶的時候可以指定用戶的密碼,但是這個密碼必須是加密的密碼才行,這個時候就可以使用openssl來生成一個。

其實就是利用哈希演算法來給密碼生成一個摘要值

openssl passwd 演算法類型 用戶密碼

不指定任何哈希演算法選項,那麼預設使用的是傳統的UNIX crypt() 方法,比 MD5 還老

演算法類型說明:

  • -6:表示採用sha512這種加密算,也會預設使用隨機的鹽

  • -5:sha256演算法,也會預設使用隨機的鹽

  • -1:md5演算法,會預設生成一個隨機的鹽來與密碼一起哈希

這三種都是UNIX密碼哈希方案的一部分

例如:

useradd bob -m -s /bin/bash -p $(openssl passwd -6 redhat)

使用useradd創建用戶的時候,如果沒指定相關屬性,會預設使用 /etc/default/useradd中定義的屬性信息。

生成隨機數

openssl rand 顯示格式(主要有hex和base64) 輸出的隨機位元組數量

例如:生成16個隨機位元組並以十六進位格式輸出

openssl rand -hex 16

說明: 一個十六機制數由4個二進位數組成,一個位元組8位,所以一個十六進位數等於兩個位元組。總共會輸出三十二個字元

例如:以base64編碼形式顯示隨機數

openssl rand -base64 16

base64編碼介紹

base64是一種用64個字元來表示任意二進位數據的方法。在一些早期的協議中,例如smtp、http。他們只設計了ASCII字元數據的傳輸,當需要包含非ASCII字元或者二進位數據時就會出問題,因為雖然二進位數據都是由於0和1組成,但是難點在於如何表示和傳輸這些0和1。

這個時候使用base64編碼完美解決問題,將二進位數據轉為一個僅由ASCII字元組成的安全字元串,這樣可以避免由於二進位數據的傳輸而導致的任何解釋或傳輸問題

編碼原理

  1. 先將要三個位元組的二進位數據(一共24位),重新分為4組,每組6位。(每6位就可以表示一個值,範圍從0到63)

  2. 然後將每個6位的數據(一個組)轉換為十進位數字,然後根據base64的字元集得到相應的字元。

  3. 再重覆這個過程直到所有的輸入數據都被處理完

  4. 如果原始數據(即待編碼的數據)的長度不是3個位元組的整數倍(base64將每3個位元組作為一個單元來處理),會添加填充字元,即=,來使其長度滿足要求。這就是看到等號的原因


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、前言 大家在開發過程中必不可少的和日期打交道,對接別的系統時,時間日期格式不一致,每次都要轉化! 每次寫完就忘記了,小編專門來整理一篇來詳細說一下他們四個的轉換的方法,方便後面使用!! 二、LocalDateTime、LocalDate、Date三者聯繫 這裡先說一下,為什麼日期有Date了,還 ...
  • 內容摘自我的學習網站:topjavaer.cn 分享50道Java併發高頻面試題。 線程池 線程池:一個管理線程的池子。 為什麼平時都是使用線程池創建線程,直接new一個線程不好嗎? 嗯,手動創建線程有兩個缺點 不受控風險 頻繁創建開銷大 為什麼不受控? 系統資源有限,每個人針對不同業務都可以手動創 ...
  • 閱讀本文前,需要先閱讀SpringMVC之RESTful概述 8.1、前期工作 8.1.1、創建實體類Employee package org.rain.pojo; import java.io.Serializable; /** * @author liaojy * @date 2023/10/1 ...
  • 後臺數據的處理語言有很多,Java 是對前端採集的數據的一種比較常見的開發語言。互聯網移動客戶端的用戶量特別大,大量的數據處理需求應運而生。可移動嵌入式設備的表現形式 很多,如 PC 端,手機移動端,智能手錶,Google 眼鏡等。Server2client 的互聯網開發模式比較常見,有一種新的數據 ...
  • MDI窗體的相關學習使用 1、設置MDI父窗體 在屬性中找到IsMdiContainer選項,設置為True 2、添加MDI子窗體,在項目中依次選擇添加->窗體,然後一直預設即可 添加後的項目目錄(Form1為父視窗,Form2、Form3為子視窗) 3、在Form1.cs中,創建對應MDI子視窗的 ...
  • 之前學習了一部分的C#基礎,但是感覺會的不多,很多地方依然需要通過做一點小Demo來進行鞏固,那麼這個C#的網路下載器,就來了 原理講解 首先我們編寫代碼之前,我們需要瞭解下網路下載的原理到底是什麼? 學習過C#中IO流部分的知識,或者你有其它的語言的基礎,學習過其它語言的文件IO的基礎,肯定瞭解過 ...
  • 一:背景 1. 講故事 上一篇我們聊到了 Console 為什麼會卡死,讀過那篇文章的朋友相信對 conhost.exe 有了一個大概的瞭解,這一篇更進一步聊一聊視窗的特殊事件 Ctrl+C 底層流轉到底是什麼樣的,為了方便講述,讓 chagtgpt 給我生成一段Ctrl+C 的業務代碼。 clas ...
  • C#棧和隊列的實現 用雙向鏈表實現一個隊列 public class DoubleNode { public int Value; public DoubleNode pre; public DoubleNode next; public DoubleNode(int value) { this.V ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...