CN114329607A - PostgreSQL数据库中实现WAL日志透明加密和解密的方法 - Google Patents
PostgreSQL数据库中实现WAL日志透明加密和解密的方法 Download PDFInfo
- Publication number
- CN114329607A CN114329607A CN202111675660.6A CN202111675660A CN114329607A CN 114329607 A CN114329607 A CN 114329607A CN 202111675660 A CN202111675660 A CN 202111675660A CN 114329607 A CN114329607 A CN 114329607A
- Authority
- CN
- China
- Prior art keywords
- wal
- data
- decryption
- encryption
- database
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Storage Device Security (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明属于关系型数据库管理及操作系统技术领域,尤其涉及一种PostgreSQL数据库中实现WAL日志透明加密和解密的方法及其用途。本方法克服了PostgreSQL关系型数据库管理系统不支持WAL日志存储加密的缺陷,利用本方法加密后WAL日志数据以密文的方式存储,防止了数据直接暴露,大大降低了WAL日志数据被泄漏和恶意破坏的风险,数据安全得到保障,另外,本方法实施过程中用户对数据库WAL日志的访问是完全无感知的,同时客户端应用也不需要做任何修改就可以直接应用到加密数据库上,因此本方法扩展了PostgreSQL数据库的安全功能,对于数据库安全具有十分重要的意义。
Description
技术领域
本发明属于关系型数据库管理及操作系统技术领域,尤其涉及一种PostgreSQL数据库中实现WAL日志透明加密和解密的方法及其用途。
背景技术
WAL日志(预写日志)是保证数据完整性的一种标准方法。WAL日志的中心概念是数据文件(存储着表和索引)的修改必须在这些动作被日志记录之后才被写入,即在描述这些改变的日志记录被进行永久存储以后。此后,如果发生系统崩溃,可以使用WAL日志来恢复数据库,没有被应用到数据页面的改变可以根据WAL日志记录重做,因此WAL日志也被称为REDO日志(重做日志)。
WAL日志中包含有用户数据相关信息,为了保障用户数据安全,需要将WAL日志以加密的方式进行存储。
然而,目前的PostgreSQL关系型数据库管理系统尚不支持WAL日志存储加密,使得日志数据仍然以明文方式进行存储,数据安全无法得到保障,从而影响了数据库性能的正常发挥。因此,在PostgreSQL数据库中实现WAL日志存储加密具有着重要的现实意义。
发明内容
为了克服PostgreSQL关系型数据库管理系统不支持WAL日志存储加密的缺陷,本发明提供了一种解决方案。本发明人开发出了一种在PostgreSQL数据库中实现WAL日志透明加密和解密的方案,加密后数据以密文的方式存储,防止了数据直接暴露,大大降低了数据被泄漏和恶意破坏的风险,另外,本方案中用户对数据库WAL日志的访问是完全无感知的,同时客户端应用也不需要做任何修改就可以直接应用到加密数据库上。本方案扩展了PostgreSQL数据库的安全功能,对于数据库安全具有十分重要的意义。
具体而言,本发明提供了一种PostgreSQL数据库中实现WAL日志透明加密和解密的方法,本方法采用透明加密方式实现WAL日志的加密和解密,当用户向PostgreSQL数据库中写入数据时,生成的WAL日志数据为明文信息,该部分数据先存储在数据库实例的共享缓冲区中,然后由后台进程写入磁盘,本方法在数据由共享缓冲区写入磁盘的过程中对WAL日志数据进行加密,当数据库处于需要读取WAL日志数据的场景时,则会从磁盘将WAL日志数据读取到共享缓冲区中,在此读取过程中WAL日志数据进行自动解密。
本发明PostgreSQL数据库中实现WAL日志透明加密和解密的方法包括以下步骤:
(一)WAL日志写入加密
(1)生成WAL数据链表;
(2)将WAL数据拷贝到WAL buffer(预写日志共享缓冲区)中;
(3)判断系统是否开启了数据存储加密功能,若已开启,则进入下步加密处理,若未开启,则直接向磁盘写入未加密的数据;
(4)调用加密接口对WAL buffer中的数据进行加密;
(5)向磁盘写入加密后的数据;
(二)WAL日志读取解密
(1)从WAL段文件中读取加密后的WAL日志page页数据;
(2)获取当前处理的WAL日志页的tweak值;
(3)调用解密接口对page页数据进行解密;
(4)解密后的明文数据存储到WAL buffer中。
进一步地,上述方法步骤(一)中第(4)步具体包括下述处理过程:
(1)获取当前处理的WAL日志页的tweak值;
(2)调用AES-128-XTS加密接口以XLOG_BLCKSZ为单位对WAL buffer中的数据进行加密,XLOG_BLCKSZ为默认page页大小,所述page页是WAL数据磁盘IO的单位,其默认的大小为8192kb;
(3)将加密后的page页数据写入WAL段文件中。
为保证数据加密后能正确解密,本方法中使用AES对称加密算法加密WAL日志数据,结合性能和安全性考虑,加密块大小选择为16字节(128bit),加密模式选择XTS模式。
AES-128-XTS加密算法加密时若最后的明文串不足16字节,会从之前经过加密的密文串中“借”一部分,拼凑成16字节后进行加密,因此会导致磁盘上实际写入的密文数据比明文数据大,但不会对数据内容造成任何影响。
进一步地,上述方法中所述加密过程以XLOG_BLCKSZ为单位进行,加密完成后每次写一个page页的数据到磁盘文件中。
进一步地,上述方法步骤(二)中第(3)步调用解密接口对page页数据进行解密通过调用AES-128-XTS解密接口以XLOG_BLCKSZ为单位对page页中的加密数据进行解密,XLOG_BLCKSZ为默认page页大小,所述page页是WAL数据磁盘IO的单位,其默认的大小为8192kb。
优选地,本发明PostgreSQL数据库中实现WAL日志透明加密和解密的方法中步骤(二)WAL日志读取解密用于以下应用场景:
(1)数据库恢复场景
数据库系统异常崩溃后再次启动时,从距离崩溃点最近的检查点(checkpoint)之后读取WAL日志恢复数据,此时调用解密接口以XLOG_BLCKSZ为单位解密从WAL段文件中读取的加密数据,XLOG_BLCKSZ为默认page页大小8192kb;
(2)逻辑复制场景
逻辑复制场景下,主库需要从磁盘读取WAL日志数据,此时调用解密接口以XLOG_BLCKSZ为单位解密从WAL段文件中读取的加密数据,XLOG_BLCKSZ为默认page页大小8192kb;
(3)主备场景
主备场景下,备库从磁盘读取WAL日志数据进行应用,此时调用解密接口以XLOG_BLCKSZ为单位解密从WAL段文件中读取的加密数据,XLOG_BLCKSZ为默认page页大小8192kb。
进一步地,上述PostgreSQL数据库中实现WAL日志透明加密和解密的方法中还包含密钥管理和校验过程,初始化数据库时保存用户密钥,每次数据库启动时校验用户输入的密钥与初始化时输入的是否一致,密钥管理和校验过程包括以下步骤:
(1)数据库初始化时,从环境变量PGENCRYPTIONKEY读取密钥;
(2)读取用户密钥后,利用sha256算法处理用户输入密钥,得到256bit摘要;
(3)将256bit摘要分成两部分,各为16字节,分别作为AES-128-XTS加密算法中的tweak和数据块的密钥,用所得密钥加密16位固定长度的字符串并保存到文件中;其中,tweak信息用来保证即使明文串相同,加密后得到的密文也不同;
(4)数据库启动时,读取用户密钥,用读取的用户密钥加密一段固定内容的字符串,将密文与之前存储的密文进行比较,若不一致则说明密钥错误,数据库停止启动退出。
此外,本发明还涉及上述PostgreSQL数据库中实现WAL日志透明加密和解密的方法在关系型数据库管理或操作系统中的用途。
综上,本发明首次提出了一种PostgreSQL数据库中实现WAL日志透明加密和解密的方法,克服了PostgreSQL关系型数据库管理系统不支持WAL日志存储加密的缺陷,利用本方法加密后数据以密文的方式存储,防止了数据直接暴露,大大降低了数据被泄漏和恶意破坏的风险,数据安全得到保障,另外,本方法实施过程中用户对数据库WAL日志的访问是完全无感知的,同时客户端应用也不需要做任何修改就可以直接应用到加密数据库上,因此本方法扩展了PostgreSQL数据库的安全功能,对于数据库安全具有十分重要的意义。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面对本发明实施例中需要使用的附图作简要介绍,显而易见地,下述附图仅是本发明中记载的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为WAL段文件内部布局示意图。
图2为本发明方法中WAL日志加密流程图。
图3为本发明方法中WAL日志解密流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合具体实施例及相应的附图对本发明的技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例,本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。
同时,应理解,本发明的保护范围并不局限于下述特定的具体实施方案;还应当理解,本发明实施例中使用的术语是为了描述特定的具体实施方案,而不是为了限制本发明的保护范围。
实施例1:一种PostgreSQL数据库中实现WAL日志透明加密和解密的方法,本方法包括以下步骤:
(一)WAL日志写入加密
(1)生成WAL数据链表;
(2)将WAL数据拷贝到WAL buffer(预写日志共享缓冲区)中;
(3)判断系统是否开启了数据存储加密功能,若已开启,则进入下步加密处理,若未开启,则直接向磁盘写入未加密的数据;
(4)调用加密接口对WAL buffer中的数据进行加密;
(a)获取当前处理的WAL日志页的tweak值;
(b)调用AES-128-XTS加密接口以XLOG_BLCKSZ为单位对WAL buffer中的数据进行加密,加密块大小选择为16字节,XLOG_BLCKSZ为默认page页大小8192kb,加密完成后每次写一个page页的数据到磁盘文件中;
(c)将加密后的page页数据写入WAL段文件中;
(5)向磁盘写入加密后的数据。
(二)WAL日志读取解密
(1)从WAL段文件中读取加密后的WAL日志page页数据;
(2)获取当前处理的WAL日志页的tweak值;
(3)调用AES-128-XTS解密接口以XLOG_BLCKSZ为单位对page页中的加密数据进行解密,XLOG_BLCKSZ为默认page页大小8192kb;
(4)解密后的明文数据存储到WAL buffer中。
(三)密钥管理和校验
(1)数据库初始化时,从环境变量PGENCRYPTIONKEY读取密钥;
(2)读取用户密钥后,利用sha256算法处理用户输入密钥,得到256bit摘要;
(3)将256bit摘要分成两部分,各为16字节,分别作为AES-128-XTS加密算法中的tweak和数据块的密钥,用所得密钥加密16位固定长度的字符串并保存到文件中;其中,tweak信息用来保证即使明文串相同,加密后得到的密文也不同;
(4)数据库启动时,读取用户密钥,用读取的用户密钥加密一段固定内容的字符串,将密文与之前存储的密文进行比较,若不一致则说明密钥错误,数据库停止启动退出。
本方法中步骤(二)WAL日志读取解密用于以下应用场景:
(1)数据库恢复场景
数据库系统异常崩溃后再次启动时,从距离崩溃点最近的检查点(checkpoint)之后读取WAL日志恢复数据,此时调用解密接口以XLOG_BLCKSZ为单位解密从WAL段文件中读取的加密数据,XLOG_BLCKSZ为默认page页大小8192kb;
(2)逻辑复制场景
逻辑复制场景下,主库需要从磁盘读取WAL日志数据,此时调用解密接口以XLOG_BLCKSZ为单位解密从WAL段文件中读取的加密数据,XLOG_BLCKSZ为默认page页大小8192kb;
(3)主备场景
主备场景下,备库从磁盘读取WAL日志数据进行应用,此时调用解密接口以XLOG_BLCKSZ为单位解密从WAL段文件中读取的加密数据,XLOG_BLCKSZ为默认page页大小8192kb。
以上所述仅为本发明的实施例而已,并不用于限制本发明。对于本领域技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原理之内所作的任何修改、替换等,均应包含在本发明的权利要求保护范围之内。
Claims (8)
1.一种PostgreSQL数据库中实现WAL日志透明加密和解密的方法,其特征在于,本方法采用透明加密方式实现WAL日志的加密和解密,当用户向PostgreSQL数据库中写入数据时,生成的WAL日志数据为明文信息,该部分数据先存储在数据库实例的共享缓冲区中,然后由后台进程写入磁盘,本方法在数据由共享缓冲区写入磁盘的过程中对WAL日志数据进行加密,当数据库处于需要读取WAL日志数据的场景时,则会从磁盘将WAL日志数据读取到共享缓冲区中,在此读取过程中WAL日志数据进行自动解密。
2.根据权利要求1所述的PostgreSQL数据库中实现WAL日志透明加密和解密的方法,其特征在于,所述方法包括以下步骤:
(一)WAL日志写入加密
(1)生成WAL数据链表;
(2)将WAL数据拷贝到WAL buffer中;
(3)判断系统是否开启了数据存储加密功能,若已开启,则进入下步加密处理,若未开启,则直接向磁盘写入未加密的数据;
(4)调用加密接口对WAL buffer中的数据进行加密;
(5)向磁盘写入加密后的数据;
(二)WAL日志读取解密
(1)从WAL段文件中读取加密后的WAL日志page页数据;
(2)获取当前处理的WAL日志页的tweak值;
(3)调用解密接口对page页数据进行解密;
(4)解密后的明文数据存储到WAL buffer中。
3.根据权利要求2所述的PostgreSQL数据库中实现WAL日志透明加密和解密的方法,其特征在于,步骤(一)中第(4)步具体包括下述处理过程:
(1)获取当前处理的WAL日志页的tweak值;
(2)调用AES-128-XTS加密接口以XLOG_BLCKSZ为单位对WAL buffer中的数据进行加密,XLOG_BLCKSZ为默认page页大小,所述page页是WAL数据磁盘IO的单位,其默认的大小为8192kb;
(3)将加密后的page页数据写入WAL段文件中。
4.根据权利要求3所述的PostgreSQL数据库中实现WAL日志透明加密和解密的方法,其特征在于,所述加密过程以XLOG_BLCKSZ为单位进行,加密完成后每次写一个page页的数据到磁盘文件中。
5.根据权利要求2所述的PostgreSQL数据库中实现WAL日志透明加密和解密的方法,其特征在于,步骤(二)中第(3)步调用解密接口对page页数据进行解密,通过调用AES-128-XTS解密接口以XLOG_BLCKSZ为单位对page页中的加密数据进行解密,XLOG_BLCKSZ为默认page页大小,所述page页是WAL数据磁盘IO的单位,其默认的大小为8192kb。
6.根据权利要求2所述的PostgreSQL数据库中实现WAL日志透明加密和解密的方法,其特征在于,步骤(二)WAL日志读取解密用于以下应用场景:
(1)数据库恢复场景
数据库系统异常崩溃后再次启动时,从距离崩溃点最近的检查点之后读取WAL日志恢复数据,此时调用解密接口以XLOG_BLCKSZ为单位解密从WAL段文件中读取的加密数据,XLOG_BLCKSZ为默认page页大小8192kb;
(2)逻辑复制场景
逻辑复制场景下,主库需要从磁盘读取WAL日志数据,此时调用解密接口以XLOG_BLCKSZ为单位解密从WAL段文件中读取的加密数据,XLOG_BLCKSZ为默认page页大小8192kb;
(3)主备场景
主备场景下,备库从磁盘读取WAL日志数据进行应用,此时调用解密接口以XLOG_BLCKSZ为单位解密从WAL段文件中读取的加密数据,XLOG_BLCKSZ为默认page页大小8192kb。
7.根据权利要求2所述的PostgreSQL数据库中实现WAL日志透明加密和解密的方法,其特征在于,本方法中还包含密钥管理和校验过程,初始化数据库时保存用户密钥,每次数据库启动时校验用户输入的密钥与初始化时输入的是否一致,密钥管理和校验过程包括以下步骤:
(1)数据库初始化时,从环境变量PGENCRYPTIONKEY读取密钥;
(2)读取用户密钥后,利用sha256算法处理用户输入密钥,得到256bit摘要;
(3)将256bit摘要分成两部分,各为16字节,分别作为AES-128-XTS加密算法中的tweak和数据块的密钥,用所得密钥加密16位固定长度的字符串并保存到文件中;
(4)数据库启动时,读取用户密钥,用读取的用户密钥加密一段固定内容的字符串,将密文与之前存储的密文进行比较,若不一致则说明密钥错误,数据库停止启动退出。
8.权利要求1-7任一项所述的PostgreSQL数据库中实现WAL日志透明加密和解密的方法在关系型数据库管理或操作系统中的用途。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111675660.6A CN114329607A (zh) | 2021-12-31 | 2021-12-31 | PostgreSQL数据库中实现WAL日志透明加密和解密的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111675660.6A CN114329607A (zh) | 2021-12-31 | 2021-12-31 | PostgreSQL数据库中实现WAL日志透明加密和解密的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114329607A true CN114329607A (zh) | 2022-04-12 |
Family
ID=81022167
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111675660.6A Pending CN114329607A (zh) | 2021-12-31 | 2021-12-31 | PostgreSQL数据库中实现WAL日志透明加密和解密的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114329607A (zh) |
-
2021
- 2021-12-31 CN CN202111675660.6A patent/CN114329607A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8924739B2 (en) | System and method for in-place encryption | |
US11194920B2 (en) | File system metadata protection | |
US10204235B2 (en) | Content item encryption on mobile devices | |
CN104160407B (zh) | 利用存储控制器总线接口以确保存储设备和主机之间的数据传输安全 | |
AU2012204448A1 (en) | System and method for in-place encryption | |
US20140129848A1 (en) | Method and Apparatus for Writing and Reading Hard Disk Data | |
CN106682521B (zh) | 基于驱动层的文件透明加解密系统及方法 | |
CN111222152B (zh) | 一种数据写入方法、装置、设备及存储介质 | |
CN114611123B (zh) | 一种文件透明加解密方法和系统 | |
WO2024045407A1 (zh) | 虚拟磁盘安全存储方法 | |
US8990589B1 (en) | System and method for robust full-drive encryption | |
US20090282055A1 (en) | Database unload/reload of partitioned tables | |
CN111539042A (zh) | 一种基于核心数据文件可信存储的安全操作方法 | |
CN107861892B (zh) | 一种实现数据处理的方法及终端 | |
CN114329607A (zh) | PostgreSQL数据库中实现WAL日志透明加密和解密的方法 | |
CN116150792A (zh) | 内存数据库的加密方法、数据库系统和电子设备 | |
CN116011041A (zh) | 密钥管理方法、数据保护方法、系统、芯片及计算机设备 | |
WO2016173116A1 (zh) | 访问存储数据的方法及装置 | |
CN115079960B (zh) | 数据的处理方法、加速卡及数据处理系统 | |
CN114239091B (zh) | 基于可信芯片的磁盘加密方法及系统 | |
CN117633838A (zh) | 面向分布式存储的文件数据加密方法及系统 | |
CN114969781A (zh) | 数控系统中实现加工程序自定义加密的方法、装置、处理器及其计算机可读存储介质 | |
CN117220985A (zh) | 一种基于隔离网络的数据加密交互方法及装置 | |
WO2019119304A1 (zh) | 一种数据文件及其访问方法、装置及设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |