密钥安全性讨论之密钥分层管理结构

密钥分层管理结构

  • 密钥的安全管理通常采用层次化的保护方法。密钥管理分层管理机制将密钥分为三层,即根密钥、密钥加密密钥和工作密钥
  • 下层密钥为上层密钥提供加密保护,采用分层的密钥结构有助于密钥的管理满足本规范的要求

工作密钥

  • 工作密钥对本地保存的敏感数据和需要在不安全信道上传输的数据提供机密性、完整性保护,还可提供认证和签名等密码学服务。工作密钥直接被上层应用程序所使用,包括存储加密使用的密钥、预共享密钥、MAC密钥、签名私钥等

密钥加密密钥

  • 对工作密钥提供机密性保护的密钥,其自身受到根密钥的保护。对于较为简单、安全等级要求不高的密码应用系统,密钥加密密钥的职能可以直接由根密钥兼任

根密钥

  • 位于密钥管理分层结构的最底端,用于对上层密钥(如密钥加密密钥)的机密性进行保护

规则

  • 密钥分层管理至少选择两层结构进行管理
  • 密钥的分层管理机制最少把密钥分为两层,即:根密钥和工作密钥,根密钥为工作密钥提供加密保护。根密钥、工作密钥的生成必须满足密钥生成的相关要求。

密钥分层管理结构

  • 密钥分层管理结构的选择与其应用场景有密切的关系。选择三层结构还是两层结构取决于产品所涉及的加密应用场景的复杂度。应用场景复杂的情况推荐使用三层管理结构。

根密钥更新过程产生大量的加解密运算开销

  • 在应用系统中,如果使用根密钥直接保护工作密钥,根密钥的更新会导致所有受其加密保护的工作密钥需要全部使用更新前的根密钥解密,再重新使用更新后的根密钥加密。当工作密钥数量比较庞大时,对工作密钥的解密和加密操作将耗费大量的资源并影响系统的性能。为解决上述问题,推荐使用三层密钥管理结构,在根密钥和工作密钥之间增加一层密钥加密密钥(KEK),密钥加密密钥对工作密钥进行加密保护,根密钥则对KEK进行加密保护。当根密钥更新时,只需要解密和重新加密KEK即可,由于KEK的数量远远小于工作密钥数量,对KEK的解密和加密操作不会消耗大量资源,对系统的性能影响很小。当KEK更新时,将需要被更新的KEK和被其保护的工作密钥都保存成历史密钥信息。应用系统需要解密被历史密钥信息加密的数据时,直接使用历史密钥解密即可。

系统要求频繁的进行工作密钥更新

  • 在应用系统中,如果工作密钥的更新频率很高,典型的应用场景是工作密钥作为通信密钥(可能要求每次会话都被要求使用不同的密钥)。该场景下的工作密钥更新过程通常在线进行,需要使用工作密钥的下层密钥加密保护工作密钥的传输过程。如果使用根密钥直接保护工作密钥,根密钥加密的密文会频繁的在不安全的信道上传输,并易于被攻击者截获。攻击者可以通过分析大量密文破解根密钥。虽然通过更新根密钥的方法可以有效避免上述对根密钥的攻击,但根密钥更新周期一般较长,且一般使用手动方式更新,无论采用白盒密码还是基于密钥组件的根密钥保护方案,根密钥的更新操作都较为繁琐,难以广泛的适应该应用场景的要求。为解决上述问题,推荐使用三层密钥管理结构,在根密钥和工作密钥之间增加一层密钥加密密钥(KEK),工作密钥的更新过程使用KEK保护,由于KEK的更新频率远远小于工作密钥的更新频率,KEK的更新可以使用根密钥保护。由于KEK更新周期相对较长,即使攻击者可以截获使用根密钥加密的KEK密文,获取的密文数量也非常有限,所以攻击者很难通过分析密文破解出根密钥。

