透明加密技术
透明加密技术,也被称为透明数据加密(Transparent Data Encryption, TDE),是一种加密方法,它允许数据在存储时自动加密和解密,而不需要用户进行任何手动操作。透明加密技术主要应用于数据库、文件系统和磁盘加密,以确保静态数据的安全性。
关键特性
-
透明性:对应用程序和用户是透明的,应用程序不需要做任何改变,用户也不需要手动加密或解密数据。
-
实时加密和解密:数据在写入存储时自动加密,在读取时自动解密,这一过程是即时的,不会对性能造成明显影响。
-
密钥管理:通常使用专门的密钥管理系统(KMS)来管理加密密钥。密钥的安全性对整体系统至关重要。
-
数据完整性保护:除了加密,透明加密技术通常还会提供数据完整性保护,防止数据被篡改。
常见应用场景
- 数据库:许多数据库系统(如Oracle、SQL Server、MySQL等)都提供了透明数据加密功能,用于保护存储在数据库中的敏感数据。
- 文件系统:一些操作系统提供透明加密功能,可以保护磁盘上的文件和文件夹。
- 云存储:许多云服务提供商(如AWS、Azure)也采用透明加密技术来保护云端存储的数据。
优点
- 易用性:对用户和应用程序透明,无需对现有系统进行大规模修改。
- 安全性:自动保护静态数据,防止数据泄露。
- 合规性:帮助企业满足数据保护法规的要求,如GDPR、HIPAA等。
潜在挑战
- 密钥管理:密钥的安全存储和管理至关重要,如果密钥泄露,加密的数据也会变得不安全。
- 性能影响:虽然通常性能影响较小,但在高性能应用中,透明加密可能带来一定的性能开销。
透明加密技术通过自动化和透明化的方式提供了强大的数据保护能力,广泛应用于需要保护敏感信息的各种场景中。
一个典型的应用就是企业内部的数据加密。在公司内网里,安装了加密服务的电脑可以正常打开各类文件,但是如果将数据拷贝出来,在另一台没装加密服务的电脑或脱离内网连接的电脑上打开,则文件内容显示均为乱码,可以有效的保障企业数据安全。
接下来简单介绍下原理。
假设我们现在要做一款这样的软件,为了简单,不考虑联网只在本地运行,即运行了加密软件就可以正常读写文件,但这些文件放到别的没有加密软件的电脑则显示乱码。
首先我们得先确定用什么加密算法,由于我们还需要解密还原,所以必须使用可逆的加密算法,这样加密后才能解密还原,常用的AES就可以。
从操作方式上来说,我们希望文件拷贝出去后是加密的乱码,那么常态情况下文件肯定是被加密了的。在安装了加密软件的电脑上可以正常显示,说明在打开的一瞬间,加密软件进行了解密操作。也就是说,在硬盘上的文件都是加密的,但是读到内存中的数据是解密的。
由于用户操作的随机性,必须要有一种监测手段,能够知道用户操作了哪些文件,修改了什么,这样只针对这一个具体的文件做加解密操作,以现代电脑的速度执行起来是很快的,基本可以做到用户无感。
基本确定软件逻辑了,首先软件启动后会监控硬盘路径下的文件操作,如果是文件打开,则执行解密程序使得可以正常显示,当用户进行编辑时,不做任何处理,一旦用户执行保存操作,则执行加密程序将数据写入存储。
所以有个核心功能就是监测文件操作,在Windows下,监控文件的修改还是比较简单的,下面是一段示例代码。
#include <windows.h>
#include <iostream>
#include <string>void MonitorDirectory(const std::wstring& directory) {// 打开目录句柄HANDLE hDir = CreateFile(directory.c_str(), // 目录路径FILE_LIST_DIRECTORY, // 访问权限:监控目录内容FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // 共享模式:允许其他进程读取、写入或删除NULL, // 安全属性OPEN_EXISTING, // 打开已存在的目录FILE_FLAG_BACKUP_SEMANTICS, // 打开目录时需要的标志NULL // 模板文件句柄);if (hDir == INVALID_HANDLE_VALUE) {std::cerr << "Failed to open directory handle. Error: " << GetLastError() << std::endl;return;}char buffer[1024];DWORD bytesReturned;while (true) {// 监听目录的变化if (ReadDirectoryChangesW(hDir, // 目录句柄&buffer, // 缓存区sizeof(buffer), // 缓存区大小TRUE, // 监听子目录FILE_NOTIFY_CHANGE_FILE_NAME | // 监控文件名的变化FILE_NOTIFY_CHANGE_LAST_WRITE, // 监控文件修改&bytesReturned, // 返回的字节数NULL, // 重叠I/ONULL // 完成例程)) {FILE_NOTIFY_INFORMATION* pNotify;int offset = 0;do {pNotify = (FILE_NOTIFY_INFORMATION*)&buffer[offset];std::wstring fileName(pNotify->FileName, pNotify->FileNameLength / sizeof(WCHAR));switch (pNotify->Action) {case FILE_ACTION_ADDED:std::wcout << L"File created: " << fileName << std::endl;break;case FILE_ACTION_REMOVED:std::wcout << L"File deleted: " << fileName << std::endl;break;case FILE_ACTION_MODIFIED:std::wcout << L"File modified: " << fileName << std::endl;break;case FILE_ACTION_RENAMED_OLD_NAME:std::wcout << L"File renamed (old name): " << fileName << std::endl;break;case FILE_ACTION_RENAMED_NEW_NAME:std::wcout << L"File renamed (new name): " << fileName << std::endl;break;default:std::wcout << L"Unknown action." << std::endl;break;}offset += pNotify->NextEntryOffset;} while (pNotify->NextEntryOffset != 0);} else {std::cerr << "Failed to read directory changes. Error: " << GetLastError() << std::endl;break;}}CloseHandle(hDir);
}int main() {// 需要监控的目录路径std::wstring directory = L"C:\\path\\to\\your\\directory";// 调用监控函数MonitorDirectory(directory);return 0;
}
但是这个代码本质上是检测存储变化,针对新建文件,修改文件,重命名等都可以检测到,但是单纯的打开文件并不会有任何通知,因此需要更换方法。
Windows文件系统本身没有提供监控文件打开和关闭操作的方法,因此必须使用更底层的API或驱动程序来实现。常用的两种方式,一种是编写内核过滤驱动的方式,在底层实现监控和拦截。另一种是通过钩子技术,在调用系统API之前执行钩子函数,从而实现监控。其中编写过滤驱动的方式比较复杂,难度较大,如果编的不好还可能导致系统异常。
下面是一个利用钩子技术实现的例程供参考,用到第三方库EasyHook
#include <easyhook.h>
#include <iostream>
#include <Windows.h>// 定义 NtCreateFile 函数的类型
typedef NTSTATUS(WINAPI* NtCreateFile_t)(PHANDLE FileHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PIO_STATUS_BLOCK IoStatusBlock,PLARGE_INTEGER AllocationSize,ULONG FileAttributes,ULONG ShareAccess,ULONG CreateDisposition,ULONG CreateOptions,PVOID EaBuffer,ULONG EaLength
);// 保存原始 NtCreateFile 函数指针
NtCreateFile_t OriginalNtCreateFile = NULL;// 定义我们的钩子函数
NTSTATUS WINAPI HookedNtCreateFile(PHANDLE FileHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PIO_STATUS_BLOCK IoStatusBlock,PLARGE_INTEGER AllocationSize,ULONG FileAttributes,ULONG ShareAccess,ULONG CreateDisposition,ULONG CreateOptions,PVOID EaBuffer,ULONG EaLength
) {std::wcout << L"File is being opened: " << ObjectAttributes->ObjectName->Buffer << std::endl;// 调用原始 NtCreateFile 函数return OriginalNtCreateFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength);
}int main() {// 安装钩子if (LhInstallHook(GetProcAddress(GetModuleHandle(L"ntdll"), "NtCreateFile"),HookedNtCreateFile,NULL,&OriginalNtCreateFile) != 0) {std::cerr << "Failed to install hook." << std::endl;return 1;}// 启用钩子线程ULONG ACLEntries[1] = { 0 };if (LhSetExclusiveACL(ACLEntries, 1, &OriginalNtCreateFile) != 0) {std::cerr << "Failed to enable hook." << std::endl;return 1;}std::cout << "Hook installed, monitoring file open events..." << std::endl;// 进入消息循环while (true) {Sleep(100);}return 0;
}
相关文章:
透明加密技术
透明加密技术,也被称为透明数据加密(Transparent Data Encryption, TDE),是一种加密方法,它允许数据在存储时自动加密和解密,而不需要用户进行任何手动操作。透明加密技术主要应用于数据库、文件系统和磁盘…...
深入理解Faiss:高效向量检索的利器
近年来,随着人工智能和机器学习技术的飞速发展,向量检索技术变得越来越重要。无论是在推荐系统、图像搜索还是自然语言处理等领域,向量检索都扮演着至关重要的角色。而在众多向量检索库中,Faiss(Facebook AI Similarit…...
RK3576 芯片介绍
RK3576 芯片介绍 RK3576瑞芯微第二代8nm高性能AIOT平台,它集成了独立的6TOPS(Tera Operations Per Second,每秒万亿次操作)NPU(神经网络处理单元),用于处理人工智能相关的任务。此外࿰…...
Python模块篇(五)
模块 模块与包模块的导入与使用标准库的常用模块第三方库的安装与使用(如:pip工具) 模块与包 模块是一个包含 Python 代码的文件,通常以 .py 作为扩展名。一个模块可以包含函数、类、变量,以及可执行的代码段。模块的…...
西安旅游系统--论文pf
TOC springboot383西安旅游系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿…...
分享一个思路,使用插桩技术解决慢查询测试问题
前段时间,我负责测试的系统在生产环境运行出现问题。该系统对于响应时间要求较高,问题发生的时候并发很高,出现大量请求超时,超时请求比例随时间推迟越来越高,最后几乎全部请求都失败。滚动重启了所有进程后࿰…...
【STM32项目】在FreeRtos背景下的实战项目的实现过程(二)
个人主页~ 实战项目的实现过程(一)~ 实战项目的实现过程 二、初步了解各个外设硬件1、OLED模块2、GPS模块3、MPU6050模块4、超声测距模块5、温度测控模块6、语音模块7、SIM模块8、按键模块 三、查阅资料1、查看手册2、查找例程 四、研究硬件功能1、OLED…...
javaer快速入门 goweb框架 gin
gin 入门 前置条件 安装环境 配置代理 # 配置 GOPROXY 环境变量,以下三选一# 1. 七牛 CDN go env -w GOPROXYhttps://goproxy.cn,direct# 2. 阿里云 go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy/,direct# 3. 官方 go env -w GOPROXYhttps://goproxy.…...
SQL - 数据类型
字符串类型 char(10),存储固定长度字符串 varchar(255),存储可变长度字符串 mediumtext,中文本,对于存储JSON对象、SCV字符串很好使 longtext,长文本,可以很好地存储教本或许多年地日志文件 tinytext&#…...
进程相关知识
进程和程序的区别 程序 程序是静态的,是存储在硬盘、SSD等存储介质中的一个文件,通常由源代码(如 .c 文件)编译生成的二进制可执行文件(如 a.out)。程序包含了指令和数据,但在未被执行时&#…...
萝卜快跑和端到端的自动驾驶(1)
先看一篇论文 2311.18636 (arxiv.org) 这篇论文里有一个非常好的图 比较了一下模块化任务(级联任务)和端到端自动驾驶的区别 首先什么叫模块化任务(级联) 如上图所示,左边的方块中的子方块,是展示了自动驾驶获取数据的途径,这里包括&…...
通信原理学习笔记
一个手机通话需要经过下面三个网络 类别接入网(Access Network)承载网(Transport Network)核心网(Core Network)定义连接终端用户与电信网络的部分。在接入网和核心网之间传输数据的网络。处理、交换和管理…...
系统编程---day4
1. 链接文件 命令行: ln -s 文件名 softlink 1.1 symlink int symlink(const char *oldpath, const char *newpath); 功能:创建一个链接向oldpath文件的新符号链接文件 参数:oldpath:被链接向的文件的路径 newpath:新符号链接文件 返回值:成功返回0,失败返回…...
01:电容的什么,各类电容的优缺点
1.电容是什么? 电容是由两块不连通的导体,已经中间的不导电材料组成 电容结构: 1.2电容的容量计算公式 C ε s d \displaystyle\frac{εs}{d} dεs 1.3常见电容的种类 1.4各类电容的特点...
Android+Jacoco+code-diff全量、增量覆盖率生成实战
背景 主要是记录下Android项目使用jacoco生成代码覆盖率的实战流程,目前已完成全量覆盖方案,仅使用jacoco就能实现; 由于我们的Android端是使用Java和kotlin语言,目前增量的方案code-diff仅针对Java代码,卡在kotlin文件的分析&am…...
乌龟对对碰在线版
爆肝两天使用vue开发了一个在线版的乌龟对对碰小游戏之幸运对对碰。没有找到合适的乌龟素材,现在使用小兔子代替。 体验地址:幸运对对碰 | 乌龟对对碰小游戏 之前的python版本的乌龟对对碰:写文章-CSDN博客 乌龟对对碰-幸运对对碰...
如何更改select option边框颜色和选中的颜色
<!doctype html> <html> <head> <meta charset"utf-8"> <title>如何更改select option边框颜色和选中的颜色</title> </head><style>ul{border: 1px solid #000000;width: 500px;height: auto;background-color: aq…...
6. 数据结构—串的匹配算法
1.BF算法(暴力算法) //模式匹配(暴力算法) int Index(SString S,SString T){int i1,j1;while(i<S.length&&j<T.length){if(S[i]T[i]){i;j;}else{ii-j2; //最开始匹配的位置的后一个j1; //从头匹配 }}if(j>T.length)return i-T.length;return return 0…...
九大服务架构性能优化方式
来源:九大服务架构性能优化方式 目录 性能优化九大方式: 缓存 使用什么样的缓存 缓存常见问题 缓存淘汰 缓存数据一致性 并行化处理 批量化处理 数据压缩合并 无锁化 顺序写 分片化 避免请求 池化 异步处理 总结 最近做了一些服务性能优…...
【RabbitMQ】 相关概念 + 工作模式
本文将介绍一些MQ中常见的概念,同时也会简单实现一下RabbitMQ的工作流程。 MQ概念 Message Queue消息队列。是用来存储消息的队列,多用于分布式系统之间的通信。 系统间调用通常有:同步通信和异步通信。MQ就是在异步通信的时候使用的。 同…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
