Java 加密clob的最佳方法是什么?
我正在使用Oracle9和JDBC,并希望在将clob插入数据库时对其进行加密。理想情况下,我希望能够插入明文并通过存储过程对其进行加密:Java 加密clob的最佳方法是什么?,java,oracle,encryption,jdbc,plsql,Java,Oracle,Encryption,Jdbc,Plsql,我正在使用Oracle9和JDBC,并希望在将clob插入数据库时对其进行加密。理想情况下,我希望能够插入明文并通过存储过程对其进行加密: String SQL = "INSERT INTO table (ID, VALUE) values (?, encrypt(?))"; PreparedStatement ps = connection.prepareStatement(SQL); ps.setInt(id); ps.setString(plaintext); ps.executeUpda
String SQL = "INSERT INTO table (ID, VALUE) values (?, encrypt(?))";
PreparedStatement ps = connection.prepareStatement(SQL);
ps.setInt(id);
ps.setString(plaintext);
ps.executeUpdate();
明文预计不会超过4000个字符,但加密会使文本变长。我们当前的加密方法使用dbms_obfuscation_toolkit.DESEncrypt(),但我们只处理varchar。下面的方法行吗
FUNCTION encrypt(p_clob IN CLOB) RETURN CLOB
IS
encrypted_string CLOB;
v_string CLOB;
BEGIN
dbms_lob.createtemporary(encrypted_string, TRUE);
v_string := p_clob;
dbms_obfuscation_toolkit.DESEncrypt(
input_string => v_string,
key_string => key_string,
encrypted_string => encrypted_string );
RETURN UTL_RAW.CAST_TO_RAW(encrypted_string);
END;
我对暂时的clob感到困惑;我需要把它关上吗?还是我完全偏离了轨道
编辑:
模糊处理的目的是防止对数据的琐碎访问。我的另一个目的是混淆CLOB,就像我们已经混淆varchar列一样。oracle示例代码不处理CLOB,这是我的具体问题所在;加密varchar(小于2000个字符)非常简单。Oracle文档中有一个示例: 您不需要关闭它
DECLARE
input_string VARCHAR2(16) := 'tigertigertigert';
raw_input RAW(128) := UTL_RAW.CAST_TO_RAW(input_string);
key_string VARCHAR2(8) := 'scottsco';
raw_key RAW(128) := UTL_RAW.CAST_TO_RAW(key_string);
encrypted_raw RAW(2048);
encrypted_string VARCHAR2(2048);
decrypted_raw RAW(2048);
decrypted_string VARCHAR2(2048);
error_in_input_buffer_length EXCEPTION;
PRAGMA EXCEPTION_INIT(error_in_input_buffer_length, -28232);
INPUT_BUFFER_LENGTH_ERR_MSG VARCHAR2(100) :=
'*** DES INPUT BUFFER NOT A MULTIPLE OF 8 BYTES - IGNORING
EXCEPTION ***';
double_encrypt_not_permitted EXCEPTION;
PRAGMA EXCEPTION_INIT(double_encrypt_not_permitted, -28233);
DOUBLE_ENCRYPTION_ERR_MSG VARCHAR2(100) :=
'*** CANNOT DOUBLE ENCRYPT DATA - IGNORING EXCEPTION ***';
-- 1. Begin testing raw data encryption and decryption
BEGIN
dbms_output.put_line('> ========= BEGIN TEST RAW DATA =========');
dbms_output.put_line('> Raw input : ' ||
UTL_RAW.CAST_TO_VARCHAR2(raw_input));
BEGIN
dbms_obfuscation_toolkit.DESEncrypt(input => raw_input,
key => raw_key, encrypted_data => encrypted_raw );
dbms_output.put_line('> encrypted hex value : ' ||
rawtohex(encrypted_raw));
dbms_obfuscation_toolkit.DESDecrypt(input => encrypted_raw,
key => raw_key, decrypted_data => decrypted_raw);
dbms_output.put_line('> Decrypted raw output : ' ||
UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw));
dbms_output.put_line('> ');
if UTL_RAW.CAST_TO_VARCHAR2(raw_input) =
UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw) THEN
dbms_output.put_line('> Raw DES Encyption and Decryption successful');
END if;
EXCEPTION
WHEN error_in_input_buffer_length THEN
dbms_output.put_line('> ' || INPUT_BUFFER_LENGTH_ERR_MSG);
END;
dbms_output.put_line('> ');
有点离题:首先加密/模糊处理有什么意义?有权访问您的数据库的攻击者将能够获得明文——找到上述存储过程将使攻击者能够执行解密。我注意到您使用的是Oracle 9,但仅就Oracle 10g+中的记录而言,dbms\u混淆\u工具包被弃用,取而代之的是dbms\u加密 是否包括CLOB支持:
DBMS_CRYPTO.ENCRYPT(
dst IN OUT NOCOPY BLOB,
src IN CLOB CHARACTER SET ANY_CS,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL);
DBMS_CRYPT.DECRYPT(
dst IN OUT NOCOPY CLOB CHARACTER SET ANY_CS,
src IN BLOB,
typ IN PLS_INTEGER,
key IN RAW,
iv IN RAW DEFAULT NULL);
密钥不应存储在数据库中,而是从应用程序传入。我同意这一评论,但原始代码没有将任何密钥传递给加密函数。使用未编写脚本的数据进行备份可能是一个安全问题。无论如何,我同意该文档将在网络上无需脚本传输,但出于这一目的,最好使用https对整个连接进行加密。体面的系统管理员对备份进行加密--您不需要对数据库数据进行加密就可以对数据库备份进行加密。这里的加密目标似乎是防止未经授权访问数据库的用户读取CLOB。这里的目标更多是防止具有授权访问权限的用户意外泄露敏感数据。这并不能真正回答问题;一个是它不使用clob,另一个是它没有与原始函数相同的语义:函数encrypt(clob中的明文)返回clob——返回cypher文本