加密SQL中的字符串(可能是ORACLE PL SQL)。凯撒密码

时间:2018-04-26 13:26:34

标签: sql oracle encryption plsql

我需要在我的字符串列中使用类似Caesar Cipher的内容来获取每列中的每个值。它应该像n + 1那样: ABcd012Ab - > BCde123Bc

字符串字符可以为null,可以包含sepparators(, - etc.),它们可能是大写和小写(无关紧要)。

最后,它应该作为一个过程创建,然后应该在UPDATE查询中使用此过程。

它可能看起来像这样:

Create procedure text_change(n varchar(1000))
declare @i char
declare @l varchar(100 char)
begin
For each @l in n
For each @i in @l
loop
@i = ????
end loop;
return @l;
end;

UPDATE name_of_table
SET name_of_column = text_change(column)

非常乐意为您提供帮助!

2 个答案:

答案 0 :(得分:1)

如果您只想“加密”字母数字,可以尝试以下方法。您没有使用9Zz指定要完成的操作,因此我只使用了下一个ASCII字符(:[,分别为{

SELECT mycolumn
     , TRANSLATE( mycolumn
                , '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
                , '123456789:BCDEFGHIJKLMNOPQRSTUVWXYZ[bcdefghijklmnopqrstuvwxyz{' )
  FROM mytable;

希望这有帮助。

编辑:我不确定为什么我会继续考虑这个问题,但这是一个使用Oracle TRANSLATE()函数的用户定义函数的通用解决方案。它不包括数字,但我相信这些是一个简单的补充:

CREATE OR REPLACE FUNCTION caesar_cipher
  ( p_source IN VARCHAR2, p_offset IN PLS_INTEGER )
RETURN VARCHAR2
IS
  c_abc CONSTANT VARCHAR2(128) := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  v_offset PLS_INTEGER;
  v_target VARCHAR2(32767);
  v_transl VARCHAR2(128);
BEGIN
  v_offset := MOD( p_offset, LENGTH(c_abc) );
  IF (v_offset < 0) THEN
    v_offset := v_offset + LENGTH(c_abc);
 END IF;
 v_transl := SUBSTR(c_abc, v_offset+1) || SUBSTR(c_abc, 1, v_offset);
 v_target := TRANSLATE( p_source, c_abc || LOWER(c_abc), v_transl || LOWER(v_transl) );

  RETURN v_target;
END;
/

要“解密”,请使用负值而不是正值;也就是说,CAESAR_CIPHER('CDE', -2)CAESAR_CIPHER('ABC', 2)相反。它比检查源字符串的每个字符更有效但我没有运行测试以确定。

答案 1 :(得分:1)

为什么要限制自己使用Caesar Cipher?您可以使用DBMS_CRYPTO包,它允许您使用数据加密标准(DES)

Docs

首先,从DBA获取此包的执行权限。

SQL> GRANT EXECUTE ON DBMS_CRYPTO  TO HR;

Grant succeeded.

然后创建一个这样的函数。

CREATE OR REPLACE FUNCTION my_encrypt(
    p_source VARCHAR2,
    p_key    VARCHAR2 )
  RETURN VARCHAR2
AS
BEGIN
  RETURN UTL_RAW.CAST_TO_VARCHAR2 ( DBMS_CRYPTO.encrypt( UTL_RAW.CAST_TO_RAW (p_source), 
       dbms_crypto.DES_CBC_PKCS5, UTL_RAW.CAST_TO_RAW (p_key) ) );
END;
/

这使用DES_CBC_PKCS5 Block Cipher Suite。

因此,当您运行这样的查询时,您会获得加密数据。

SQL> SELECT my_encrypt('TREASURE UNDER OAK TREE',
  2                'The DBMS_CRYPTO package replaces DBMS_OBFUSCATION_TOOLKIT') AS
  3         encrypted
  4  FROM   dual;


ENCRYPTED
----------------------------
┐↨┐┐♣!┐ o)|┐┐┐┐┐┐┐┐

解密功能

CREATE OR REPLACE FUNCTION my_decrypt ( p_source VARCHAR2, p_key VARCHAR2  )
RETURN VARCHAR2 AS

BEGIN

   RETURN UTL_RAW.CAST_TO_VARCHAR2 ( DBMS_CRYPTO.decrypt( UTL_RAW.CAST_TO_RAW (p_source), dbms_crypto.DES_CBC_PKCS5, UTL_RAW.CAST_TO_RAW (p_key) ) );

END;
/


SQL> SELECT my_decrypt( my_encrypt('TREASURE UNDER OAK TREE',
  2                'The DBMS_CRYPTO package replaces DBMS_OBFUSCATION_TOOLKIT')  ,
  3                'The DBMS_CRYPTO package replaces DBMS_OBFUSCATION_TOOLKIT') AS
  4         decrypted
  5  FROM   dual;

DECRYPTED
---------------------------------
TREASURE UNDER OAK TREE

您还可以使用它来加密和解密表格中的列。

update yourtable set SOMETEXT =
my_encrypt(SOMETEXT,'The DBMS_CRYPTO package replaces DBMS_OBFUSCATION_TOOLKIT');

update yourtable set SOMETEXT = 
my_decrypt(SOMETEXT,'The DBMS_CRYPTO package replaces DBMS_OBFUSCATION_TOOLKIT');