密鑰安全性討論之密鑰分層管理結構

密鑰分層管理結構

  • 密鑰的安全管理通常采用層次化的保護方法。密鑰管理分層管理機制將密鑰分為三層,即根密鑰、密鑰加密密鑰和工作密鑰
  • 下層密鑰為上層密鑰提供加密保護,采用分層的密鑰結構有助于密鑰的管理滿足本規范的要求

工作密鑰

  • 工作密鑰對本地保存的敏感數據和需要在不安全信道上傳輸的數據提供機密性、完整性保護,還可提供認證和簽名等密碼學服務。工作密鑰直接被上層應用程序所使用,包括存儲加密使用的密鑰、預共享密鑰、MAC密鑰、簽名私鑰等

密鑰加密密鑰

  • 對工作密鑰提供機密性保護的密鑰,其自身受到根密鑰的保護。對于較為簡單、安全等級要求不高的密碼應用系統,密鑰加密密鑰的職能可以直接由根密鑰兼任

根密鑰

  • 位于密鑰管理分層結構的最底端,用于對上層密鑰(如密鑰加密密鑰)的機密性進行保護

規則

  • 密鑰分層管理至少選擇兩層結構進行管理
  • 密鑰的分層管理機制最少把密鑰分為兩層,即:根密鑰和工作密鑰,根密鑰為工作密鑰提供加密保護。根密鑰、工作密鑰的生成必須滿足密鑰生成的相關要求。

密鑰分層管理結構

  • 密鑰分層管理結構的選擇與其應用場景有密切的關系。選擇三層結構還是兩層結構取決于產品所涉及的加密應用場景的復雜度。應用場景復雜的情況推薦使用三層管理結構。

根密鑰更新過程產生大量的加解密運算開銷

  • 在應用系統中,如果使用根密鑰直接保護工作密鑰,根密鑰的更新會導致所有受其加密保護的工作密鑰需要全部使用更新前的根密鑰解密,再重新使用更新后的根密鑰加密。當工作密鑰數量比較龐大時,對工作密鑰的解密和加密操作將耗費大量的資源并影響系統的性能。為解決上述問題,推薦使用三層密鑰管理結構,在根密鑰和工作密鑰之間增加一層密鑰加密密鑰(KEK),密鑰加密密鑰對工作密鑰進行加密保護,根密鑰則對KEK進行加密保護。當根密鑰更新時,只需要解密和重新加密KEK即可,由于KEK的數量遠遠小于工作密鑰數量,對KEK的解密和加密操作不會消耗大量資源,對系統的性能影響很小。當KEK更新時,將需要被更新的KEK和被其保護的工作密鑰都保存成歷史密鑰信息。應用系統需要解密被歷史密鑰信息加密的數據時,直接使用歷史密鑰解密即可。

系統要求頻繁的進行工作密鑰更新

  • 在應用系統中,如果工作密鑰的更新頻率很高,典型的應用場景是工作密鑰作為通信密鑰(可能要求每次會話都被要求使用不同的密鑰)。該場景下的工作密鑰更新過程通常在線進行,需要使用工作密鑰的下層密鑰加密保護工作密鑰的傳輸過程。如果使用根密鑰直接保護工作密鑰,根密鑰加密的密文會頻繁的在不安全的信道上傳輸,并易于被攻擊者截獲。攻擊者可以通過分析大量密文破解根密鑰。雖然通過更新根密鑰的方法可以有效避免上述對根密鑰的攻擊,但根密鑰更新周期一般較長,且一般使用手動方式更新,無論采用白盒密碼還是基于密鑰組件的根密鑰保護方案,根密鑰的更新操作都較為繁瑣,難以廣泛的適應該應用場景的要求。為解決上述問題,推薦使用三層密鑰管理結構,在根密鑰和工作密鑰之間增加一層密鑰加密密鑰(KEK),工作密鑰的更新過程使用KEK保護,由于KEK的更新頻率遠遠小于工作密鑰的更新頻率,KEK的更新可以使用根密鑰保護。由于KEK更新周期相對較長,即使攻擊者可以截獲使用根密鑰加密的KEK密文,獲取的密文數量也非常有限,所以攻擊者很難通過分析密文破解出根密鑰。

應用系統結構復雜

  • 如果應用系統中包含兩個或者兩個以上的子系統,各子系統之間的業務相互獨立,每個子系統都為用戶提供不同的服務。在這樣的場景下,各子系統使用的密鑰應該各不相同。如果不同的應用系統之間使用的工作密鑰都被根密鑰保護,根密鑰的泄露(根密鑰的泄露風險可參考“系統要求頻繁的進行密鑰更新”場景)將導致各子系統由密碼機制保障的安全性完全失效。為解決上述問題,推薦使用三層密鑰管理結構,在根密鑰和工作密鑰之間增加一層密鑰加密密鑰(KEK),為每個子系統分配各自的KEK,這樣即使某一個子系統的KEK泄露,密碼安全機制失效的威脅僅也限于該子系統內,不會影響其他子系統的安全性,而且由于KEK更新較為方便,當發生KEK泄露的事故后,可以通過立即更新KEK的方法將信息泄露的損失最小化。

