Oracle数据库中的数据加密

news/2024/11/29 23:32:04/

Oracle数据库中的数据加密 / Oracle数据库DES加密

有个需求,需要对某些敏感信息字段进行脱敏,要求在数据库中不能显示明文。如果目的侧重保护数据而非脱敏的话,可以考虑用表空间透明数据加密(TDE),不过现在是需要对字段内容脱敏,则读取和存储都要是加密后的密文数据。

增量数据好说,后台代码实现即可。但存量数据如果也要后台与数据库交互进行加密的话,且不说IO的消耗,就先查再改,无论单条还是分批,在数十、百万的数据量下估计需要很长时间。那就要考虑在数据库里用PL/SQL做存量数据的加密操作。

Oracle中的加密函数

Oracle的PL/SQL包中有提供相关的函数。

PL/SQL包类官方文档(10.2版本):Database PL/SQL Packages and Types Reference - Contents (oracle.com)

版本在10g之前的话,只能使用DBMS_OBFUSCATION_TOOLKIT这个包来加密,这个包只支持DES和3DES算法,且只有CBC模式,还要手动补位;而在10g以及更高的版本中,则能使用DBMS_CRYPTO包,这个包的加密算法更加丰富,DES、3DES、 AES、RC4、3DES_2KEY等算法和CBC、CFB、ECB、OFB模式,也提供补位,使用起来更简单。

DBMS_CRYPTO和DBMS_OBFUSCATION_TOOLKIT的特性对比

Package FeatureDBMS_CRYPTODBMS_OBFUSCATION_TOOLKIT
Cryptographic algorithmsDES, 3DES, AES, RC4, 3DES_2KEYDES, 3DES
Padding formsPKCS5, zeroesnone supported
Block cipher chaining modesCBC, CFB, ECB, OFBCBC
Cryptographic hash algorithmsMD5, SHA-1, MD4MD5
Keyed hash (MAC) algorithmsHMAC_MD5, HMAC_SH1none supported
Cryptographic pseudo-random number generatorRAW, NUMBER, BINARY_INTEGERRAW, VARCHAR2
Database typesRAW, CLOB, BLOBRAW, VARCHAR2

DBMS_OBFUSCATION_TOOLKIT

使用该包的加密函数需要手动实现补位,同时也只有CBC模式。以使用DES加密为例,自定义一个函数实现输入明文字符串,输出DES/CBC/PKCS5加密并Base64编码后的密文字符串。

根据文档提供的函数定义,选用第一种。

DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(input         IN  RAW,key           IN  RAW)RETURN RAW;DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(input_string  IN  VARCHAR2,key_string    IN  VARCHAR2)RETURN VARCHAR2;

因为加密的数据含中文,一个汉字占两个字节,而数字英文占一个字节,VARCHAR2类型直接进行长度判断补位不对,需要转为RAW类型按字节长度判断,所以直接以RAW类型传参。

Oracle中可以使用UTL_I18N.STRING_TO_RAW或UTL_RAW.CAST_TO_RAW来将VARCHAR2类型转为RAW类型。

将明文字符串转成二进制数据类型RAW,然后判断其长度进行PKCS5方式的补位(该补位方法是缺几位就补几位的“几”以满足八的倍数结果,如果一开始已满足,也要加八位的八),密钥也需要转换为RAW格式。DES密钥为64位,即需要8字节的输入,小于8字节会报错,大于的部分会被忽略。

密钥这里我在函数中定义了(应该提出来作为入参,提高安全性)。因为BASE64_ENCODE进行编码的时候,输入的字节数多的话会自动添加换行符,所以做了一个去除处理。

create or replace function encrypt_des(input_str varchar2) return varchar2isenc_str    varchar2(256);pad_length NUMBER(1);pad_byte   RAW(1);raw_input  RAW(512);raw_key    RAW(16);enc_raw    RAW(1024);
beginif input_str is nullthenreturn input_str;elseraw_input := UTL_RAW.CAST_TO_RAW(input_str);-- padding: pad n with n lacking n lengthpad_length := (8 - MOD(UTL_RAW.LENGTH(raw_input), 8));pad_byte := TO_SINGLE_BYTE(pad_length);while pad_length > 0loopraw_input := UTL_RAW.CONCAT(raw_input, pad_byte);pad_length := pad_length - 1;end loop;-- key settingraw_key := UTL_RAW.CAST_TO_RAW('keytests');enc_raw := DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT(input => raw_input, key => raw_key);-- remove line breakenc_str := UTL_RAW.CAST_TO_VARCHAR2(REPLACE(UTL_ENCODE.BASE64_ENCODE(enc_raw), '0D0A', ''));return enc_str;end if;
end;
/

DBMS_CRYPTO

使用此包需要向调用的用户授予权限。

以SYSDBA用户登录后:

$ sqlplus / as sysdba

授予权限:

GRANT EXECUTE ON DBMS_CRYPTO TO USER_NAME;

加密函数语法:

DBMS_CRYPTO.ENCRYPT(src IN RAW,typ IN PLS_INTEGER,key IN RAW,iv  IN RAW          DEFAULT NULL)RETURN RAW;

使用该包的加密函数,就不需要手动补位了,只要选择好想实现加密算法、加密模式和补位的模式即可。因此自定的函数式为输入的字符串做RAW类型的转换并加密和base64编码的实现。

