系統安全之身份認證

本篇我們對常用的身份認證協議做簡要的梳理,包括主流的 HTTP 相關認證協議以及證書密鑰對、新興的 WebAuthn 認證。

HTTP 協議認證

RFC 7235 中定義了 HTTP 協議的認證框架,要求在支持 HTTP 協議的服務器,如果訪問服務的身份驗證失敗,需要返回 401 Unauthorized 或 407 Proxy Authentication Required 狀態碼,并告知客戶端應該采用何種方案提供憑證信息,收到響應后客戶端按要求加入認證憑據信息后才能繼續訪問。

# 響應頭
WWW-Authenticate: <認證方案> realm=<保護區域的描述信息>
Proxy-Authenticate: <認證方案> realm=<保護區域的描述信息># 請求頭
Authorization: <認證方案> <憑證內容>
Proxy-Authorization: <認證方案> <憑證內容>

整個認證流程如下:

在上述認證框架的基礎上,HTTP 提出了不同的認證方式。

HTTP Basic & 摘要認證

RFC 2617 提出了 Basic 和 Digest Access(摘要認證)兩種方式,我們先來看下 Basic,其認證流程如下:

  • 將用戶名密碼用冒號間隔做拼接,格式為 username:password
  • 對拼接后的字符串進行 Base64 編碼,比如 Base64(admin:12345) 得到 YWRtaW46MTIzNDU=
  • 將編碼后的字符串添加 Basic 標識后放到 HTTP 頭 Authorization 中,最終結果為 Authorization: Basic YWRtaW46MTIzNDU=,然后向服務端請求。
  • 如果認證通過,則返回 200 響應碼。否則按照上述框架要求的,響應 401 并且返回響應頭 WWW-Authenticate: Basic realm="Dev", charset="UTF-8"

可以看到 Basic 認證對密碼只是做了編碼,并沒有加密處理,因此使用 Basic 認證時必須結合 TLS 加密傳輸一起使用。Basic 更多用于系統內部之間一些組件的訪問,在實際生產系統中很少使用。

RFC2069 提出了 Digest Access 摘要認證,后續由 RFC 2617 做了一系列的增強,算是對 Basic 的改進,其認證流程如下:

  • 認證失敗,服務端返回 401 以及 WWW-Authenticate 頭如下。
WWW-Authenticate: Digest realm="testrealm@host.com",qop="auth,auth-int",nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",opaque="5ccc069c403ebaf9f0171e9517f40e41"

如果沒有特殊要求,其計算的流程如下:

HA1 = MD5(username:realm:password)
HA2 = MD5(method:digestURI)
response = MD5(HA1:nonce:HA2)

其中,nonce 是服務端返回的鹽值,method 是請求方法,digestURI 為請求 URI。RFC 2617 提出了
qop(quality of protection,保護質量) 對計算方式提出了更復雜的要求,改進后的計算流程如下:

  • 客戶端生成自己的鹽值,然后做哈希操作 HA1 = MD5(MD5(username:realm:password):nonce:cnonce)

  • 如果 qop 包含了 auth-init,則 HA2 = MD5(method:digestURI:MD5(entityBody)),entityBody 代表整個請求體。

  • 最后response = MD5(HA1:nonce:nonceCount:cnonce:qop:HA2)。計算完成后客戶端將值加入到 Authorization 請求頭中,示例如下:

GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: Digest username="Mufasa",realm="testrealm@host.com",nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",uri="/dir/index.html",qop=auth,nc=00000001,cnonce="0a4f113b",response="6629fae49393a05397450978507c4ef1",opaque="5ccc069c403ebaf9f0171e9517f40e41"

可以看到摘要認證通過鹽值、MD5 哈希的方式對用戶名密碼傳輸做了一定程度的加密,但其實最終加密后的強度還是取決于密碼的強度,如果密碼強度較弱其依然有泄露的風險,另外這里也沒有辦法避免中間人攻擊。

Bearer(OAuth 2.0)認證