密鑰的聲明周期

密鑰生命周期

由于不良設計可能導致的安全問題

生成

生成算法隨機性差,導致密鑰可被預測,或攻擊者可以自己生成密鑰。

分發

密鑰明文分發,導致密鑰存在被攻擊者截獲的風險。

更新

密鑰從不更新,導致攻擊者更容易獲取密鑰,從而能夠輕易獲取敏感數據的明文。

存儲

密鑰明文存儲在數據庫中,導致攻擊者容易讀取出密鑰,從而能夠輕易獲取敏感數據的明文。

備份

如果重要密鑰從不備份,一旦密鑰丟失,將導致原有加密的數據不能解密,大大降低了系統可靠性。

銷毀

密鑰僅被普通刪除,導致攻擊者有可能恢復出密鑰。

密鑰生命周期的安全管理

密鑰的生成

  • 密鑰通常被劃分成對稱密鑰和非對稱密鑰。常用的密鑰生成方式包括:基于安全的隨機數發生器、基于密鑰導出函數、基于標準的密鑰協商機制、基于安全的密鑰生成工具等。利用隨機數發生器、密鑰導出函數、密鑰協商等方式來生成密鑰,均應遵循一些規則,以使產生的密鑰足夠安全

密鑰必須支持可更新,并明確更新的周期

原因

  • 密鑰使用時間越長,攻擊者花費精力去破解它的誘惑也越大,這使得密鑰被破解的風險也越大;
  • 密鑰加密的數據量越多,攻擊者能夠獲取到密文的數據機會也越大,而對被同一個密鑰加密的多個密文進行密碼學分析相對比較容易,導致密鑰越容易被破解;
  • 如果密鑰已經泄露,那么密鑰被使用的時間越久,損失越大。

密鑰的生命周期的結構因素

  • 密文被攻擊者進行密碼分析的可能性
  • 密鑰泄露產生的連鎖危害的嚴重程度
  • 密鑰本身的保護機制(如:訪問控制)的強度
  • 被密鑰保護的敏感數據的重要程度
  • 密鑰因為某些管理原因造成泄露的可能性等

密鑰的更新的兩種方式

  1. 系統定期自動更新密鑰。執行密鑰更新時,系統根據密鑰生成的規則,重新生成新密鑰,同時使用舊密鑰解密已加密的數據,并使用新生成的密鑰重新加密,同時銷毀舊密鑰;對于加密數據量很大的場景,可以考慮保留舊密鑰,用于解密舊密鑰加密的數據,同時使用更新后的密鑰加密新數據。此方式適用于系統可自主生成密鑰的場景。
  2. 管理員手動更新密鑰。管理員根據實際需要,觸發密鑰更新指令,系統接收到更新指令后,根據密鑰生成規則,重新生成密鑰;或者管理員利用安全的密鑰生成工具,重新生成新密鑰。生成新密鑰后,系統利用舊密鑰解密已加密的數據,并使用新密鑰重新加密數據,同時銷毀舊密鑰;對于加密數據量很大的場景,可以考慮保留舊密鑰,用于對舊數據的解密,同時使用更新后的密鑰加密新數據。?

參考鏈接

  • 密鑰安全性討論
  • 網絡安全系列 之 密鑰安全管理

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

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

相關文章

windows安裝 Git Large File Storage大文件下載工具ge

下載地址 導航到 git-lfs.github.com 并單擊Download開始下載git-lfs的用法指南 驗證安裝成功 打開Git Bash驗證安裝成功,使用命令 git lfs install ,如果出現 >Git LFS initlized,就代表安裝成功參考鏈接 安裝 Git Large File Storag…

Java基礎——volatile關鍵字解析

簡介volatile關鍵字雖然從字面上理解起來比較簡單,但是要用好不是一件容易的事情。由于volatile關鍵字是與Java的內存模型有關的,因此在講述volatile關鍵之前,我們先來了解一下與內存模型相關的概念和知識,然后分析了volatile關鍵…

Linux ubuntu對于cmake的版本更新

問題產生 在ubuntu環境下運行C代碼,工程文件中CMakeLists文件顯示要求cmake的版本最低是3.15,但是我的本地版本是3.11,雖然修改CMakelists文件為3.11也是可以編譯通過,但是潛在的問題是未知的。 查看本地cmake的版本 cmake --ve…

Java基礎——Java IO詳解

