透明加密技术

ops/2024/9/24 21:17:02/

透明加密技术,也被称为透明数据加密(Transparent Data Encryption, TDE),是一种加密方法,它允许数据在存储时自动加密和解密,而不需要用户进行任何手动操作。透明加密技术主要应用于数据库、文件系统和磁盘加密,以确保静态数据的安全性。

关键特性

  1. 透明性:对应用程序和用户是透明的,应用程序不需要做任何改变,用户也不需要手动加密或解密数据。

  2. 实时加密和解密:数据在写入存储时自动加密,在读取时自动解密,这一过程是即时的,不会对性能造成明显影响。

  3. 密钥管理:通常使用专门的密钥管理系统(KMS)来管理加密密钥。密钥的安全性对整体系统至关重要。

  4. 数据完整性保护:除了加密,透明加密技术通常还会提供数据完整性保护,防止数据被篡改。

常见应用场景

  • 数据库:许多数据库系统(如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;
}


http://www.ppmy.cn/ops/94687.html

相关文章

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』

解决浏览器书签同步问题&#xff0c;极空间部署开源免费的跨平台书签同步工具『xBrowserSync』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 作为一个喜欢折腾的数码党&#xff0c;我平时上网冲浪使用的浏览器绝不会只限于一种&#xff0c;就比如说我在上班的地方只会用到Edge浏…

C++ 单例模式

什么是单例模式 单例模式是一种设计模式.什么是设计模式呢? 设计模式是一种代码设计经验的总结.单例模式就是其中的一种模式.单例模式用于期望全局中类的实例化只有一个的场景. 如何做到类的实例化是单例的? 我们只要把类的构造函数私有化,在类外部就无法实例化类对象了.…

探索 Java 中的 CompletableFuture:简化异步编程

CompletableFuture 简介 CompletableFuture 是 Java 并发 API 的一部分&#xff0c;代表了异步计算的结果&#xff0c;并且可以对其进行操作和组合。与 Future 接口相比&#xff0c;CompletableFuture 提供了更多的灵活性和控制能力&#xff0c;允许开发者以声明式的方式构建复…

C语言典型例题36

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题3.4 输入一个字符&#xff0c;判别它是否为大写字母&#xff0c;如果是&#xff0c;将它转换为小写字母&#xff1a;如果不是&#xff0c;不转换。然后输出最后要输出的字符。 代码&#xff1a; //《C程序设计…

STM32使用串口DMA发送+空闲中断

/* 使用串口DMA发送空闲中断 注意使能串口中断和DMA中断 考虑发送超时处理机制。 */ void init_Myuart(void){ HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buf, sizeof(rx_buf)); } void myuart_send(uint8_t * send_data,uint16_t lenght) { HAL_UART_Transmit_DMA(&…

a 方法调用 b 方法 2个方法都有事务,且传播特性相同或不同。举例所有排列组合场景,并详细说明

在Java中&#xff0c;事务的传播特性定义了方法调用中事务的行为。常见的传播特性包括&#xff1a; REQUIRED&#xff08;默认&#xff09;&#xff1a;如果当前存在事务&#xff0c;则加入该事务&#xff1b;如果没有事务&#xff0c;则创建一个新的事务。 REQUIRES_NEW&…

掌握系统思维:如何成为项目比赛中的制胜法宝

掌握系统思维&#xff1a;如何成为项目比赛中的制胜法宝 前言系统思维&#xff1a;项目管理的核心竞争力整体大于部分之和系统思维的实践应用涌现性&#xff1a;团队协作的奇迹系统科学的启示结语 前言 在这个快速变化的时代&#xff0c;项目管理不仅仅是关于任务的完成&#x…

在Ubuntu上有什么命令,或者是系统文件能告诉我链接nvme ssd的pcie槽位是不是支持热插拔功能?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…