加密()和解密()函数

encrypt()和 "decrypt()函数使用提供的密钥对 varchar 或 nvarchar 值进行加密或解密。

加密是转换数据以保持其机密性的过程;只有当接收者拥有所需的密钥时,数据才能被读取(未加密)。 Netezza Performance Server使用对称加密。 这种加密方式也被称为私钥或秘钥加密,因为加密和解密数据使用的是相同的秘钥。 这就意味着,任何服务器在解密先前加密的数据时,都必须提供该秘钥。 您可以选择功能使用哪种对称加密算法对数据进行加密和解密:高级加密标准 (AES) 或RC4。

私钥加密比公钥加密更安全,因为所有公钥加密方案都容易受到暴力密钥搜索攻击。 然而,私钥加密依赖于保持密钥的机密性。 因此,要定期更换私人密钥,并采取措施确保在使用、存储或分发过程中不会被发现。 有关Netezza Performance Server产品特有的安全建议,请参阅本主题稍后部分对 "key参数的描述。

encrypt()和 "decrypt()函数执行字段级加密和解密,而不是数据库加密和解密。

重要:如果使用 "encrypt()函数处理输入的 nvarchar 值,则应将应用程序和查询流程过渡到使用 "encrypt_nvarchar()和 "decrypt_nvarchar()函数。 为了与早期版本和结果兼容,"encrypt()函数仍然保留,但存储 "encrypt('NVARCHAR')函数值的表和视图在加载和生成统计运算时可能会遇到问题。

语法

encrypt()函数的语法如下:
varchar = encrypt(varchar text, varchar key [, int algorithm 
          [, varchar IV]]);
nvarchar = encrypt(nvarchar text, nvarchar key [, int algorithm 
          [, varchar IV]]);
decrypt()函数的语法如下:
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 的一部分进行传输,密钥可能会在此过程中泄露。
因此,应将密钥存储在一个表中,并通过表连接将密钥传递给 "encrypt()和 "decrypt()函数。 示例如下:
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 位的值。
If you embed or call an encrypt() function within an encrypt() function, the result is a cleartext string, as shown in the following example:
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)