查询 eFPE 加密列

您可以使用 Voltage SecureData 中的嵌入格式保留加密功能来加密数据。在 SecureData 设备中定义格式时,可以选择使用 eFPE。此格式与标准 FPE 格式略有不同。此格式使用密钥轮换,并将标识信息嵌入到加密值中。由于这些因素,使用 eFPE 格式调用 VoltageSecureProtect 可能会生成不同的加密值,具体取决于密钥轮换计划和调用方的身份。此功能使查询使用 eFPE 格式加密的列更具挑战性。

如果要搜索标准 FPE 加密列中的某个值,只需使用 VoltageSecureProtect 加密纯文本并在查询中使用输出。例如,假设要在客户表中搜索社会保险号为 559-32-0670 的条目。那么您可以使用以下查询:

=> SELECT id, first_name, last_name FROM customers
       WHERE ssn = VoltageSecureProtect('559-32-0670' USING PARAMETERS
                                        format='ssn',
                                        config_dfs_path='voltage.conf');

  id  | first_name | last_name
------+------------+-----------
 5345 | Thane      | Ross
(1 row)

查询使用 eFPE 格式加密的列并不简单,因为您不知道加密数据所使用的嵌入式密钥。您可以使用 VoltageSecureAccess 函数来解密表列的全部内容并在结果中搜索您需要的值。但是,这样效率过低,因为必须为表中的每一行数据调用 SecureData 函数。

更好的解决方案是使用 VoltageSecureProtectAllKeys 函数。此函数类似于 VoltageSecureProtect。但是,它不是返回单个加密值,而是返回一个包含使用为 eFPE 格式定义的每个密钥加密的值的表。

=> SELECT VoltageSecureProtectAllKeys('376765616314013' USING PARAMETERS
                                      format='cc_num',
                                      config_dfs_path='/voltagesecure/conf')
          OVER ();

      data       |    protected
-----------------+-----------------
 376765616314013 | XMVMRU9RJVU4013
 376765616314013 | X5FD4KO1UEE4013
 376765616314013 | M7ZXTIQVCPB4013
 376765616314013 | UBOSC9K3EXZ4013
 376765616314013 | ZJ1C50C9L9R4013
(5 rows)

在前面的示例中,cc_num 列使用 eFPE 格式进行加密。VoltageSecureProtectAllKeys 输出中显示此 eFPE 格式定义了 5 个密钥。受保护列的内容中包含使用每个密钥加密的相同值。

要在查询 eFPE 列中的值时使用此函数,请在当前搜索的表和 VoltageSecureProtectAllKeys 生成的结果表上使用 JOIN。以下示例演示了如何查询客户表以查找 cc_num 值与未加密信用卡值 376765616314013 匹配的所有行。

=> SELECT id, first_name, last_name FROM customers3 u
          JOIN (SELECT VoltageSecureProtectAllKeys('376765616314013' USING PARAMETERS
                                                   format='cc_num',
                                                   config_dfs_path='/voltagesecure/conf')
          OVER ()) pak
          ON u.cc_num = pak.protected;

  id  | first_name | last_name
------+------------+-----------
 5345 | Thane      | Ross

(1 row)