- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Oracle 9 和 JDBC,并希望在将 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() 但我们只处理 varchars。以下是否有效?
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 列的相同方式混淆 clob。 oracle 示例代码不处理 clobs,这是我的具体问题所在;加密 varchars(小于 2000 个字符)很简单。
最佳答案
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('> ');
关于java - 加密 clob 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/96945/
我正在尝试将作为 StrignBuffer 的 XML 响应保存到方法中。 我需要将此字符串数据作为 CLOB 保存到 Sql 并检索相同的数据。 响应最大3-4Kb,需要再次检索到StringBuf
我目前正在使用 oracle.sql.CLOB 绑定(bind)到 Oracle Clob。 使用有什么好处 java.sql.Clob clob = con.createClob(); 而不是使用创
我想更新一列是CLOB类型,方法如下; public boolean formVeriGuncelleSil(String sql) throws VeritabaniException {
我猜这是一个反复出现的问题,但还没有找到合适的解决方案。基本上,我试图通过 DB2 过程将有点大的 XML,即 32000 多个字符插入到 CLOB 列中。插入失败并显示以下错误看起来 DB2 正在将
我最近升级了一个应用程序以使用 JAVA 7 和 JBoss 7.1.1 运行该应用程序最初是在 JAVA 5 和 Jboss 4.2.2 上开发的。此应用程序使用 hibernate 3 进行持久化
一些背景:数据库是甲骨文。我正在尝试为表格的每一行创建一个分隔字符串。分隔字符串的某些值必须来自 CLOB(包含 XML)。 CLOB 在某些行上可能为空,这就是问题所在。 例如,我有一个表:'Ite
我有一个很大的 CLOB(超过 32kB),我想使用 StringBuilder 将其读取到字符串中。我如何以最有效的方式做到这一点?我不能为 StringBuilder 使用“int length”
我在 Oracle 11GR2 上使用最新版本的 DBUnit (2.4.7)。我正在使用 Java 6 (1.6.0_15) 和最新版本的 Oracle 客户端 jar (jdbc6.jar) 我一
关于这个主题有很多类似的问题,但我找不到任何解决方案,考虑到最终结果对于 varchar2 来说太大。 所以我想要做的是改变这一点: Column1 | Column2 -------- ------
我们正在尝试在 CLOB 字段中应用子字符串函数来修剪前 4000 个字符。我们收到以下错误消息。 下面是我们正在使用的查询: select cast(substr(field_name,1,4000
我有一个字符串“stringData”,我想将其转换为 Clob,你能帮我吗? 我已经尝试过: Clob clob = new SerialClob(stringData.toCharArray())
我对 CLOB 类型的数据对象不熟悉。我正在使用JAVA编程语言来编码。 我的问题是如何将音频文件转换为 CLOB? 我应该将文件转换为字符数组吗?或者还有其他办法吗? 谁能指导我完成此操作的教程吗?
我知道它可以通过使用 SQL 来实现 update activity set REFERENCE = EMPTY_CLOB() where id = ? 但我不能这样做,我不能在 SQL 中硬编码“E
我们正在尝试在 CLOB 字段中应用子字符串函数来修剪前 4000 个字符。我们收到以下错误消息。 下面是我们正在使用的查询: select cast(substr(field_name,1,4000
如何将 Clob 数据转换为 Binarystream ? 到目前为止,我可以通过 2 个步骤找到它,1--> CLOB 到字符串 2---> 字符串到 BinaryStream。 我正在调用一个具有
我有一个超过 5000 个字符的字符串,我想用 MyBatis 将其保存为 XMLTYPE。为此,我执行以下操作: 将字符串转换为 CLOB,CLOB 使用它通过构造函数将其保存在数据库中:XMLTY
当我尝试在 CLOB 列上使用 LAG 函数时遇到问题。 假设我们有一张 table create table test ( id number primary key, not_cl
我有一个具有以下 NLS 设置的数据库 NLS_NCHAR_CHARACTERSET - AL16UTF16 NLS_CHARACTERSET - AL32UTF8 有一个带有 clob 列的表,其
我在一个包含大量 XML 数据的表中有一个 CLOB 列。我需要为表格的一行更新此列的值。我该怎么做? 我试过谷歌搜索,但这种明显简单的东西在任何地方都无法以简单的语言提供。有人可以建议吗? 如果我使
我想知道 Oracle 的 CLOB 必须通过 BLOB 数据类型提供什么。 Both数据存储限制为 (4 GB - 1) * DB_BLOCK_SIZE。 长度超过 4000 字节的文本字符串不能放
我是一名优秀的程序员,十分优秀!