dbms_crypto函数包的简单介绍[@more@]
dbms_crypto是系统函数包,创建在sys用户下。提供了加密、解密数据的接口,支持多种行业标准的加密与哈希算法,包括AES(the Advanced Encryption Standard)对称密码新标准,该标准由NIST(the National Institute of Standards and Technology )美国国家标准技术研究所提供,替代DES(the Data Encryption Standard)数据加密标准。
dbms_crypto函数包可以对oracle的通用数据类型进行加密和解密,包括RAW、LOB,比如图像、声音等,同样也支持BLOB、CLOB。另外,提供了全球化支持,得以在不同字符集的数据库之间进行数据加密与解密工作。
支持以下加密算法:
Data Encryption Standard (DES), Triple DES (3DES, 2-key and 3-key)
Advanced Encryption Standard (AES)
MD5, MD4, and SHA-1 cryptographic hashes
MD5 and SHA-1 Message Authentication Code (MAC)
函数包也提供Block cipher modifiers(分组密码编辑器)。
限制:
varchar2的数据类型不被直接支持。必须将其转换成AL32UTF8统一的字符集形式,然后将其转换成RAW的数据类型之后才可以。
包里包含名为ENCRYPT和DECRYPT的过程和函数。过程用来操作LOB数据类型,与之对比,函数则用来操作RAW数据。
包里包含两类单向哈希函数:HASH和MAC。HASH函数可以将一个变长的数据计算出一个定长的哈希值,支持RAW类型和LOB类型。但不能通过一个特定的哈希值,计算出与之对应的原数据。hash值至少为128bit。
MAC函数也是单向哈希函数,但多一个安全key的附加条件。和HASH函数的用法一样。但如果需要安全key对哈希值进行校验,只能用MAC函数。
MAC可以用来在不同的用户之间对文件进行鉴定认证。也可以在单用户情况下用来判断文件是否被修改过,也许就是病毒干的。用户将文件通过MAC计算出来的值存在某个表里。如果用户没有用MAC进行校验,病毒有可能修改文件之后生成一个新的哈希值,替换掉原表里的记录。如果使用了MAC的安全key,就不可能出现正常情况,因为病毒不知道这个key是什么。
为了安全起见,加密和解密操作最好在服务端进行,确保安全key的安全生成和安全维护。如果安全key需要通过客户端和服务端之间的连接传送,网络连接必须要通过网络加密来保证安全。尽管DBMS_CRYPTO不能直接生成key,但提供了工具帮助key的生成。比如,可以为key通过RANDOMBYTES函数生成随机
数据。
数据转换
以下两个例子实现字符和RAW类型的转换:
字符转RAW:UTL_I18N.STRING_TO_RAW (string, 'AL32UTF8');
RAW转字符:UTL_I18N.RAW_TO_CHAR (data, 'AL32UTF8');
SQL> select UTL_I18N.STRING_TO_RAW ('Aaa', 'AL32UTF8') test from dual;
TEST
-------------------------------------------------------------------------------
416161
SQL> select UTL_I18N.RAW_TO_CHAR ('416161', 'AL32UTF8') test from dual;
TEST
-------------------------------------------------------------------------------
Aaa
函数包包含以下过程和函数:
函数DECRYPT:Decrypts RAW data using a stream or block cipher with a user supplied key and optional IV (initialization vector)
过程DECRYPT:Decrypts LOB data using a stream or block cipher with a user supplied key and optional IV
函数ENCRYPT:Encrypts RAW data using a stream or block cipher with a user supplied key and optional IV
过程ENCRYPT:Encrypts LOB data using a stream or block cipher with a user supplied key and optional IV
函数HASH:Applies one of the supported cryptographic hash algorithms (MD4, MD5, or SHA-1) to data
函数MAC:Applies Message Authentication Code algorithms (MD5 or SHA-1) to data to provide keyed message protection
函数RANDOMBYTES:Returns a RAW value containing a cryptographically secure pseudo-random sequence of bytes, and can be used to generate random material for encryption keys
函数RANDOMINTEGER:Returns a random BINARY_INTEGER
函数RANDOMNUMBER:Returns a random 128-bit integer of the NUMBER datatype
语法说明:
FUNCTION DBMS_CRYPTO.DECRYPT(
src IN RAW, --RAW data to be decrypted
typ IN PLS_INTEGER, --Stream or block cipher type and modifiers to be used.
key IN RAW, --Key to be used for decryption
iv IN RAW DEFAULT NULL --Optional initialization vector for block ciphers. Default is NULL
) RETURN RAW;
PROCEDURE DBMS_CRYPTO.DECRYPT(
dst IN OUT NOCOPY BLOB|(CLOB CHARACTER SET ANY_CS), --LOB locator of output data. The value in the output LOB will be overwritten
src IN BLOB, --LOB locator of input data
typ IN PLS_INTEGER, --Stream or block cipher type and modifiers to be used.
key IN RAW, --Key to be used for decryption
iv IN RAW DEFAULT NULL --Optional initialization vector for block ciphers. Default is all zeroes
);
FUNCTION DBMS_CRYPTO.ENCRYPT(
src IN RAW, --RAW data to be encrypted
typ IN PLS_INTEGER, --Stream or block cipher type and modifiers to be used
key IN RAW, --Encryption key to be used for encrypting data
iv IN RAW DEFAULT NULL --Optional initialization vector for block ciphers. Default is NULL
) RETURN RAW;
PROCEDURE CRYPTO.ENCRYPT(
dst IN OUT NOCOPY BLOB, --LOB locator of output data. The value in the output LOB will be overwritten
src IN BLOB|(CLOB CHARACTER SET ANY_CS), --LOB locator of input data
typ IN PLS_INTEGER, --Stream or block cipher type and modifiers to be used
key IN RAW, --Encryption key to be used for encrypting data
iv IN RAW DEFAULT NULL --Optional initialization vector for block ciphers. Default is NULL
);
FUNCTION DBMS_CRYPTO.Hash (
src IN RAW|BLOB|(CLOB CHARACTER SET ANY_CS), --The source data to be hashed
typ IN PLS_INTEGER --The hash algorithm to be used
) RETURN RAW;
FUNCTION DBMS_CRYPTO.MAC (
src IN RAW|BLOB|(CLOB CHARACTER SET ANY_CS), --The source data to be hashed
typ IN PLS_INTEGER, --The hash algorithm to be used
key IN RAW --Key to be used for MAC algorithm
) RETURN RAW;
FUNCTION DBMS_CRYPTO.RANDOMBYTES (
number_bytes IN POSITIVE --The number of pseudo-random bytes to be generated
) RETURN RAW;
FUNTION DBMS_CRYPTO.RANDOMINTEGER
RETURN BINARY_INTEGER;
FUNCTION DBMS_CRYPTO.RANDOMNUMBER
RETURN NUMBER;
以下是用sha-1算法进行哈希值计算的实例,'Aaa'算出来的值是'F782740F6340DB75FD2AF699D8470AF3CCAA9068':
declare
n varchar2(3000);
begin
select dbms_crypto.Hash(UTL_I18N.STRING_TO_RAW('Aaa', 'AL32UTF8'),
dbms_crypto.HASH_SH1)
into n
from dual;
dbms_output.put_line(n);
end;