Шифрование строк в SQL (скорее всего ORACLE PL SQL). Цезарь Шифр - PullRequest
0 голосов
/ 26 апреля 2018

Мне нужно что-то вроде Цезаря, чтобы использовать его в моих строковых столбцах для каждого значения в каждом столбце. Следует сделать что-то вроде n + 1 ABcd012Ab -> BCde123Bc

Строковые символы могут быть нулевыми, могут содержать разделители (, - и т. Д.), Они могут быть в верхнем и нижнем регистре (это не имеет значения).

Наконец, он должен быть создан как процедура, и затем эту процедуру следует использовать внутри запроса 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 голосов
/ 26 апреля 2018

Зачем ограничиваться Цезарем Шифром? Вы можете использовать пакет DBMS_CRYPTO, который позволяет использовать стандарт шифрования данных (DES)

Docs

Во-первых, получите разрешение на выполнение этого пакета от администратора баз данных.

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');
0 голосов
/ 26 апреля 2018

Если вы хотите только «зашифровать» буквенно-цифровые символы, вы можете попробовать следующее. Вы не указали, что вы хотели сделать с 9, Z или z, поэтому я просто взял следующий символ 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). Это кажется мне более эффективным, чем проверка каждого символа исходной строки, но я не проверил тест, чтобы быть уверенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...