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

在这篇文章中,我们将介绍可用于加密和解密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中如何工作,同时能够启发你在未来的项目中实施这些安全措施。


http://www.niftyadmin.cn/n/5441841.html

相关文章

TCL管理Vivado工程

文章目录 TCL管理Vivado工程1. 项目目录2. 导出脚本文件3. 修改TCL脚本3.1 project.tcl3.2 bd.tcl 4. 工程恢复 TCL管理Vivado工程 工程结构 1. 项目目录 config: 配置文件、coe文件等。doc: 文档fpga: 最后恢复的fpga工程目录ip: ip文件mcs: bit流文件等,方便直接使用src: .…

2024Python计算机二级9和10

所有的器件中存储器的速度很慢,CPU访问一次内存所花的时间较长,通常用内存中读取一个指令字的最短时间来规定CPU周期,也成为机器周期。 一个正在运行的进程由于所申请的资源得不到满足时,便会从运行状态变迁为等待(阻塞…

websocket 中 request-line 中的URI编码问题

首先,request-line组成如下: Request-Line Method SP Request-URI SP HTTP-Version CRLF 在 rfc6455 规范的 5.1.2 Request-URI 中,有这样的描述: The Request-URI is transmitted in the format specified in section 3.2.1. …

设计模式|工厂模式

文章目录 1. 工厂模式的三种实现2. 简单工厂模式和工厂方法模式示例3. 抽象工厂模式示例4. 工厂模式与多态的关系5. 工程模式与策略模式的关系6. 面试中可能遇到的问题6.1 **工厂模式的概念是什么?**6.2 **工厂模式解决了什么问题?**6.3 **工厂模式的优点…

【力扣刷题日记】597.好友申请I:总体通过率

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 597.好友申请I:总体通过率 表:FriendRequest 列名类型sender_idintsend_to_idintreq…

node.js常用命令及介绍

Node.js常用命令涵盖了从包的安装、管理到项目初始化的各个方面。以下是Node.js的一些常用命令及其详细解释: npm -v:查看npm的版本号。这个命令可以帮助你确认当前安装的npm的版本,以便于后续的操作和问题解决。 npm init:初始化…

linux系统--------------mysql数据库管理

目录 一、SQL语句 1.1SQL语言分类 1.2查看数据库信息 1.3登录到你想登录的库 1.4查看数据库中的表信息 1.5显示数据表的结构(字段) 1.5.1数据表的结构 1.5.2常用的数据类型: 二、关系型数据库的四种语言 2.1DDL:数据定义语言&am…

啥是大语言模型LLM

引言: 在人工智能的世界里,有一种技术正迅速改变我们与机器交流的方式——这就是大语言模型LLM(Large Language Model)。它们像是拥有海量知识库的超级智能,能够理解和生成人类语言。那么,大语言模型LLM到底…