如果希望只加密部分数据库,则可以使用 ENCRYPT 函数做到这一点。ENCRYPT 函数使用的 AES 高度加密算法与对传递给数据库的值进行加密所用的数据库加密算法相同。
ENCRYPT 函数使用密钥对传递给它的值进行加密。此密钥区分大小写,即使在不区分大小写的数据库中也是如此。与大多数口令一样,最好选择不容易被猜测的密钥值。建议选择满足以下条件的 KEY 值:长度至少为 16 个字符,包含大小写混合以及包含数字、字母和特殊字符。每次要对数据进行解密时,都需要使用此密钥。
| 注意 保护您的密钥。请务必将密钥的副本保存在一个安全的位置。如果丢失了密钥,将导致完全无法访问加密的数据,而加密数据是无法进行恢复的。 |
使用 DECRYPT 函数以及 ENCRYPT 函数中指定的同一密钥可以对已加密的值进行解密。这两个函数都会返回 LONG BINARY 值。如果需要不同的数据类型,则可使用 CAST 函数将值转换为所需的数据类型。下例介绍如何使用 CAST 函数将已解密的值转换为所需的数据类型。
有关 CAST 函数的详细信息,请参见 CAST 函数 [数据类型转换]。
如果数据库用户需要访问解密形式的数据,但不希望他们访问加密密钥,则可以创建使用 DECRYPT 函数的视图。这样允许用户在不知道加密密钥的情况下访问解密数据。如果创建使用该表的视图或存储过程,则可使用 ALTER VIEW 和 ALTER PROCEDURES 的 SET HIDDEN 参数,以确保用户无法访问加密密钥。
有关详细信息,请参见 ALTER PROCEDURE 语句和 ALTER VIEW 语句。
下例使用触发器在 user_info 表中对存储口令的列进行加密。user_info 表的定义方法如下:
CREATE TABLE user_info ( emp_id INTEGER NOT NULL PRIMARY KEY, user_name CHAR(80), user_pwd CHAR(80) )
数据库中添加了两个触发器,以在添加新用户或更新现有用户的口令时,对 user_pwd 列中的值进行加密。
每当在 user_info_table 中添加新行时,都会触发 encrypt_new_user_pwd 触发器:
CREATE TRIGGER encrypt_new_user_pwd
BEFORE INSERT
ON user_info
REFERENCING NEW AS new_pwd
FOR EACH ROW
BEGIN
SET new_pwd.user_pwd=ENCRYPT(new_pwd.user_pwd, '8U3dkA');
END每当在 user_info 表中更新 user_pwd 列时,都会触发 encrypt_updated_pwd 触发器:
CREATE TRIGGER encrypt_updated_pwd
BEFORE UPDATE OF user_pwd
ON user_info
REFERENCING NEW AS new_pwd
FOR EACH ROW
BEGIN
SET new_pwd.user_pwd=ENCRYPT(new_pwd.user_pwd, '8U3dkA');
END向数据库添加新用户:
INSERT INTO user_info VALUES ( '1', 'd_williamson', 'abc123')
如果发布 SELECT 语句查看 user_info 表中的信息,user_pwd 列中的值为二进制数据(口令的加密形式),而不是在 INSERT 语句中指定的值 abc123。
如果更改此用户的口令:
UPDATE user_info SET user_pwd='xyz' WHERE emp_id='1'
就会触发 encrypt_updated_pwd 触发器,且 user_pwd 列中会出现新口令的加密形式。
发布下面的 SQL 语句可以检索初始口令。此语句使用 DECRYPT 函数和加密密钥对数据进行解密,并使用 CAST 函数将值从 LONG BINARY 转换为 CHAR 值:
SELECT CAST (DECRYPT(user_pwd, '8U3dkA') AS CHAR(100)) FROM user_info WHERE emp_id = '1'
有关 ENCRYPT 和函数的详细信息,请参见按字母顺序排列的函数列表。
SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。