Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 数据库管理 » 安全 » 保护数据的安全 » 加密和解密数据库 » 加密数据库的某些部分

 

列加密

如果只想加密数据库中的某些列,可以使用 ENCRYPT 函数来实现。ENCRYPT 函数对传递给它的值进行加密时所用的算法即用于数据库加密的 AES 高度加密算法。

ENCRYPT 函数的密钥区分大小写,即使是在不区分大小写的数据库中也是如此。与大多数口令一样,最好选择无法被轻易猜到的密钥值。建议选择满足以下条件的密钥值:长度至少为 16 个字符,混合使用大小写并包含数字、字母和特殊字符。每次要对数据进行解密时,都必须指定此密钥。

小心

对于高度加密的数据库,请务必将密钥的副本保存在安全的位置。如果丢失了加密密钥,就没有办法访问数据,即使有技术支持人员协助也不行。此时必须放弃该数据库并创建一个新的数据库。

加密的值可以使用 DECRYPT 函数进行解密。必须使用 ENCRYPT 函数中指定的那个密钥。这两个函数都会返回 LONG BINARY 值。如果需要其它数据类型的值,可以使用 CAST 函数将值转换为所需的数据类型。下例介绍如何使用 CAST 函数将解密的值转换为所需的数据类型。请参见CAST 函数 [Data type conversion]

如果数据库用户需要访问解密形式的数据,但您不想让他们访问加密密钥,则可以创建一个使用 DECRYPT 函数的视图。这样用户就可以在不知道加密密钥的情况下访问解密数据。创建使用该表的视图或存储过程时,可以使用 ALTER VIEW 和 ALTER PROCEDURE 语句的 SET HIDDEN 参数来确保用户无法通过查看视图或过程定义访问加密密钥。请参见ALTER PROCEDURE 语句ALTER VIEW 语句

列加密示例

以下示例使用触发器对名为 user_info 的表中存储口令的列进行加密。user_info 表的定义如下:

CREATE TABLE user_info (
   employee_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 employee_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 employee_ID = '1';
另请参见