应用系统结构复杂

  • 如果应用系统中包含两个或者两个以上的子系统,各子系统之间的业务相互独立,每个子系统都为用户提供不同的服务。在这样的场景下,各子系统使用的密钥应该各不相同。如果不同的应用系统之间使用的工作密钥都被根密钥保护,根密钥的泄露(根密钥的泄露风险可参考“系统要求频繁的进行密钥更新”场景)将导致各子系统由密码机制保障的安全性完全失效。为解决上述问题,推荐使用三层密钥管理结构,在根密钥和工作密钥之间增加一层密钥加密密钥(KEK),为每个子系统分配各自的KEK,这样即使某一个子系统的KEK泄露,密码安全机制失效的威胁仅也限于该子系统内,不会影响其他子系统的安全性,而且由于KEK更新较为方便,当发生KEK泄露的事故后,可以通过立即更新KEK的方法将信息泄露的损失最小化。

密钥的声明周期

密钥生命周期

由于不良设计可能导致的安全问题

生成

生成算法随机性差,导致密钥可被预测,或攻击者可以自己生成密钥。

分发

密钥明文分发,导致密钥存在被攻击者截获的风险。

更新

密钥从不更新,导致攻击者更容易获取密钥,从而能够轻易获取敏感数据的明文。

存储

密钥明文存储在数据库中,导致攻击者容易读取出密钥,从而能够轻易获取敏感数据的明文。

备份

如果重要密钥从不备份,一旦密钥丢失,将导致原有加密的数据不能解密,大大降低了系统可靠性。

销毁

密钥仅被普通删除,导致攻击者有可能恢复出密钥。

密钥生命周期的安全管理

密钥的生成

  • 密钥通常被划分成对称密钥和非对称密钥。常用的密钥生成方式包括:基于安全的随机数发生器、基于密钥导出函数、基于标准的密钥协商机制、基于安全的密钥生成工具等。利用随机数发生器、密钥导出函数、密钥协商等方式来生成密钥,均应遵循一些规则,以使产生的密钥足够安全

密钥必须支持可更新,并明确更新的周期

原因

  • 密钥使用时间越长,攻击者花费精力去破解它的诱惑也越大,这使得密钥被破解的风险也越大;
  • 密钥加密的数据量越多,攻击者能够获取到密文的数据机会也越大,而对被同一个密钥加密的多个密文进行密码学分析相对比较容易,导致密钥越容易被破解;
  • 如果密钥已经泄露,那么密钥被使用的时间越久,损失越大。

密钥的生命周期的结构因素

  • 密文被攻击者进行密码分析的可能性
  • 密钥泄露产生的连锁危害的严重程度
  • 密钥本身的保护机制(如:访问控制)的强度
  • 被密钥保护的敏感数据的重要程度
  • 密钥因为某些管理原因造成泄露的可能性等

密钥的更新的两种方式

  1. 系统定期自动更新密钥。执行密钥更新时,系统根据密钥生成的规则,重新生成新密钥,同时使用旧密钥解密已加密的数据,并使用新生成的密钥重新加密,同时销毁旧密钥;对于加密数据量很大的场景,可以考虑保留旧密钥,用于解密旧密钥加密的数据,同时使用更新后的密钥加密新数据。此方式适用于系统可自主生成密钥的场景。
  2. 管理员手动更新密钥。管理员根据实际需要,触发密钥更新指令,系统接收到更新指令后,根据密钥生成规则,重新生成密钥;或者管理员利用安全的密钥生成工具,重新生成新密钥。生成新密钥后,系统利用旧密钥解密已加密的数据,并使用新密钥重新加密数据,同时销毁旧密钥;对于加密数据量很大的场景,可以考虑保留旧密钥,用于对旧数据的解密,同时使用更新后的密钥加密新数据。 

参考链接

  • 密钥安全性讨论
  • 网络安全系列 之 密钥安全管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.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为字符串常量…