#PG培训#PG考试#postgresql培训#postgresql考试
介绍
在这篇博客中,我们将介绍在 PostgreSQL 数据库中加密和解密数据的不同方法。具有一些 Linux 和 PostgreSQL 经验是必要的,而加密经验则不是,但最好有。这篇博客是使用在 Ubuntu 23.04 上运行的 PostgreSQL 16 编写的。首先,我将介绍加密的一些动机及其对数据安全的重要性,然后介绍 PostgreSQL 提供的用于实现加密的部分功能。
背景
虽然我们在日常生活中很少与加密打交道,但它对于我们敏感信息(如银行、医疗保健等)的安全至关重要。通常,加密是从最终用户抽象出来的,掩盖了所有复杂的数学和算法,让我们只需输入密码,一切就都正常了。然而,这些抽象是有代价的,因为我们必须相信解密我们数据的人不会复制数据或进行任何其他恶意行为。在这篇博客中,我们将介绍 PostgreSQL 用于加密数据的不同方法以及我们在使用它们时遇到的权衡。
加密选项
Postgres 文档列出了数据库软件支持的 6 种加密级别。这些是:
密码加密
- 这可能是最简单、最常用的加密形式。在将用户密码发送到服务器之前,Postgres客户端会先对其进行哈希处理,然后再将其存储在数据库中。这意味着明文密码永远不会存储在服务器上,这使得攻击者很难获取它。
特定列的加密
- pgcrypto模块提供加密函数,用于加密存储在数据库特定列中的数据。要解密数据,客户端必须发送密钥,而数据在服务器端是解密的。这意味着密钥和数据都会在服务器端短暂地暴露给任何具有较高权限的人(如数据库管理员)。
数据分区加密
- 此方法并非专门针对 PostgreSQL,而是指将数据写入磁盘时使用加密的底层操作系统。这意味着 Postgres Server具有驱动器级加密,以阻止任何人在物理访问服务器时读取数据。
加密网络数据
- 这是指可以配置 PostgreSQL 以安全地跨网络传输数据的不同方法。 SSL 和 GSSAPI 都可以通过指定主机及其加密在pg_hba.conf 文件中配置。 SSH 也是 PostgreSQL 支持的通过网络连接的常用协议。
SSL 主机认证
- 对于此级别,客户端和服务器都必须设置为在 SSL/TLS 握手中交换 SSL证书。一旦成功,此方法可防止潜在攻击者冒充服务器并获取受限制信息的访问权限(也称为中间人攻击)。
客户端加密
- 最后,也可能是最安全的选择是客户端在将数据发送到服务器之前自己加密数据。这意味着客户端必须在其端管理所有加密和解密,但也消除了恶意管理员能够读取您的数据的可能性。
加密函数
所有这些功能及更多功能均记录在 PostgreSQL 文档的pgcrypto模块中。
通用哈希
摘要功能:
sql
digest(data text, type text) returns bytea
此函数根据类型中指定的加密方法将变量"data"中存储的数据转换为以字节数组表示的二进制哈希。
数据:我们要计算二进制哈希的输入数据
类型:要使用的哈希算法(支持:md5、sha1、sha224、sha256、sha384 和 sha512)
返回:结果哈希作为字节数组
原始加密
这些函数只是对输入的数据进行加密,并不提供任何密钥或初始化向量(IV) 的管理。所有这些管理工作都应由用户处理,一般不鼓励在实际使用中采用。
sql
encrypt(data bytea, key bytea, type text) returns bytea
decrypt(data bytea, key bytea, type text) returns bytea
我们可以看到,加密和解密函数都采用相同的参数并返回相同的类型。唯一的区别是,encrypt() 中的"data"是纯文本字节数组,而 decrypt() 中的"data"是加密数据的字节数组。
数据:表示要转换的明文(加密)或加密数据(解密)的字节数组
key:用于加密或解密数据的密钥
类型:要使用的加密算法、模式和填充。此"类型"与一般哈希中的"类型"不同,因为我们有更多选项需要定义。这些选项的形式为algorithm -- mode /pad: padding。例如,使用无填充的 AES-CBC 加密的解密函数如下所示encrypt(data, 'mykey', 'aes-cbc/pad:none')。
原始加密还通过另外两个函数支持 IV:
sql
encrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
decrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
这些函数与非 IV 函数几乎相同,但包含一个额外的参数,用于定义算法的初始化向量。
结论
在本博客中,我们介绍了 PostgreSQL 为数据库内外数据加密和解密提供的许多功能。首先,我们讨论了加密的重要性以及使用加密时需要做出的权衡。然后,我们研究了 Postgres 支持的不同加密级别及其在数据库中的功能。最后,我们研究了 Postgres 附带的几种加密实现、它们的用例以及如何使用它们。总的来说,加密对于我们的在线安全至关重要,如果您计划开发任何需要网络连接的东西,就必须了解加密。我希望本博客能帮助您了解加密及其在 PostgreSQL 中的功能,并激励您在下一个项目中实施这些安全基础知识。