RFC 6750 描述了基于 OAuth 2.0 的認證授權方式,它要求使用 Bearer Token(承載令牌) 的方式進行認證。

客戶端在獲取令牌成功后,需要將令牌放到 Authorization 請求頭中,格式如下:

Authorization: Bearer <token>

OAuth 2.0 協議當初主要是為了對第三方授權而實現的,其同時設計身份認證和授權,這個我們后面在詳細介紹。

Form 認證

因為身份認證通常是應用系統的業務邏輯的一部分,雖然 HTTP 協議提供了基本的認證框架,但在大多數情況下,我們需要自行實現認證流程。最常見的方式就是通過 HTML 表單提交用戶名和密碼,然后服務端驗證成功后返回一個憑據給客戶端,客戶端在后續的請求中將憑據放到 HTTP 請求頭中。這在萬維網中被稱為 Web 認證,因為最常見的方式就是通過表單登錄,也叫做表單認證(Form-based Authentication)。

表單認證并沒有一個標準的規范規范,因此通常由產品和工程師根據業務需求自行設計實現,在設計方案時可以參考 OWASP Authentication Cheat Sheet 中的建議。

Web WebAuthn 認證

證書密鑰對

上述認證方式都是基于用戶名密碼或者用戶生物特征等方式進行認證的,這在ToC(面向消費者)場景下是比較常見的方式,但在其他場景下,比如系統內部的服務間通信、API 調用,機構和機構之前的通信,則需要其他的解決方案。最常用的就是數字證書和密鑰對認證。

通過非對稱加密的方式,我們可以生成公鑰和私鑰,我們將私鑰安全保存,然后將公鑰分發出去。通過私鑰加密的數據只有使用公鑰才能解密,這樣同時解決了身份認證和數據加密的問題。但這種方式無法避免中間人攻擊,因此通常需要結合數字證書來使用。

我們需要一個權威證書機構(CA,Certificate Authority)來頒發證書,證書中包含了公鑰和一些其他信息,比如證書的有效期、頒發者等。通信雙方在拿到證書后,可以向 CA 機構驗證證書的合法性,驗證通過后就可以使用公鑰進行加密通信,從而保證通信的安全性。

目前網站和應用系統中使用的 HTTPS 通信以及云原生的下的 mTLS(雙向 TLS)認證都是基于證書密鑰對的方式。

傳統網站的 HTTPS 單向認證流程如下:

  1. 我們在瀏覽器訪問網站,發起 HTTPS 請求。
  2. 服務端收到請求后,返回自己的證書給瀏覽器。
  3. 瀏覽器驗證證書的合法性,如果合法則繼續請求,否則返回錯誤。
  4. 瀏覽器使用證書中的公鑰加密請求數據,并發送給服務端。

可以看到這里主要是瀏覽器客戶端去驗證服務端的證書是否合法,也就是驗證我們訪問的網站是否是真實合法的。而在 mTLS 雙向認證中,除了客戶端驗證服務端的證書外,服務端也會驗證客戶端的證書是否合法,流程如下:

  1. 客戶端請求服務端
  2. 服務端返回其 TLS 證書
  3. 客戶端驗證服務端證書合法性
  4. 客戶端提供其 TLS 證書
  5. 服務端驗證客戶端證書合法性
  6. 驗證成功,雙方使用各自的公鑰進行加密通信。

在云原生環境以及 Zero Trust 安全架構理念的指導下,mTLS 幾乎已經成為服務間通信的的必備安全認證方式。通常在企業內部,我們可以通過自簽名證書的方式來生成 CA 和證書密鑰對,下面我們用 OpenSSL 命令工具來演示這個過程:

  • 生成 CA 私鑰和證書
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.crt
  • 生成服務端私鑰和證書簽名請求(CSR)
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
  • 生成服務端證書
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256
  • 生成客戶端私鑰和證書簽名請求(CSR)
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
  • 生成客戶端證書
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 -sha256

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84562.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

部署http服務

使用flask搭建一個http服務&#xff0c;能夠通過本地的另外一個終端訪問對應接口&#xff0c;拿到服務端的計算結果 服務端&#xff1a; 創建一個test_http_dtw.py并運行 from flask import Flask, request, jsonifyapp Flask(__name__)# 示例分析函數 def analysis(data):…

WLAN 技術指南:從入門到原理

文章目錄 目錄 文章目錄 前言 一.WLAN 基本概念 有線側組網概念 AP-AC 組網方式 AC 連接方式 CAPWAP 協議 無線側組網概念 無線信道 ?編輯 BSS/SSID/BSSID ?編輯 VAP ESS 二.WLAN 組網架構 基本的 WLAN 組網架構 四.WLAN 工作原理 AP 上線 AP 獲取 IP 地址階段 CAP…

語言學習專用AI播放器推薦:LLPlayer

學語言&#xff0c;經常會看大量的比較優秀的視頻材料&#xff0c;那么推薦一款語言學習利器&#xff0c;極大提高生產力。 LLPlayer 是一款專為語言學習者設計的獨特視頻播放器。 它具有許多重要功能&#xff0c;例如可同時顯示文本字幕和位圖字幕、使用 OpenAI Whisper 自動…

mysql 關聯表查詢,索引失效

來源表: ##示例 CREATE TABLE order_wide (order_id varchar(33) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 訂單ID,member_id int(11) DEFAULT NULL COMMENT 用戶ID,content varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 訂單標簽,PRIMARY KEY (order_…

Oracle DG庫手動注冊歸檔日志的兩種方法

Oracle DG庫手動注冊歸檔日志的兩種方法 注冊單個歸檔日志文件注冊多個歸檔日志文件有的時候由于網絡或各種原因,Oracle DG庫服務器上可能缺少部分歸檔日志文件,導致DG庫的MRP進程一直處于WAIT_FOR_GAP狀態。 此時我們可以手動從主庫或其他DG拷貝歸檔日志到當前DG服務器,并…

中小型VUE3項目創建流程相關命令tips

開新項目因為距離上次初始化時間太過久遠,忘記初始化命令的有多少? 不得已簡要記錄一下流程 1. 使用vite構建新項目 1.1 構建 npm create vite@latest my-vue-app --template vue1.2 安裝依賴 npm install1.3 啟動 npm run dev參考文檔 2. 添加需要的插件 2.1 準備工作…

Web后端開發(請求、響應)

目錄 請求&#xff1a; Postman&#xff1a; 簡單參數&#xff1a; 實體參數&#xff1a; 數組集合參數&#xff1a; 日期參數&#xff1a; Json參數&#xff1a; 路徑參數&#xff1a; 響應&#xff1a; 請求響應&#xff1a; 請求&#xff1a;獲取請求數據 響應&a…

Excel大廠自動化報表實戰(互聯網金融-數據分析周報制作上)

這是Excel大廠自動化報表實戰第二期--互聯網金融-數據分析周報制作上 數據資源已經與這篇博客捆綁&#xff0c;有需要者可以下載通過網盤分享的文件&#xff1a;2.4自動化報表-8月成交數據.xlsx&#xff0c;2.4自動化報表-8月獲客數據.csv等2個文件 鏈接: https://pan.baidu.co…

HTTP 網絡協議演進過程

網絡協議演進問題&#xff0c;涉及到HTTP版本之間的連接復用優化和協議升級&#xff08;特別是從HTTP/2到HTTP/3&#xff09;的核心變化。我們以 HTTP/1.0 到 HTTP/2.0&#xff0c;再到 HTTP/3.0 的演進順序來詳細解釋它們在通道復用&#xff08;TCP/QUIC&#xff09;上的優化和…

Xsens動捕和Manus數據手套在元宇宙數字人制作中提供解決方案

硬件連接與數據傳輸 Xsens與Manus集成&#xff1a;Xsens慣性動作捕捉系統負責捕捉人體的身體動作&#xff0c;Manus數據手套專門精確捕捉手指動作。Xsens動捕套裝上有接口或無線連接模塊&#xff0c;可與Manus手套配對和傳輸數據&#xff0c;將身體與手指跟蹤數據結合。 Face…