create or replace function crypto_des(input_str varchar2) return varchar2isenc_str  varchar2(256);raw_key  RAW(16);enc_raw  RAW(1024);enc_type PLS_INTEGER := -- total encryption typeDBMS_CRYPTO.ENCRYPT_DES+ DBMS_CRYPTO.CHAIN_CBC+ DBMS_CRYPTO.PAD_PKCS5;
beginif input_str is nullthenreturn input_str;else-- key settingraw_key := UTL_RAW.CAST_TO_RAW('keytests');enc_raw := DBMS_CRYPTO.ENCRYPT(UTL_RAW.CAST_TO_RAW(input_str), enc_type, raw_key);-- remove line breakenc_str := UTL_RAW.CAST_TO_VARCHAR2(REPLACE(UTL_ENCODE.BASE64_ENCODE(enc_raw), '0D0A', ''));return enc_str;end if;
end;
/

也可以直接一条SQL实现:

select UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(DBMS_CRYPTO.ENCRYPT(UTL_RAW.CAST_TO_RAW('测试一下123abc'), 4353, UTL_RAW.CAST_TO_RAW('keytests')))) as test from dual;

4353是DES/CBC/PKCS5加密方式的数字代码。因为PL/SQL中的常量不能直接在SQL中使用,而需要在PL/SQL块中使用,所以把4353换成DBMS_CRYPTO.DES_CBC_PKCS5或是DBMS_CRYPTO.ENCRYPT_DES+ DBMS_CRYPTO.CHAIN_CBC+ DBMS_CRYPTO.PAD_PKCS5的话会报错。

Java中相应的加解密

RFC 822规定中Base64编码后每76个字符需要加一个换行符。一些旧包编码后会带换行符,如sun.mis(效率也不太好)。

JDK1.8可以直接用自带的java.util.Base64包,不会有换行符。

这里示例Base64编码包是commons-codec的,该包编码后不会有换行符。

public static final String KEY = "keytests";public static String encrypt(String inputStr) {if (null != inputStr && !"".equals(inputStr)) {try {DESKeySpec desKey = new DESKeySpec(KEY.getBytes());SecretKey secretKey = SecretKeyFactory.getInstance("DES").generateSecret(desKey);Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(new byte[8]));byte[] encryptedBytes = cipher.doFinal(inputStr.getBytes());return Base64.encodeBase64String(encryptedBytes);} catch (Exception e) {e.printStackTrace();}}return inputStr;
}
public static String decrypt(String encryptedStr){if (null != encryptedStr && !"".equals(encryptedStr)) {try {// encryptStr = encryptStr.replace("\r\n","");DESKeySpec desKey = new DESKeySpec(KEY.getBytes());SecretKey secretKey = SecretKeyFactory.getInstance("DES").generateSecret(desKey);Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(new byte[8]));byte[] decryptBytes = cipher.doFinal(Base64.decodeBase64(encryptedStr));return new String(decryptBytes);} catch (Exception e) {e.printStackTrace();}}return encryptedStr;
}

http://www.ppmy.cn/news/466560.html

相关文章

.NET(C#)常用数据加密和解密方法汇总

欢迎加入Unity业内qq交流群:956187480 qq扫描二维码加群 一、数据加密的概念 1、 基本概念 2、 基本功能 3、 加密形式 二、 数据加密的项目应用和学习 1、 媒体加密:DRM 2、 文件加密:文本加密、pdf、word 3、 数据加密&…

Web常见数据加密方式

MD5加密 6位和32位,加密密文字符串由A-Z,0-9随机分配,80%网站管理员或用户密码加采取MD5加密。(不可逆) SHA加密 由A-Z,0-9随机组合,SHA1,SHA256,SHA384,SHA512长度固定。(不可逆)。对于任意长度的消息,SHA256都会产…

数据传输过程加密方案

文章目录 前言数据加密方案数据加密细节AES加解密 RSA公钥加密总结 前言 从前一篇网络安全基础要点知识介绍中可以知道,在网络通信中,通信传输数据容易被截取或篡改,如果在传输用户隐私数据过程中,被不法分子截取或篡改&#xff…

数据加密标准(DES)概念及工作原理

0x01 数据加密标准DES介绍 数据加密标准(Data Encryption Standard)(DES)是一种用于加密数字数据的对称密钥算法。密钥长度为56位,安全性不强,但它在密码学的进步中具有很大的影响力。 0x02 数据加密标准历…

数据库数据加密及其他安全性保护

数据加密 数据加密 防止数据库中数据在存储和传输中失密的有效手段 加密的基本思想 根据一定的算法将原始数据—明文(Plain text)变换为不可直接识别的格式—密文(Cipher text) 加密方法 存储加密 传输加密 存储加密 透明…

PostgreSQL 数据加密之 pgcrypto

文章目录 pgcrypto 简介pgcrypto 安装单向加密通用哈希函数密码哈希函数 双向加密PGP 加密函数PGP 函数选项原始加密函数 随机数据函数其他事项pgcrypto 配置NULL 处理安全限制 大家好,我是只谈技术不剪发的 Tony 老师。 根据信息安全的相关要求,用户的…

漫谈数据保护和个人信息加密

相信诸位同学最近收到了不少大厂的Privacy Update类似的消息吧,没错,前两天,也就是25日,欧盟的《一般数据保护条例》(GDPR)正式生效。大厂们纷纷赶在生效日到来之前,匆匆更新了自己Privacy条例。很明显,GDP…

接口数据传输加密

数据加密 场景:我们客户端请求服务端时数据正常都是明文传输,这样的话容易出现数据安全漏洞 例子:登录注册时传输的密码,还是用户个人敏感信息,都是明文传输的话就太不安全了 解决:所以我们在客户端传输…