在这篇博客中,我们将介绍在 PostgreSQL 数据库中加密和解密数据的不同方法。具有一些 Linux 和 PostgreSQL 经验是必要的,而加密经验则不是,但最好有。这篇博客是使用在 Ubuntu 23.04 上运行的 PostgreSQL 16 编写的。首先,我将介绍加密的一些动机及其对数据安全的重要性,然后介绍 PostgreSQL 提供的用于实现加密的部分功能。
虽然我们在日常生活中很少与加密打交道,但它对于我们敏感信息(如银行、医疗保健等)的安全至关重要。通常,加密是从最终用户抽象出来的,掩盖了所有复杂的数学和算法,让我们只需输入密码,一切就都正常了。然而,这些抽象是有代价的,因为我们必须相信解密我们数据的人不会复制数据或进行任何其他恶意行为。在这篇博客中,我们将介绍 PostgreSQL 用于加密数据的不同方法以及我们在使用它们时遇到的权衡。
Postgres 文档 列出 了数据库软件支持的 6 种加密级别。这些是:
所有这些功能及更多功能均记录在 PostgreSQL 文档的 pgcrypto 模块中。
摘要功能:
digest(data text, type text) returns bytea
此函数根据类型中指定的加密方法将变量“data”中存储的数据转换为以字节数组表示的二进制哈希。
数据:我们要计算二进制哈希的输入数据
类型:要使用的哈希算法(支持:md5、sha1、sha224、sha256、sha384 和 sha512)
返回:结果哈希作为字节数组
这些函数只是对输入的数据进行加密,并不提供任何密钥或 初始化向量 (IV) 的管理。所有这些管理工作都应由用户处理,一般不鼓励在实际使用中采用。
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:
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 中的功能,并激励您在下一个项目中实施这些安全基础知识。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69998444/viewspace-3020855/ ,如需转载,请注明出处,否则将追究法律责任。