【Java開發日記】簡單說一說使用 Netty 進行 Socket 編程

目錄 什么是 Netty 對比Netty和傳統的Socket 傳統Socket編程服務端 傳統Socket編程客戶端 Netty環境搭建 先創建出來一個項目 Netty服務端程序 Netty客戶端程序 Channel Channel分類 為什么選擇Netty 什么是 Netty Netty是由JBOSS提供的一個java開源框架&#xff0c…

目標檢測任務的評估指標mAP50和mAP50-95

mAP50 和 mAP50-95 是目標檢測任務中常用的評估指標&#xff0c;用于衡量模型在不同 交并比&#xff08;IoU&#xff09;閾值 下的平均精度&#xff08;Average Precision, AP&#xff09;。它們的區別主要體現在 IoU 閾值范圍 上。 ? 1. mAP50&#xff08;mean Average Prec…

COHERENT XPRV23光電接收器控制軟件

COHERENT XPRV23光電接收器控制軟件

執行應用共享內存空間 同步QT進行快速捕獲數據流

引言&#xff1a;本文章針對驅動的應用app&#xff0c;例如sensor data內容的獲取&#xff0c;顯示到QT的一種辦法&#xff0c;共享內存。舉例子&#xff0c;這是一個常見需求&#xff0c;比如攝像頭采集進程與 GUI 顯示進程分離&#xff0c;通過共享內存傳輸圖像&#xff0c;避…

opencl的簡單介紹以及c++實例

&#x1f9e9; 一、什么是 OpenCL&#xff1f; OpenCL&#xff08;Open Computing Language&#xff09; 是一個用于異構計算的開放標準&#xff0c;由 Khronos Group 提出和維護。它允許你在各種計算設備上&#xff08;如 CPU、GPU、DSP、FPGA&#xff09;并行運行代碼&#…

ThingsCloud事物云平臺搭建-微信小程序

ThingsCloud云平臺與微信小程序設計 本文主要是介紹ThingsCloud云平臺的搭建及微信小程序與app的使用。 當前文章是作為一個通用案例,介紹如何快速使用 ThingsCloud云平臺 以及 利用 ThingsCloud云平臺平臺的框架快速設計手機APP和微信小程序。 可以快速讓硬件接入,實現硬件…

2024 一帶一路暨金磚國家職業技能大賽(金磚國家未來技能和技術挑戰賽)

2024 一帶一路暨金磚國家職業技能大賽&#xff08;金磚國家未來技能和技術挑戰賽任務書&#xff09; 1 參加比賽的形式&#xff1a;2 項目階段簡介&#xff1a;3 項目階段和所需時間&#xff1a;4 第一階段&#xff1a;職業素養與理論技能4.1 項目 1.職業素養4.2 項目 2.法律法…

2025-06-13【api】阿里百煉api調用方法

通過調用各種大模型可以完成對文生文&#xff0c;文生圖&#xff0c;圖片理解&#xff0c;文生視頻&#xff0c;音頻識別&#xff0c;文轉音頻等需求。 #方法一 import os from openai import OpenAI# 初始化客戶端 client OpenAI(api_keyos.getenv("DASHSCOPE_API_KEY&…

軟件工程的軟件生命周期通常分為以下主要階段

軟件工程的軟件生命周期通常分為以下主要階段&#xff1a; 可行性分析 &#xff1a;評估項目的技術、經濟、操作和法律可行性&#xff0c;確定項目是否值得開發。需求分析 &#xff1a;明確用戶需求&#xff0c;定義軟件功能和非功能需求&#xff0c;形成需求規格說明書。系統…

Spring依賴注入的四種方式(面)

目錄 1. 構造器注入 2. 字段注入 3. Setter注入 4. 方法注入 最佳實踐建議 1. 構造器注入 Service public class UserService {private final UserRepository userRepository;Autowired // Spring 4.3 可以省略public UserService(UserRepository userRepository) {this.…