什么是加密clob的最佳方式?
我使用的是Oracle 9和JDBC,想因为它是插入到数据库到encyrpt一个CLOB。理想情况下,我想能够只是插入明文,并经一个存储过程加密:什么是加密clob的最佳方式?
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感到困惑;我需要关闭它吗?或者我完全偏离轨道?
编辑:混淆的 的目的是为了防止数据琐碎的访问。我的另一个目的是以与我们已经混淆varchar列相同的方式混淆clobs。 oracle示例代码不涉及clobs,这是我的具体问题所在;加密varchars(小于2000个字符)很简单。
我注意到你在Oracle 9,但只是在Oracle 10g中记录的+在DBMS_OBFUSCATION_TOOLKIT有利于DBMS_CRYPTO的被弃用。
dbms_crypto不包括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);
有一个在Oracle文档的例子:
http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96612/d_obtoo2.htm
您不必将其关闭
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('> ');
稍微偏离主题:什么是在加密/混淆点第一名?有权访问数据库的攻击者将能够获取明文 - 查找上述存储过程将使攻击者能够执行解密。
该密钥不应该存储在您的数据库中,但从应用程序传入。 – 2008-09-19 10:45:32
这并没有真正回答这个问题;对于一个它不使用CLOBS,对于两个它不具有与原始函数相同的语义: 函数encrypt(clob中的明文)返回clob - 返回密码文本 – 2008-09-24 14:26:54