1

我必须将 AES-GCM 加密数据存储在数据库中。目前我们使用 MariaDB,但可以选择稍后更改为 PostgreSQL。(但也应考虑其他数据库)

既然算法实际上并不加密字符串,而是字节,加密算法的输出也是一个字节[],为什么不将加密后的数据直接存储在二进制列中呢?

对于 MariaDB/MySql 这将是一个BLOB. 我知道 PostgreSQL 甚至有一个用于加密数据的首选特殊数据类型,称为bytea.

然而,大多数程序员似乎将加密字节编码为 Base64,并将生成的字符串存储在VARCHAR.

Base64 的编码和解码对我来说似乎违反直觉。它使数据最多延长 50%,并且每次都是一个额外的步骤。它还强制数据库在存储和检索数据时应用字符编码。这是一个额外的步骤,肯定会花费额外的时间和资源,而我们真正需要存储的只是一些字节。加密数据在任何字符编码中都毫无意义。


问题:

是否有充分的理由支持或反对将加密数据作为二进制存储在数据库中?是否存在安全性、数据完整性或性能方面的原因,我可能不想将加密数据直接存储为二进制文件?

4

1 回答 1

1

(我认为这个问题很快就会被关闭为“基于意见” - 但尽管如此)

是否有充分的理由支持或反对将加密数据作为二进制存储在数据库中

不,我看不出有任何理由反对使用正确的“blob”类型(BLOB, bytea, varbinary(max), ....)

一般的经验法则是:使用与数据匹配的数据类型。所以BLOB(或同等类型)是正确的选择。

使用 base64 编码的字符串可能是合理的,因为并非所有库(像 ORM 之类的混淆层)都能够正确处理“blob”,因此人们选择使用普遍适用的东西(忽略存储和处理的开销)。


请注意,Postgres'bytea不是“加密数据的特殊类型”。它是二进制数据(图像、文档、音乐……)的通用数据类型

于 2020-05-08T11:33:05.087 回答