一、概述 1、Java IO Java IO即Java 輸入輸出系統。不管我們編寫何種應用,都難免和各種輸入輸出相關的媒介打交道,其實和媒介進行IO的過程是十分復雜的,這要考慮的因素特別多,比如我們要考慮和哪種媒介進行IO(文件、控…

Java基礎——Java NIO詳解(二)

一、簡介 在我的上一篇文章Java NIO詳解(一)中介紹了關于標準輸入輸出NIO相關知識, 本篇將重點介紹基于網絡編程NIO(異步IO)。 二、異步IO 異步 I/O 是一種沒有阻塞地讀寫數據的方法。通常,在代碼進行 rea…

Java基礎——Java NIO詳解(一)

一、基本概念 1、I/0簡介 I/O即輸入輸出,是計算機與外界世界的一個借口。IO操作的實際主題是操作系統。在java編程中,一般使用流的方式來處理IO,所有的IO都被視作是單個字節的移動,通過stream對象一次移動一個字節。流IO負責把對象…

MAC上Git安裝與GitHub基本使用

參考鏈接 MAC上Git安裝與GitHub基本使用

Java基礎——深入理解Java線程池

簡介 我們使用線程的時候就去創建一個線程,這樣實現起來非常簡便,但是就會有一個問題: 如果并發的線程數量很多,并且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,…

密碼機項目安裝軟件時候出現的問題以及對應的解決辦法

Could NOT find Boost (missing: locale) (found version "1.65.1") 使用命令 apt-get install libboost-locale-dev 進行安裝 解決普通用戶cmake版本11,而root用戶版本15,clion對于版本兼容的問題 修改clion里面的toolchain,將其…

Java基礎——線程及并發機制

前言 在Java中,線程是一個很關鍵的名詞,也是很高頻使用的一種資源。那么它的概念是什么呢,是如何定義的,用法又有哪些呢?為何說Android里只有一個主線程呢,什么是工作線程呢。線程又存在并發,并…

密碼機 密鑰管理項目安裝配置 從零開始

安裝gcc 更新sudo apt-get update下載gcc sudo apt-get install gcc參考鏈接 不推薦 安裝g 下載g sudo apt-get install g 安裝make sudo apt -get install make參考鏈接 安裝cmake 下載地址參考鏈接 安裝ssh sudo apt-get install ssh 安裝git和配置 sudo apt-get inst…

Androud 如何有效減少重復代碼

前言 重復的代碼一直都是可維護性的大敵,重構的重要任務之一也就是要去除掉重復的代碼,有效的減少重復代碼,可以大大提高軟件的擴展性。 在Android開發中,很容易產生重復的代碼。因為Android是組件,模板式開發&#xf…

解決在sample文件夾里面寫代碼,在測試的時候因為virtual原因,make編譯報錯

代碼的結構 錯誤顯示 解決辦法 添加一句話,具體的cpp依據情況而定set_source_files_properties(${PROJECT_SOURCE_DIR}/src/sample_storage_test.cpp COMPILE_FLAGS "-Wno-unused-parameter")

Android SharedPreferences總結及優化

一、SharedPreferences簡介 Android 中的 SharedPreferences(后續簡稱SP)是輕量級的數據存儲方式,能夠保存簡單的數據類型,比如 String、int、boolean 值等。應用場合主要是數據比較少的配置信息。其內部是以 XML 結構保存在 /dat…

Java基礎——深入理解ReentrantLock

一、簡介在Java中通常實現鎖有兩種方式,一種是synchronized關鍵字,另一種是Lock。二者其實并沒有什么必然聯系,但是各有各的特點,在使用中可以進行取舍的使用。二、ReentrantLock與synchronized的比較相同點: &#xf…

使用開源的openssl的md5頭文件,實現對于文件的md5代碼

需要安裝openssl的庫 sudo apt-get install opensslsudo apt-get install libssl-dev參考鏈接 代碼 #include "openssl/md5.h" #include <iostream> #include <fstream> #include <iomanip>//#define MAX_DATA_BUFF 1024; //#define MD5_LENGTH…

Android 多進程開發

前言正常情況下&#xff0c;一個apk啟動后只會運行在一個進程中&#xff0c;其進程名為AndroidManifest.xml文件中指定的應用包名&#xff0c;所有的基本組件都會在這個進程中運行。但是如果需要將某些組件&#xff08;如Service、Activity等&#xff09;運行在單獨的進程中&am…

clion中鏈接openssl庫

錯誤顯示 前提條件 apt-get install opensslapt-get install openssl-dev 解決辦法 在CMakeLists.txt文件中加入如下命令link_libraries(crypto) 參考鏈接 無法將openssl庫鏈接到CLion C 程序c - 無法將openssl庫鏈接到CLion C程序

Java中String、StringBuffer、StringBuilder三者的區別

一、簡介String、StringBuffer、StringBuilder三個類之間的區別主要是在兩個方面&#xff1a;運行速度和線程安全。二、區別1、運行速度&#xff0c;或者說是執行速度在這方面運行速度快慢為&#xff1a;StringBuilder > StringBuffer > String StringString為字符串常量…