本节中的函数是 Vertica voltagesecure 库的一部分,用于与 Voltage SecureData 集成。这些函数会在安装或升级 Vertica 时自动安装。但是,必须重新安装 voltagesecure 库才能将 CA 证书分发给 Vertica 群集中的所有节点。有关说明,请参阅验证 Vertica 服务器对 SecureData CA 证书的访问权限。
Voltage SecureData 集成函数引用
- 1: VoltageSecureAccess
- 2: VoltageSecureConfigure
- 3: VoltageSecureConfigureGlobal
- 4: VoltageSecureProtect
- 5: VoltageSecureProtectAllKeys
- 6: VoltageSecureRefreshPolicy
1 - VoltageSecureAccess
调用 SecureData 对使用 VoltageSecureProtect 加密的密文进行解密。
语法
VoltageSecureAccess('ciphertext' [, 'tweak'] USING PARAMETERS
format='format_name'
[, mask=is_masked]
[, config_dfs_path='config_file']
[, identity=sd_identity]);
参数
示例
以下示例解密最初使用预定义格式加密的社会安全号码 (SSN)。
=> SELECT VoltageSecureAccess('376-69-6789' USING PARAMETERS format='ssn');
VoltageSecureAccess
---------------------
123-45-6789
(1 row)
此示例演示解密查询中的加密列。
=> SELECT id,
first_name,
last_name,
VoltageSecureAccess(ssn USING PARAMETERS format='ssn',
config_dfs_path='/voltagesecure/conf') AS ssn,
dob
FROM customers
WHERE dob < '1970-1-1'
ORDER BY id ASC
LIMIT 10;
id | first_name | last_name | ssn | dob
------+------------+------------+-------------+------------
5346 | Talon | Wilkins | 540-48-0784 | 1941-09-17
5347 | Daquan | Phelps | 785-34-0092 | 1963-05-08
5348 | Basia | Lopez | 011-85-0705 | 1940-04-29
5349 | Kaseem | Hendrix | 672-57-0309 | 1942-03-11
5350 | Omar | Lott | 825-45-0131 | 1956-02-17
5352 | Illana | Middleton | 831-47-0929 | 1949-12-29
5353 | Garrett | Williamson | 408-73-0207 | 1955-11-06
5354 | Hanna | Ware | 694-97-0394 | 1967-08-08
5355 | Quinn | Pruitt | 818-91-0359 | 1965-11-14
5356 | Clayton | Santiago | 102-56-0010 | 1958-02-02
(10 rows)
以下示例使用预定义的格式解密 Unicode。有关预定义格式的完整列表,请参阅 Voltage SecureData 文档。
=> SELECT VoltageSecureAccess('607-Òdìçç-ぶてぴねら' using parameters format='PREDEFINED::JU_AUTO_TYPE');
VoltageSecureAccess
----------------------
123-Hello-こんにちは
使用原始 FPE 格式解密 SSN 密文并调整值:
=> SELECT VoltageSecureAccess('721-21-2913', 'tweakvalue123' USING PARAMETERS
format='ssn-tweak',
config_dfs_path='voltage.conf');
VoltageSecureProtect
----------------------
681-09-2913
解密使用掩码格式加密的密文。这种格式将隐藏除解密纯文本的最后两个字符以外的所有字符。
=> SELECT VoltageSecureAccess('g3kbx6ru19', USING PARAMETERS
format='maskedFormat',
config_dfs_path='voltage.conf');
VoltageSecureAccess
----------------------
1234567890
=> SELECT VoltageSecureAccess('g3kbx6ru19', USING PARAMETERS
format='maskedFormat',
config_dfs_path='voltage.conf',
mask=true);
VoltageSecureAccess
----------------------
XXXXXXXX90
另请参阅
2 - VoltageSecureConfigure
将 SecureData 用户访问配置参数保存到 Vertica 分布式文件系统 (DFS) 的文件中。然后将文件名传递给其他 SecureData 集成函数。此函数可以将配置文件存储在用户自己的 DFS 目录中,也可以存储在一个全局可访问的名为 /voltagesecure/conf
的文件中。
语法
VoltageSecureConfigure(USING PARAMETERS config_dfs_path='filename'
[, identity=sd_identity]
[, store_password=Boolean]
[, store_shared_secret=Boolean]
[, username=sd_user]
) OVER ();
参数
注意
-
设置的任何 SecureData 会话变量都会覆盖配置文件中的值。有关详细信息,请参阅配置对 SecureData 的访问权限。
- SecureData 集成一次仅支持 SecureData 设备的一个配置。
-
一般情况下,用户无法直接从 DFS 中存储的文件中读取数据。但是,对于所有有权访问从 DFS 读取 UDx 函数的用户而言,均有权从 Vertica 中访问这些文件。
此外,这些文件以纯文本形式存储在每个节点的文件系统中。任何对节点具有适当文件系统访问权限的人员均可读取该文件的内容。
决定是否将密码或共享机密等敏感信息存储在共享的或每个用户的配置文件中时,您均应考虑上述这两个事实。
示例
以下示例演示了如何将配置信息保存到用户自己的 Vertica DFS 目录的 voltage.conf 配置文件中。
=> \x
Expanded display is on.
=> SELECT VoltageSecureConfigure(USING PARAMETERS config_dfs_path='voltage.conf',
username='alice', identity='alice@example.com', store_password=false
) OVER ();
-[ RECORD 1 ]-----+----------------------------------------------------------------
config_dfs_path | voltage.conf
identity | alice@example.com
username | alice
3 - VoltageSecureConfigureGlobal
将所有用户的全局 SecureData 访问配置参数保存到 Vertica 分布式文件系统 (DFS) 中的文件中。此函数将名为 /voltagesecure/conf.global
的配置文件存储在分布式文件系统 (DFS) 中。您必须使用此函数至少配置 SecureData 策略 URL,然后才能使用任何其他 Voltage SecureData 集成函数。
要刷新客户端策略,请参阅 VoltageSecureRefreshPolicy。
语法
VoltageSecureConfigureGlobal(USING PARAMETERS policy_url=url
[, allow_short_fpe=Boolean]
[, allow_file_cache=Boolean]
[, network_timeout=Integer]
) OVER ();
参数
示例
将策略 URL 设置为 https://voltage-pp-0000.example.com/policy/clientPolicy.xml 并将网络超时设置为 200 秒:
=> SELECT VoltageSecureConfigureGlobal(USING PARAMETERS
policy_url='https://voltage-pp-0000.example.com/policy/clientPolicy.xml',
NETWORK_TIMEOUT=200)
OVER ();
policy_url | allow_short_fpe | enable_file_cache | network_timeout
-----------------------------------------------------------------+-----------------+-------------------+-----------------
https://voltage-pp-0000.example.com/policy/clientPolicy.xml | | | 200
(1 row)
查看当前策略:
=> SELECT VoltageSecureConfigureGlobal() OVER();
policy_url | allow_short_fpe | enable_file_cache | network_timeout
-----------------------------------------------------------------+-----------------+-------------------+-----------------
https://voltage-pp-0000.example.com/policy/clientPolicy.xml | | | 200
(1 row)
跨节点手动刷新客户端策略:
=> SELECT VoltageSecureRefreshPolicy() OVER ();
PolicyRefresh
-------------------------------------------------------------------------------------
Successfully refreshed policy on node [v_sandbox_node0001]. Policy on other nodes
will be refreshed the next time a Voltage operation is run on them.
(1 row)
4 - VoltageSecureProtect
调用 SecureData 对值进行加密或 Hash ,与此同时保留原始纯文本的结构。
语法
VoltageSecureProtect('plaintext' [, 'tweak'] USING PARAMETERS
format='format_name'
[, config_dfs_path='config_file']
[, identity=sd_identity]);
参数
示例
使用 ssn
和 auto
FPE 格式加密社会保险号 (SSN) 值(此示例假定已在会话中设置了所有必要的 SecureData 身份验证信息变量):
=> SELECT VoltageSecureProtect('123-45-6789' USING PARAMETERS format='ssn');
VoltageSecureProtect
----------------------
376-69-6789
(1 row)
=> SELECT VoltageSecureProtect('123-45-6789' USING PARAMETERS format='auto');
VoltageSecureProtect
----------------------
820-31-5110
(1 row)
在 COPY 语句中加密两个表列,使用保存在 DFS 中的用户私有配置文件对 SecureData Appliance 进行身份验证:
=> COPY customers (id, first_name, last_name, ssn_raw FILLER VARCHAR(11),
cc_num_raw FILLER VARCHAR(25), cvv, dob,
ssn AS VoltageSecureProtect(ssn_raw USING PARAMETERS
format='ssn',
config_dfs_path='voltage.conf'),
cc_num AS VoltageSecureProtect(cc_num_raw USING PARAMETERS
format='cc',
config_dfs_path='voltage.conf'))
FROM '/home/dbadmin/customer_data.csv' DELIMITER ',';
Rows Loaded
-------------
100
(1 row)
查询加密列中的特定值:
=> 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)
加密 NULL 值返回 NULL:
=> CREATE TABLE nulltable(n VARCHAR (20));
=> INSERT INTO nulltable VALUES (NULL);
=> SELECT VoltageSecureProtect(n USING PARAMETERS format='auto') FROM nulltable;
VoltageSecureProtect
---------------------
(1 row)
使用预定义的格式加密 Unicode 字符串。有关预定义格式的完整列表,请参阅 Voltage SecureData 文档。
=> SELECT VoltageSecureProtect('123-Hello-こんにちは' USING PARAMETERS format='PREDEFINED::JU_AUTO_TYPE');
VoltageSecureProtect
----------------------
607-Òdìçç-ぶてぴねら
使用调整值加密 SSN:
=> SELECT VoltageSecureProtect('681-09-2913', 'tweakvalue123' USING PARAMETERS
format='ssn-tweak');
VoltageSecureProtect
----------------------
721-21-2913
=> SELECT VoltageSecureAccess('721-21-2913', 'tweakvalue123' USING PARAMETERS
format='ssn-tweak');
VoltageSecureProtect
----------------------
681-09-2913
Hash 具有 FPH 格式和调整值的 SSN:
=> SELECT VoltageSecureProtect('681-09-2913', 'tweakvalue123' USING PARAMETERS
format='ssnHash',
config_dfs_path='voltage.conf');
VoltageSecureProtect
----------------------
841-68-2913
另请参阅
5 - VoltageSecureProtectAllKeys
此函数可帮助您定位使用嵌入式格式保留加密 (eFPE) 格式加密的列中的值。这些格式采样密钥轮换,因此您为一段纯文本返回的加密值会不断变化。如果向此函数传递一个未加密的值,它将返回一个包含两列的表:未加密的值以及使用为 eFPE 定义的每个密钥加密的值。表中的行数由 eFPE 格式包含的密钥数决定。通常,您可以在联接中使用此函数的输出来定位表中匹配的加密值。
语法
VoltageSecureProtectAllKeys(value USING PARAMETERS format='eFPE_format'
[, config_dfs_path=config_file]
[, identity=sd_identity] )
参数
示例
以下示例演示了对 VoltageSecureProtectAllKeys 的简单调用。
=> 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 格式定义了 5 个密钥,因此将返回一个包含 5 行的表。
以下示例显示了更常见的用法:查询使用 eFPE 格式加密的表列。
=> 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)
在前面的示例中,customers3 表与 VoltageSecureProtectAllKeys 的输出相联接。如果 customers3 表中加密的 cc_num 列值与 VoltageSecureProtectAllKeys 的受保护列中的值匹配,则该表中的所有行都会出现在输出中。
如果您在非 eFPE 格式下使用此函数,将返回错误:
=> SELECT first_name, last_name, ssn FROM customers u
JOIN (
SELECT VoltageSecureProtectAllKeys('232-28-0657' USING PARAMETERS format='ssn',
config_dfs_path='/voltagesecure/conf')
OVER ()
)
pak ON u.ssn = pak.protected;
ERROR 5861: Error calling processPartition() in User Function VoltageSecureProtectAllKeys
at [ProtectAllKeys.cpp:21], error code: 1711, message: Error getting key numbers:
eFPE format required
另请参阅
6 - VoltageSecureRefreshPolicy
立即刷新启动程序节点上的客户端策略。下次在非启动程序节点上调用 Voltage 函数时,将刷新其上的策略。
语法
VoltageSecureRefreshPolicy()
参数
无
示例
跨节点手动刷新客户端策略:
=> SELECT VoltageSecureRefreshPolicy() OVER ();
PolicyRefresh
-------------------------------------------------------------------------------------
Successfully refreshed policy on node [v_sandbox_node0001]. Policy on other nodes
will be refreshed the next time a Voltage operation is run on them.
(1 row)