【发布时间】:2014-02-05 23:11:24
【问题描述】:
我正在用 C (c++) 创建对 postgres 的扩展。它是一种新的数据类型,其行为类似于文本,但由 HSM 设备加密。但是我有问题要使用一个以上的密钥来保护数据。我的想法是获取原始 sql 查询并对其进行处理以选择我应该使用的密钥。但我不知道该怎么做,或者是否有可能?
我的目标是将数据库中的一些现有文本字段更改为加密字段。这就是为什么我不能直接为我的类型提供密钥号的原因。外部应用程序必须将类型视为文本。
通常有 userID 字段,单个查询总是使用该 id 来获取或设置加密数据。基于该字段,我想选择键。 HSM 本身可以拥有数十亿个密钥,这意味着每个用户都可以拥有自己的密钥。如果我需要自己解析字符串,这不是问题,我更有能力做到这一点。性能也不是问题,HSM 太慢了,我只能在一秒钟内编码或解码几个字段。
【问题讨论】:
-
用 C 或 C++ 创建扩展,是哪一个?
-
我正在使用 C++ 进行开发,但 postgres 扩展接口需要使用 C 语言,并且 postgres 还提供了 C 函数与之通信。
-
@Logman 你知道 Pg 使用了基于
longjmp的错误处理,它不适用于 C++ 异常吗?您需要在 Pg 和 C++ 之间的边界处使用extern "C"接口,并在每个边界处捕获 C++ 异常并将它们转换为 PostgreSQL 错误 (ereport)。您也不能从任何需要堆栈展开的地方调用任何可能以ERROR或更高级别调用elog或ereport的PostgreSQL 函数。在实践中,这意味着编写一个不使用libpq并且只公开C接口的 C++ 库,然后是一个包装器 PostgreSQL 类型。 -
简短的回答是肯定的;)。实际上我写了整个扩展,但现在我只使用一个键。
标签: sql c postgresql