初学者指南 | PostgreSQL中的加密机制如何运作?

本文详细介绍了如何在PostgreSQL中使用不同的加密技术保护数据安全,包括密码加密、特定列加密、数据分区加密、网络传输加密和客户端加密。作者强调了加密在数据保护中的重要性及其在实际应用中的权衡。
摘要由CSDN通过智能技术生成

在这篇文章中,我们将介绍可用于加密和解密PostgreSQL数据库中数据的不同方法。拥有一些 Linux 和 PostgreSQL 经验是必要的,但拥有加密经验并不是必需的,有经验当然更好。本文是使用 Ubuntu 23.04上运行的 PostgreSQL16编写的。首先,我将介绍加密的一些动机及其对数据安全的重要性,然后查看 PostgreSQL为实现加密所提供的函数的子集。
 

#1 背景

虽然我们在日常生活中很少与加密进行交互,但它对于我们的敏感信息(如银行、医疗保健等)的安全至关重要。通常,加密过程会远离终端用户,隐藏所有复杂的数学和算法,让我们只需输入密码,就可以完成所有操作。但是,这些抽象需要权衡,因为我们必须相信解密我们数据的人不会对其进行复制或进行其他恶意行为。在这篇博客中,我们将介绍 PostgreSQL 用于加密数据的不同方法,以及我们在使用它们时遇到的权衡。

#2 加密选项

PostgreSQL文档列出了数据库软件支持的 6 个加密级别。这些级别包括:

>>>密码加密

可能是最简单和最常用的加密形式。在向服务器发送之前,PostgreSQL客户端将对用户密码进行Hashing处理,然后将其存储在数据库中。这意味着明文密码永远不会存储在服务器上,这使得潜在的攻击者很难获取到它。

>>>特定列的加密

pgcrypto 模块提供加密函数,用于加密存储在数据库特定列中的数据。要解密数据,客户端必须通过密钥发送,并且数据在服务器端是未加密的。这意味着密钥和数据都会在服务器端短暂地暴露给具有提升权限的任何人(如数据库管理员)。

>>>数据分区加密

此方法并非特指 PostgreSQL,而是指操作系统在将数据写入磁盘时使用的加密。这意味着 PostgreSQL 服务器具有驱动器级别的加密功能,以阻止任何人通过物理访问服务器来读取数据。

>>>加密网络上的数据

这是指可以配置 PostgreSQL 以在网络上安全地传输数据的不同方法。SSL 和 GSSAPI 都可以通过指定主机及其加密在 pg_hba.conf 文件中进行配置。SSH 也是通过 PostgreSQL 支持的网络进行连接的常用协议。

>>>SSL主机身份验证

对于此级别,客户端和服务器都必须设置为在 SSL/TLS 握手中交换 SSL 证书。一旦启用,此方法可以防止可能的攻击者冒充服务器并获取对受限信息的访问权限,也称为中间人攻击。

>>>客户端加密

最后,也可能是最安全的选择是客户端在将数据发送到服务器之前自行加密数据。这意味着客户端必须在其端点管理所有加密和解密,但也消除了恶意管理员能够读取您的数据的可能性。

#3 加密函数

所有这些函数以及更多功能都记录在 pgcrypto 模块的 PostgreSQL 文档中。

  • General Hashing

Digest 函数:

digest(data text, type text) returns bytea

此函数根据“类型”中指定的加密方法,将存储在变量“data”中的数据转换为字节数组表示的二进制Hashing。

  • data:我们想要计算其二进制Hashing值的输入数据

  • type:要使用的Hashing算法(supported: md5, sha1, sha224, sha256, sha384 and sha512)

  • return:以字节数组形式生成的Hashing值

  • 原始加密

这些函数只是在输入的数据上运行密码,并不提供任何形式的密钥或初始化向量 (IV) 的管理。所有这些管理都应由用户处理,通常不建议在实际使用时使用。

encrypt(data bytea, key bytea, type text) returns bytea
decrypt(data bytea, key bytea, type text) returns bytea

正如我们所看到的,encrypt 和 decrypt 函数都采用相同的参数并返回相同的类型。唯一的区别是 'data' 是 encrypt() 中的明文字节数组,而在 decrypt() 中,'data' 是加密数据的字节数组。

  • data:表示要转换的明文(加密)或加密数据(解密)的字节数组

  • key:用于加密或解密数据的密钥

  • type:要使用的加密算法、模式和填充。这种“类型”与一般的哈希不同,因为我们有更多的选项可以定义。这些选项的格式为 algorithm – mode/pad:padding。例如,使用不带填充的 AES-CBC 加密的解密函数如下所示:

encrypt(data, 'mykey', 'aes-cbc/pad:none')

原始加密还支持另外两个函数形式的 IV:

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 对应函数几乎相同,但包含一个额外的参数,用于定义算法的初始化向量。

#4 总结

在这篇博客中,我们介绍了PostgreSQL 提供的许多功能,用于加密和解密数据库内部和周围的数据。首先,我们谈到了加密的重要性以及我们在使用它时所做的权衡。然后,我们查看了 PostgreSQL 支持的不同加密级别及其在数据库中的功能。最后,我们研究了 PostgreSQL附带的一些加密实现,它们的使用案例以及如何使用它们。总体而言,加密对于我们的在线安全至关重要,并且如果您计划开发任何需要网络连接的内容,那么了解它是非常必要的。我希望这篇博客有助于你深入了解加密以及它在PostgreSQL中如何工作,同时能够启发你在未来的项目中实施这些安全措施。

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值