DBMS_CRYPTO.ENCRYPT_AES128
时间: 2023-11-02 22:07:57 浏览: 41
DBMS_CRYPTO.ENCRYPT_AES128是Oracle数据库中的一个加密函数,用于对数据进行AES128加密。在使用该函数时,需要指定加密类型、填充模式、加密密钥等参数。其中,填充模式和加密密钥的选择对加密结果的安全性有很大的影响。在引用中提供了两个例子,分别展示了使用简单密钥和随机密钥进行加密的过程。使用随机密钥可以提高加密的安全性,避免被猜测到密钥。
相关问题
DBMS_CRYPTO.ENCRYPT
DBMS_CRYPTO.ENCRYPT 是 Oracle 数据库中提供的加密函数之一,用于对数据进行加密。其语法如下:
```sql
DBMS_CRYPTO.ENCRYPT (
src IN RAW,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL
) RETURN RAW;
```
参数说明:
- `src`:要加密的数据,类型为 RAW。
- `typ`:加密算法类型,可以是以下之一:
- `DBMS_CRYPTO.DES_CBC_PKCS5`:使用 DES 算法进行加密。
- `DBMS_CRYPTO.TRIPLE_DES_CBC_PKCS5`:使用 3DES 算法进行加密。
- `DBMS_CRYPTO.AES128_CBC_PKCS5`:使用 AES 128 位算法进行加密。
- `DBMS_CRYPTO.AES192_CBC_PKCS5`:使用 AES 192 位算法进行加密。
- `DBMS_CRYPTO.AES256_CBC_PKCS5`:使用 AES 256 位算法进行加密。
- `key`:加密密钥,类型为 RAW。密钥长度取决于所选的算法类型。
- `iv`:初始化向量,类型为 RAW,用于增强加密的安全性。默认值为 NULL。
函数返回值为加密后的数据,类型为 RAW。
需要注意的是,在使用该函数进行加密之前,需要先将数据转换为 RAW 类型。另外,为了保证加密的安全性,应该使用随机生成的密钥和初始化向量。
declare l_src_data varchar2(20); l_type pls_integer :=DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_encval raw(2000); CURSOR secret_cursor IS select phonenumber from customer; begin OPEN secret_cursor; LOOP FETCH secret_cursor INTO l_src_data; l_encval :=dbms_crypto.encrypt( src=>utl_i18n.string_to_raw(l_src_data,'AL32UTF8'), typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); DBMS_OUTPUT.PUT_LINE (l_encval); EXIT WHEN secret_cursor%NOTFOUND; END LOOP; CLOSE secret_cursor; end; declare ;_src_data row(100) :=hextoraw("190248129038903853275ijdkvjkad'); l_type pls_integer :=dbms_crypto.encrypt_aes128+ + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_decval raw(200); begin l_decval :=dbms_crypto.decrypt( src=>l_src_data, typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); end;改错
有几个错误需要改正:
1. 在第一个代码块中,`raw(2000)` 应该改为 `raw(200)`,因为加密后的数据不会超过 200 个字节。
2. 在第二个代码块中,`row(100)` 应该改为 `raw(100)`,因为需要将十六进制字符串转换为原始二进制数据。
3. 在第一个代码块和第二个代码块中,加密类型 `DBMS_CRYPTO.ENCRYPT_AES128` 应该改为 `DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5`,以保证使用 AES128 算法、CBC 模式和 PKCS5 填充。
4. 在第二个代码块中,`l_src_data` 应该改为 `_src_data`,因为变量名不一致。
修改后的代码如下:
```
declare
l_src_data varchar2(20);
l_type pls_integer := DBMS_CRYPTO.ENCRYPT_AES128
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
l_key varchar2(20) := '0123456789123456';
l_encval raw(200);
CURSOR secret_cursor IS
select phonenumber from customer;
begin
OPEN secret_cursor;
LOOP
FETCH secret_cursor INTO l_src_data;
EXIT WHEN secret_cursor%NOTFOUND;
l_encval := dbms_crypto.encrypt(
src => utl_i18n.string_to_raw(l_src_data, 'AL32UTF8'),
typ => l_type,
key => utl_i18n.string_to_raw(l_key, 'AL32UTF8')
);
DBMS_OUTPUT.PUT_LINE(l_encval);
END LOOP;
CLOSE secret_cursor;
end;
declare
_src_data raw(100) := hextoraw('190248129038903853275ijdkvjkad');
l_type pls_integer := DBMS_CRYPTO.ENCRYPT_AES128
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
l_key varchar2(20) := '0123456789123456';
l_decval raw(200);
begin
l_decval := dbms_crypto.decrypt(
src => _src_data,
typ => l_type,
key => utl_i18n.string_to_raw(l_key, 'AL32UTF8')
);
end;
```