加密()和解密()函数
encrypt()和 "decrypt()函数使用提供的密钥对 varchar 或 nvarchar 值进行加密或解密。
加密是转换数据以保持其机密性的过程;只有当接收者拥有所需的密钥时,数据才能被读取(未加密)。 Netezza Performance Server使用对称加密。 这种加密方式也被称为私钥或秘钥加密,因为加密和解密数据使用的是相同的秘钥。 这就意味着,任何服务器在解密先前加密的数据时,都必须提供该秘钥。 您可以选择功能使用哪种对称加密算法对数据进行加密和解密:高级加密标准 (AES) 或RC4。
私钥加密比公钥加密更安全,因为所有公钥加密方案都容易受到暴力密钥搜索攻击。 然而,私钥加密依赖于保持密钥的机密性。 因此,要定期更换私人密钥,并采取措施确保在使用、存储或分发过程中不会被发现。 有关Netezza Performance Server产品特有的安全建议,请参阅本主题稍后部分对 "key参数的描述。
encrypt()和 "decrypt()函数执行字段级加密和解密,而不是数据库加密和解密。
语法
varchar = encrypt(varchar text, varchar key [, int algorithm
[, varchar IV]]);
nvarchar = encrypt(nvarchar text, nvarchar key [, int algorithm
[, varchar IV]]);
varchar = decrypt(varchar text, varchar key [, int algorithm
[, varchar IV]]);
nvarchar = decrypt(nvarchar text, nvarchar key [, int algorithm
[, varchar IV]]);
text值指定要加密或解密的值。
key值指定用于加密或解密值的密钥。 注意确保密钥的安全:否则,安全性就会受到影响。 在设计安全系统时,请牢记Netezza Performance Server系统的架构:- SQL 函数记录在Netezza Performance Server主机上的 "pg.log文件中,因此执行 "encrypt(secret_column, 'my_secret_key')函数时,任何可以读取 "pg.log文件的人都会看到您的密钥。
- 使用任何诊断或黑客工具都能轻松捕获JDBC对话。 如果将密钥作为 SQL 的一部分进行传输,密钥可能会在此过程中泄露。
SELECT decrypt(a.value, b.key) FROM my_table a, my_keys b WHERE
b.key_id = 1;
algorithm值可以是RC4或 AES 的某个版本,如下表所示:- 重大安全事件数量
- RC4. 这是缺省值。
- 1
- AES 128.
- 2
- AES 192.
- 3
- AES 256。
RC4 虽然是最广泛使用的加密算法(例如 SSL 和 WEP 使用的加密算法),但它在密码学上并不安全,很容易受到攻击。
高级加密标准(AES)是美国政府采用的加密标准,是所有机密信息的必备标准。 AES 的三个版本仅在密钥长度的设计和强度上有所不同。 虽然所有三种密钥长度都足以保护最高机密级别的机密信息,但最高机密信息需要使用 192 或 256 密钥长度。
IV值指定用于加密或解密值的初始化向量(IV)。 只有在使用 AES 算法时才能指定 IV。 (RC4算法不使用 IV 值) If you do not specify an IV value, the encrypt() and decrypt() functions use a constant IV value.
输出反馈(OFB)模式加密要求 IV 和密钥都是 128 比特。 最佳做法是为密钥和 IV(如果使用)指定 128 位值,以便系统使用您的输入值。 如果数值小于或大于 128 位,系统会使用扩展或派生机制对数值进行如下调整:
- 对于小于 128 位的密钥或 IV,系统会复制该值,直到密钥或 IV 达到正确的长度。
- 对于大于 128 位的密钥或 IV,系统通过将前 128 位的值与剩余的值进行逻辑 OR(XOR)来创建 128 位的值。
select encrypt(encrypt('abcde', 'k1', 1), 'k1', 1);
encrypt
---------
abcde
(1 row)退货
函数返回加密或解密值。 SQL 扩展工具包使用 AES 的 OFB 模式进行加密和解密,从而使块密码变成同步流密码。 作为一种流密码,OFB 不需要填充,输出密码文的长度与输入明文的长度相同。
示例
select encrypt('123456',100,0);
ENCRYPT
---------
ÉôC¥Ñ
(1 row)
select encrypt('Netezza Systems','NPS001534',1,'MY_IV is IBM001');
ENCRYPT
-----------------
�Ná•▒7Þ¢bhñæ
(1 row)
密钥和 IV 生成
您可以使用 "hash()和 "rawtohex()函数生成密钥和 IV。 hash()函数返回输入数据的 128 位、160 位或 256 位散列,具体取决于函数的输入算法。 下面的示例显示了如何为 AES 加密创建 256 位密钥。 在示例中,通过使用省略号(...)字符有意截断了 MYKEY 输出,以便在页面边界内显示输出。
create table impData (cname varchar(35),cid varchar(20));
CREATE TABLE
insert into impData values('Netezza Systems','CNZ0001SYS');
INSERT 0 1
create table securedImpData as select cid, rawtohex(hash(cid,2))
as mykey, encrypt(cname, rawtohex(hash(cid,2)),2) as ENCRYPTED_CNAME from impData;
INSERT 0 1
select * from securedImpData;
CID | MYKEY | ENCRYPTED_CNAME
------------+-------------------------------------------------+-----------------
CNZ0001SYS | 8D812C9E8DB362FCB20E...6A00B564175B92762B1A3520 | Ã4W§
wÂÃð
ŸÃ
(1 row)
create table decryptedData as select CID, decrypt(ENCRYPTED_CNAME,
MYKEY,2) as DECRYPTED_CNAME from securedImpData;
INSERT 0 1
select * from decryptedData;
CID | DECRYPTED_CNAME
------------+-----------------
CNZ0001SYS | Netezza Systems
(1 row)